f903fbd65bd36bec328bf75cfc3886a8a7dbea68
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / mt5931 / 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  * 04 20 2012 cp.wu
17  * [WCXRP00000913] [MT6620 Wi-Fi] create repository of source code dedicated for MT6620 E6 ASIC
18  * correct macro
19  *
20  * 01 16 2012 cp.wu
21  * [MT6620 Wi-Fi][Driver] API and behavior modification for preferred band configuration with corresponding network configuration 
22  * add wlanSetPreferBandByNetwork() for glue layer to invoke for setting preferred band configuration corresponding to network type.
23  *
24  * 11 24 2011 wh.su
25  * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
26  * Adjust code for DBG and CONFIG_XLOG.
27  *
28  * 11 22 2011 cp.wu
29  * [WCXRP00001120] [MT6620 Wi-Fi][Driver] Modify roaming to AIS state transition from synchronous to asynchronous approach to avoid incomplete state termination
30  * 1. change RDD related compile option brace position.
31  * 2. when roaming is triggered, ask AIS to transit immediately only when AIS is in Normal TR state without join timeout timer ticking
32  * 3. otherwise, insert AIS_REQUEST into pending request queue
33  *
34  * 11 11 2011 wh.su
35  * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
36  * modify the xlog related code.
37  *
38  * 11 04 2011 cp.wu
39  * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
40  * correct reference to BSSID field in Association-Response frame.
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  * 1. for DEAUTH/DISASSOC cases, indicate for DISCONNECTION immediately.
45  * 2. (Android only) when reassociation-and-non-roaming cases happened, indicate an extra DISCONNECT indication to Android Wi-Fi framework
46  *
47  * 11 02 2011 wh.su
48  * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
49  * adding the code for XLOG.
50  *
51  * 10 26 2011 tsaiyuan.hsu
52  * [WCXRP00001064] [MT6620 Wi-Fi][DRV]] add code with roaming awareness when disconnecting AIS network
53  * be aware roaming when disconnecting AIS network.
54  *
55  * 10 25 2011 cm.chang
56  * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
57  * STA_REC shall be NULL for Beacon's MSDU
58  *
59  * 10 13 2011 cp.wu
60  * [MT6620 Wi-Fi][Driver] Reduce join failure count limit to 2 for faster re-join for other BSS
61  * 1. short join failure count limit to 2
62  * 2. treat join timeout as kind of join failure as well
63  *
64  * 10 12 2011 wh.su
65  * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
66  * adding the 802.11w related function and define .
67  *
68  * 09 30 2011 cm.chang
69  * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band
70  * .
71  *
72  * 09 20 2011 tsaiyuan.hsu
73  * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
74  * change window registry of driver for roaming.
75  *
76  * 09 20 2011 cm.chang
77  * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
78  * Handle client mode about preamble type and slot time
79  *
80  * 09 08 2011 tsaiyuan.hsu
81  * [WCXRP00000972] [MT6620 Wi-Fi][DRV]] check if roaming occurs after join failure to avoid state incosistence.
82  * check if roaming occurs after join failure to avoid deactivation of network.
83  *
84  * 08 24 2011 chinghwa.yu
85  * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
86  * Update RDD test mode cases.
87  *
88  * 08 16 2011 tsaiyuan.hsu
89  * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
90  * EnableRoaming in registry is deprecated.
91  *
92  * 08 16 2011 tsaiyuan.hsu
93  * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
94  * use registry to enable or disable roaming.
95  *
96  * 07 07 2011 cp.wu
97  * [WCXRP00000840] [MT6620 Wi-Fi][Driver][AIS] Stop timer for joining when channel is released due to join failure count exceeding limit
98  * stop timer when joining operation is failed due to try count exceeds limitation
99  *
100  * 06 28 2011 cp.wu
101  * [WCXRP00000815] [MT6620 Wi-Fi][Driver] allow single BSSID with multiple SSID settings to work around some tricky AP which use space character as hidden SSID
102  * do not handle SCAN request immediately after connected to increase the probability of receiving 1st beacon frame.
103  *
104  * 06 23 2011 cp.wu
105  * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
106  * change parameter name from PeerAddr to BSSID
107  *
108  * 06 20 2011 cp.wu
109  * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
110  * 1. specify target's BSSID when requesting channel privilege.
111  * 2. pass BSSID information to firmware domain
112  *
113  * 06 16 2011 cp.wu
114  * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
115  * ensure DEAUTH is always sent before establish a new connection
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  * typo fix: a right brace is missed.
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  * When RECONNECT request is identified as disconnected, it is necessary to check for pending scan request.
124  *
125  * 06 16 2011 cp.wu
126  * [WCXRP00000757] [MT6620 Wi-Fi][Driver][SCN] take use of RLM API to filter out BSS in disallowed channels
127  * mark fgIsTransition as TRUE for state rolling.
128  *
129  * 06 16 2011 cp.wu
130  * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
131  * always check for pending scan after switched into NORMAL_TR state.
132  *
133  * 06 14 2011 cp.wu
134  * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
135  * always treat connection request at higher priority over scanning request
136  *
137  * 06 09 2011 tsaiyuan.hsu
138  * [WCXRP00000760] [MT5931 Wi-Fi][FW] Refine rxmHandleMacRxDone to reduce code size
139  * move send_auth at rxmHandleMacRxDone in firmware to driver to reduce code size.
140  *
141  * 06 02 2011 cp.wu
142  * [WCXRP00000681] [MT5931][Firmware] HIF code size reduction
143  * eliminate unused parameters for SAA-FSM
144  *
145  * 05 18 2011 cp.wu
146  * [WCXRP00000732] [MT6620 Wi-Fi][AIS] No need to switch back to IDLE state when DEAUTH frame is dropped due to bss disconnection
147  * change SCAN handling behavior when followed by a CONNECT/DISCONNECT requests by pending instead of dropping.
148  *
149  * 05 17 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  * when TX DONE status is TX_RESULT_DROPPED_IN_DRIVER, no need to switch back to IDLE state.
152  *
153  * 04 14 2011 cm.chang
154  * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
155  * .
156  *
157  * 04 13 2011 george.huang
158  * [WCXRP00000628] [MT6620 Wi-Fi][FW][Driver] Modify U-APSD setting to default OFF
159  * remove assert
160  *
161  * 03 18 2011 cp.wu
162  * [WCXRP00000575] [MT6620 Wi-Fi][Driver][AIS] reduce memory usage when generating mailbox message for scan request
163  * when there is no IE needed for probe request, then request a smaller memory for mailbox message
164  *
165  * 03 17 2011 chinglan.wang
166  * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
167  * .
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 16 2011 tsaiyuan.hsu
174  * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
175  * remove obsolete definition and unused variables.
176  *
177  * 03 11 2011 cp.wu
178  * [WCXRP00000535] [MT6620 Wi-Fi][Driver] Fixed channel operation when AIS and Tethering are operating concurrently
179  * When fixed channel operation is necessary, AIS-FSM would scan and only connect for BSS on the specific channel
180  *
181  * 03 09 2011 tsaiyuan.hsu
182  * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
183  * avoid clearing fgIsScanReqIssued so as to add scan results.
184  *
185  * 03 07 2011 terry.wu
186  * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
187  * Toggle non-standard debug messages to comments.
188  *
189  * 03 04 2011 tsaiyuan.hsu
190  * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
191  * reset retry conter of attemp to connect to ap after completion of join.
192  *
193  * 03 04 2011 cp.wu
194  * [WCXRP00000515] [MT6620 Wi-Fi][Driver] Surpress compiler warning which is identified by GNU compiler collection
195  * surpress compile warning occured when compiled by GNU compiler collection.
196  *
197  * 03 02 2011 cp.wu
198  * [WCXRP00000503] [MT6620 Wi-Fi][Driver] Take RCPI brought by association response as initial RSSI right after connection is built.
199  * use RCPI brought by ASSOC-RESP after connection is built as initial RCPI to avoid using a uninitialized MAC-RX RCPI.
200  *
201  * 02 26 2011 tsaiyuan.hsu
202  * [WCXRP00000391] [MT6620 Wi-Fi][FW] Add Roaming Support
203  * not send disassoc or deauth to leaving AP so as to improve performace of roaming.
204  *
205  * 02 23 2011 cp.wu
206  * [WCXRP00000487] [MT6620 Wi-Fi][Driver][AIS] Serve scan and connect request with a queue-based approach to improve response time for scanning request
207  * when handling reconnect request, set fgTryScan as TRUE
208  *
209  * 02 22 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  * handle SCAN and RECONNECT with a FIFO approach.
212  *
213  * 02 09 2011 tsaiyuan.hsu
214  * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
215  * Check if prRegInfo is null or not before initializing roaming parameters.
216  *
217  * 02 01 2011 cp.wu
218  * [WCXRP00000416] [MT6620 Wi-Fi][Driver] treat "unable to find BSS" as connection trial to prevent infinite reconnection trials
219  * treat "unable to find BSS" as connection trial to prevent infinite reconnection trials.
220  *
221  * 01 27 2011 tsaiyuan.hsu
222  * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
223  * add roaming fsm
224  * 1. not support 11r, only use strength of signal to determine roaming.
225  * 2. not enable CFG_SUPPORT_ROAMING until completion of full test.
226  * 3. in 6620, adopt work-around to avoid sign extension problem of cck of hw
227  * 4. assume that change of link quality in smooth way.
228  *
229  * 01 26 2011 yuche.tsai
230  * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
231  * .
232  *
233  * 01 25 2011 yuche.tsai
234  * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
235  * Fix Compile Error when DBG is disabled.
236  *
237  * 01 25 2011 yuche.tsai
238  * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
239  * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
240  *
241  * 01 14 2011 cp.wu
242  * [WCXRP00000359] [MT6620 Wi-Fi][Driver] add an extra state to ensure DEAUTH frame is always sent
243  * Add an extra state to guarantee DEAUTH frame is sent then connect to new BSS.
244  * This change is due to WAPI AP needs DEAUTH frame as a necessary step in handshaking protocol.
245  *
246  * 01 11 2011 cp.wu
247  * [WCXRP00000307] [MT6620 Wi-Fi][SQA]WHQL test .2c_wlan_adhoc case fail.
248  * [IBSS] when merged in, the bss state should be updated to firmware to pass WHQL adhoc failed item
249  *
250  * 01 10 2011 cp.wu
251  * [WCXRP00000351] [MT6620 Wi-Fi][Driver] remove from scanning result in OID handling layer when the corresponding BSS is disconnected due to beacon timeout
252  * remove from scanning result when the BSS is disconnected due to beacon timeout.
253  *
254  * 01 03 2011 cp.wu
255  * [WCXRP00000337] [MT6620 Wi-FI][Driver] AIS-FSM not to invoke cnmStaRecResetStatus directly 'cause it frees all belonging STA-RECs
256  * do not invoke cnmStaRecResetStatus() directly, nicUpdateBss will do the things after bss is disconnected
257  *
258  * 12 30 2010 cp.wu
259  * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
260  * do not need to manipulate prStaRec after indicating BSS disconnection to firmware, 'cause all STA-RECs belongs to BSS has been freed already
261  *
262  * 12 27 2010 cp.wu
263  * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
264  * add DEBUGFUNC() macro invoking for more detailed debugging information
265  *
266  * 12 23 2010 george.huang
267  * [WCXRP00000152] [MT6620 Wi-Fi] AP mode power saving function
268  * 1. update WMM IE parsing, with ASSOC REQ handling
269  * 2. extend U-APSD parameter passing from driver to FW
270  *
271  * 12 17 2010 cp.wu
272  * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
273  * before BSS disconnection is indicated to firmware, all correlated peer should be cleared and freed
274  *
275  * 12 07 2010 cm.chang
276  * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
277  * 1. BSSINFO include RLM parameter
278  * 2. free all sta records when network is disconnected
279  *
280  * 11 25 2010 yuche.tsai
281  * NULL
282  * Update SLT Function for QoS Support and not be affected by fixed rate function.
283  *
284  * 11 25 2010 cp.wu
285  * [WCXRP00000208] [MT6620 Wi-Fi][Driver] Add scanning with specified SSID to AIS FSM
286  * add scanning with specified SSID facility to AIS-FSM
287  *
288  * 11 01 2010 cp.wu
289  * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000150] [MT6620 Wi-Fi][Driver] Add implementation for querying current TX rate from firmware auto rate module
290  * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
291  * 2) Remove CNM CH-RECOVER event handling
292  * 3) cfg read/write API renamed with kal prefix for unified naming rules.
293  *
294  * 10 26 2010 cp.wu
295  * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000137] [MT6620 Wi-Fi] [FW] Support NIC capability query command
296  * 1) update NVRAM content template to ver 1.02
297  * 2) add compile option for querying NIC capability (default: off)
298  * 3) modify AIS 5GHz support to run-time option, which could be turned on by registry or NVRAM setting
299  * 4) correct auto-rate compiler error under linux (treat warning as error)
300  * 5) simplify usage of NVRAM and REG_INFO_T
301  * 6) add version checking between driver and firmware
302  *
303  * 10 14 2010 wh.su
304  * [WCXRP00000097] [MT6620 Wi-Fi] [Driver] Fixed the P2P not setting the fgIsChannelExt value make scan not abort
305  * initial the fgIsChannelExt value.
306  *
307  * 10 08 2010 cp.wu
308  * [WCXRP00000087] [MT6620 Wi-Fi][Driver] Cannot connect to 5GHz AP, driver will cause FW assert.
309  * correct erroneous logic: specifying eBand with incompatible eSco
310  *
311  * 10 04 2010 cp.wu
312  * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
313  * remove ENUM_NETWORK_TYPE_T definitions
314  *
315  * 09 27 2010 chinghwa.yu
316  * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
317  * Update BCM/BoW design and settings.
318  *
319  * 09 23 2010 cp.wu
320  * [WCXRP00000049] [MT6620 Wi-Fi][Driver] Adhoc cannot be created successfully.
321  * keep IBSS-ALONE state retrying until further instruction is received
322  *
323  * 09 21 2010 cp.wu
324  * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS associated
325  * Do a complete reset with STA-REC null checking for RF test re-entry
326  *
327  * 09 09 2010 yuche.tsai
328  * NULL
329  * Fix NULL IE Beacon issue. Sync Beacon Content to FW before enable beacon.
330  * Both in IBSS Create & IBSS Merge
331  *
332  * 09 09 2010 cp.wu
333  * NULL
334  * frequency is in unit of KHz thus no need to divide 1000 once more.
335  *
336  * 09 06 2010 cp.wu
337  * NULL
338  * 1) initialize for correct parameter even for disassociation.
339  * 2) AIS-FSM should have a limit on trials to build connection
340  *
341  * 09 03 2010 kevin.huang
342  * NULL
343  * Refine #include sequence and solve recursive/nested #include issue
344  *
345  * 08 30 2010 cp.wu
346  * NULL
347  * eliminate klockwork errors
348  *
349  * 08 29 2010 yuche.tsai
350  * NULL
351  * Finish SLT TX/RX & Rate Changing Support.
352  *
353  * 08 25 2010 cp.wu
354  * NULL
355  * add option for enabling AIS 5GHz scan
356  *
357  * 08 25 2010 cp.wu
358  * NULL
359  * [AIS-FSM] IBSS no longer needs to acquire channel for beaconing, RLM/CNM will handle the channel switching when BSS information is updated
360  *
361  * 08 25 2010 george.huang
362  * NULL
363  * update OID/ registry control path for PM related settings
364  *
365  * 08 24 2010 cm.chang
366  * NULL
367  * Support RLM initail channel of Ad-hoc, P2P and BOW
368  *
369  * 08 20 2010 cm.chang
370  * NULL
371  * Migrate RLM code to host from FW
372  *
373  * 08 12 2010 cp.wu
374  * NULL
375  * check-in missed files.
376  *
377  * 08 12 2010 kevin.huang
378  * NULL
379  * Refine bssProcessProbeRequest() and bssSendBeaconProbeResponse()
380  *
381  * 08 09 2010 cp.wu
382  * NULL
383  * reset fgIsScanReqIssued when abort request is received right after join completion.
384  *
385  * 08 03 2010 cp.wu
386  * NULL
387  * surpress compilation warning.
388  *
389  * 08 02 2010 cp.wu
390  * NULL
391  * comment out deprecated members in BSS_INFO, which are only used by firmware rather than driver.
392  *
393  * 07 30 2010 cp.wu
394  * NULL
395  * 1) BoW wrapper: use definitions instead of hard-coded constant for error code
396  * 2) AIS-FSM: eliminate use of desired RF parameters, use prTargetBssDesc instead
397  * 3) add handling for RX_PKT_DESTINATION_HOST_WITH_FORWARD for GO-broadcast frames
398  *
399  * 07 29 2010 cp.wu
400  * NULL
401  * eliminate u4FreqInKHz usage, combined into rConnections.ucAdHoc*
402  *
403  * 07 29 2010 cp.wu
404  * NULL
405  * allocate on MGMT packet for IBSS beaconing.
406  *
407  * 07 29 2010 cp.wu
408  * NULL
409  * [AIS-FSM] fix: when join failed, release channel privilege as well
410  *
411  * 07 28 2010 cp.wu
412  * NULL
413  * reuse join-abort sub-procedure to reduce code size.
414  *
415  * 07 28 2010 cp.wu
416  * NULL
417  * 1) eliminate redundant variable eOPMode in prAdapter->rWlanInfo
418  * 2) change nicMediaStateChange() API prototype
419  *
420  * 07 26 2010 cp.wu
421  *
422  * AIS-FSM: when scan request is coming in the 1st 5 seconds of channel privilege period, just pend it til 5-sec. period finishes
423  *
424  * 07 26 2010 cp.wu
425  *
426  * AIS-FSM FIX: return channel privilege even when the privilege is not granted yet
427  * QM: qmGetFrameAction() won't assert when corresponding STA-REC index is not found
428  *
429  * 07 26 2010 cp.wu
430  *
431  * re-commit code logic being overwriten.
432  *
433  * 07 24 2010 wh.su
434  *
435  * .support the Wi-Fi RSN
436  *
437  * 07 23 2010 cp.wu
438  *
439  * 1) re-enable AIS-FSM beacon timeout handling.
440  * 2) scan done API revised
441  *
442  * 07 23 2010 cp.wu
443  *
444  * 1) enable Ad-Hoc
445  * 2) disable beacon timeout handling temporally due to unexpected beacon timeout event.
446  *
447  * 07 23 2010 cp.wu
448  *
449  * indicate scan done for linux wireless extension
450  *
451  * 07 23 2010 cp.wu
452  *
453  * add AIS-FSM handling for beacon timeout event.
454  *
455  * 07 22 2010 cp.wu
456  *
457  * 1) refine AIS-FSM indent.
458  * 2) when entering RF Test mode, flush 802.1X frames as well
459  * 3) when entering D3 state, flush 802.1X frames as well
460  *
461  * 07 21 2010 cp.wu
462  *
463  * separate AIS-FSM states into different cases of channel request.
464  *
465  * 07 21 2010 cp.wu
466  *
467  * 1) change BG_SCAN to ONLINE_SCAN for consistent term
468  * 2) only clear scanning result when scan is permitted to do
469  *
470  * 07 20 2010 cp.wu
471  *
472  * 1) [AIS] when new scan is issued, clear currently available scanning result except the connected one
473  * 2) refine disconnection behaviour when issued during BG-SCAN process
474  *
475  * 07 20 2010 cp.wu
476  *
477  * 1) bugfix: do not stop timer for join after switched into normal_tr state, for providing chance for DHCP handshasking
478  * 2) modify rsnPerformPolicySelection() invoking
479  *
480  * 07 19 2010 cp.wu
481  *
482  * 1) init AIS_BSS_INFO as channel number = 1 with band = 2.4GHz
483  * 2) correct typo
484  *
485  * 07 19 2010 wh.su
486  *
487  * update for security supporting.
488  *
489  * 07 19 2010 cp.wu
490  *
491  * [WPD00003833] [MT6620 and MT5931] Driver migration.
492  * when IBSS is being merged-in, send command packet to PM for connected indication
493  *
494  * 07 19 2010 cp.wu
495  *
496  * [WPD00003833] [MT6620 and MT5931] Driver migration.
497  * Add Ad-Hoc support to AIS-FSM
498  *
499  * 07 19 2010 jeffrey.chang
500  *
501  * Linux port modification
502  *
503  * 07 16 2010 cp.wu
504  *
505  * [WPD00003833] [MT6620 and MT5931] Driver migration.
506  * bugfix for SCN migration
507  * 1) modify QUEUE_CONCATENATE_QUEUES() so it could be used to concatence with an empty queue
508  * 2) before AIS issues scan request, network(BSS) needs to be activated first
509  * 3) only invoke COPY_SSID when using specified SSID for scan
510  *
511  * 07 15 2010 cp.wu
512  *
513  * [WPD00003833] [MT6620 and MT5931] Driver migration.
514  * for AIS scanning, driver specifies no extra IE for probe request
515  *
516  * 07 15 2010 cp.wu
517  *
518  * [WPD00003833] [MT6620 and MT5931] Driver migration.
519  * driver no longer generates probe request frames
520  *
521  * 07 14 2010 yarco.yang
522  *
523  * Remove CFG_MQM_MIGRATION
524  *
525  * 07 14 2010 cp.wu
526  *
527  * [WPD00003833] [MT6620 and MT5931] Driver migration.
528  * Refine AIS-FSM by divided into more states
529  *
530  * 07 13 2010 cm.chang
531  *
532  * Rename MSG_CH_RELEASE_T to MSG_CH_ABORT_T
533  *
534  * 07 09 2010 cp.wu
535  *
536  * 1) separate AIS_FSM state for two kinds of scanning. (OID triggered scan, and scan-for-connection)
537  * 2) eliminate PRE_BSS_DESC_T, Beacon/PrebResp is now parsed in single pass
538  * 3) implment DRV-SCN module, currently only accepts single scan request, other request will be directly dropped by returning BUSY
539  *
540  * 07 09 2010 george.huang
541  *
542  * [WPD00001556] Migrate PM variables from FW to driver: for composing QoS Info
543  *
544  * 07 08 2010 cp.wu
545  *
546  * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
547  *
548  * 07 08 2010 cp.wu
549  * [WPD00003833][MT6620 and MT5931] Driver migration
550  * take use of RLM module for parsing/generating HT IEs for 11n capability
551  *
552  * 07 08 2010 cm.chang
553  * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
554  * Rename MID_MNY_CNM_CH_RELEASE to MID_MNY_CNM_CH_ABORT
555  *
556  * 07 07 2010 cp.wu
557  * [WPD00003833][MT6620 and MT5931] Driver migration
558  * for first connection, if connecting failed do not enter into scan state.
559  *
560  * 07 06 2010 cp.wu
561  * [WPD00003833][MT6620 and MT5931] Driver migration
562  * once STA-REC is allocated and updated, invoke cnmStaRecChangeState() to sync. with firmware.
563  *
564  * 07 06 2010 george.huang
565  * [WPD00001556]Basic power managemenet function
566  * Update arguments for nicUpdateBeaconIETemplate()
567  *
568  * 07 06 2010 cp.wu
569  * [WPD00003833][MT6620 and MT5931] Driver migration
570  * STA-REC is maintained by CNM only.
571  *
572  * 07 05 2010 cp.wu
573  * [WPD00003833][MT6620 and MT5931] Driver migration
574  * remove unused definitions.
575  *
576  * 07 01 2010 cp.wu
577  * [WPD00003833][MT6620 and MT5931] Driver migration
578  * AIS-FSM integration with CNM channel request messages
579  *
580  * 07 01 2010 cp.wu
581  * [WPD00003833][MT6620 and MT5931] Driver migration
582  * implementation of DRV-SCN and related mailbox message handling.
583  *
584  * 06 30 2010 cp.wu
585  * [WPD00003833][MT6620 and MT5931] Driver migration
586  * sync. with CMD/EVENT document ver0.07.
587  *
588  * 06 29 2010 cp.wu
589  * [WPD00003833][MT6620 and MT5931] Driver migration
590  * 1) sync to. CMD/EVENT document v0.03
591  * 2) simplify DTIM period parsing in scan.c only, bss.c no longer parses it again.
592  * 3) send command packet to indicate FW-PM after
593  *     a) 1st beacon is received after AIS has connected to an AP
594  *     b) IBSS-ALONE has been created
595  *     c) IBSS-MERGE has occured
596  *
597  * 06 25 2010 cp.wu
598  * [WPD00003833][MT6620 and MT5931] Driver migration
599  * modify Beacon/ProbeResp to complete parsing,
600  * because host software has looser memory usage restriction
601  *
602  * 06 23 2010 cp.wu
603  * [WPD00003833][MT6620 and MT5931] Driver migration
604  * integrate .
605  *
606  * 06 22 2010 cp.wu
607  * [WPD00003833][MT6620 and MT5931] Driver migration
608  * comment out RLM APIs by CFG_RLM_MIGRATION.
609  *
610  * 06 22 2010 cp.wu
611  * [WPD00003833][MT6620 and MT5931] Driver migration
612  * 1) add command warpper for STA-REC/BSS-INFO sync.
613  * 2) enhance command packet sending procedure for non-oid part
614  * 3) add command packet definitions for STA-REC/BSS-INFO sync.
615  *
616  * 06 21 2010 yarco.yang
617  * [WPD00003837][MT6620]Data Path Refine
618  * Support CFG_MQM_MIGRATION flag
619  *
620  * 06 21 2010 cp.wu
621  * [WPD00003833][MT6620 and MT5931] Driver migration
622  * add scan_fsm into building.
623  *
624  * 06 21 2010 cp.wu
625  * [WPD00003833][MT6620 and MT5931] Driver migration
626  * RSN/PRIVACY compilation flag awareness correction
627  *
628  * 06 18 2010 cm.chang
629  * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
630  * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
631  *
632  * 06 18 2010 wh.su
633  * [WPD00003840][MT6620 5931] Security migration
634  * migration from MT6620 firmware.
635  *
636  * 06 15 2010 cp.wu
637  * [WPD00003833][MT6620 and MT5931] Driver migration
638  * add scan.c.
639  *
640  * 06 14 2010 cp.wu
641  * [WPD00003833][MT6620 and MT5931] Driver migration
642  * restore utility function invoking via hem_mbox to direct calls
643  *
644  * 06 11 2010 cp.wu
645  * [WPD00003833][MT6620 and MT5931] Driver migration
646  * auth.c is migrated.
647  *
648  * 06 11 2010 cp.wu
649  * [WPD00003833][MT6620 and MT5931] Driver migration
650  * add bss.c.
651  *
652  * 06 11 2010 cp.wu
653  * [WPD00003833][MT6620 and MT5931] Driver migration
654  * 1) migrate assoc.c.
655  * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
656  * 3) add configuration options for CNM_MEM and RSN modules
657  * 4) add data path for management frames
658  * 5) eliminate rPacketInfo of MSDU_INFO_T
659  *
660  * 06 10 2010 cp.wu
661  * [WPD00003833][MT6620 and MT5931] Driver migration
662  * change to enqueue TX frame infinitely.
663  *
664  * 06 10 2010 cp.wu
665  * [WPD00003833][MT6620 and MT5931] Driver migration
666  * 1) eliminate CFG_CMD_EVENT_VERSION_0_9
667  * 2) when disconnected, indicate nic directly (no event is needed)
668  *
669  * 06 10 2010 cp.wu
670  * [WPD00003833][MT6620 and MT5931] Driver migration
671  * add buildable & linkable ais_fsm.c
672  *
673  * related reference are still waiting to be resolved
674  *
675  * 06 01 2010 cm.chang
676  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
677  * Add conditionial compiling flag to choose default available bandwidth
678  *
679  * 05 28 2010 kevin.huang
680  * [BORA00000794][WIFISYS][New Feature]Power Management Support
681  * Add ClientList handling API - bssClearClientList, bssAddStaRecToClientList
682  *
683  * 05 24 2010 kevin.huang
684  * [BORA00000794][WIFISYS][New Feature]Power Management Support
685  * Refine authSendAuthFrame() for NULL STA_RECORD_T case and minimum deauth interval.
686  *
687  * 05 21 2010 kevin.huang
688  * [BORA00000794][WIFISYS][New Feature]Power Management Support
689  * Fix compile error if CFG_CMD_EVENT_VER_009 == 0 for prEventConnStatus->ucNetworkType.
690  *
691  * 05 21 2010 kevin.huang
692  * [BORA00000794][WIFISYS][New Feature]Power Management Support
693  * Refine txmInitWtblTxRateTable() - set TX initial rate according to AP's operation rate set
694  *
695  * 05 17 2010 kevin.huang
696  * [BORA00000794][WIFISYS][New Feature]Power Management Support
697  * Call pmAbort() and add ucNetworkType field in EVENT_CONNECTION_STATUS
698  *
699  * 05 14 2010 kevin.huang
700  * [BORA00000794][WIFISYS][New Feature]Power Management Support
701  * Fix compile warning - define of MQM_WMM_PARSING was removed
702  *
703  * 05 12 2010 kevin.huang
704  * [BORA00000794][WIFISYS][New Feature]Power Management Support
705  * Add Power Management - Legacy PS-POLL support.
706  *
707  * 04 28 2010 tehuang.liu
708  * [BORA00000605][WIFISYS] Phase3 Integration
709  * Removed the use of compiling flag MQM_WMM_PARSING
710  *
711  * 04 27 2010 kevin.huang
712  * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
713  *
714  * Fix typo
715  *
716  * 04 27 2010 kevin.huang
717  * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
718  * Add Set Slot Time and Beacon Timeout Support for AdHoc Mode
719  *
720  * 04 19 2010 kevin.huang
721  * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
722  * Add Send Deauth for Class 3 Error and Leave Network Support
723  *
724  * 04 15 2010 wh.su
725  * [BORA00000680][MT6620] Support the statistic for Microsoft os query
726  * fixed the protected bit at cap info for ad-hoc.
727  *
728  * 04 13 2010 kevin.huang
729  * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
730  * Add new HW CH macro support
731  *
732  * 04 07 2010 chinghwa.yu
733  * [BORA00000563]Add WiFi CoEx BCM module
734  * Add TX Power Control RCPI function.
735  *
736  * 03 29 2010 wh.su
737  * [BORA00000605][WIFISYS] Phase3 Integration
738  * move the wlan table alloc / free to change state function.
739  *
740  * 03 25 2010 wh.su
741  * [BORA00000676][MT6620] Support the frequency setting and query at build connection / connection event
742  * modify the build connection and status event structure bu CMD_EVENT doc 0.09 draft, default is disable.
743  *
744  * 03 24 2010 wh.su
745  * [BORA00000605][WIFISYS] Phase3 Integration
746  * fixed some WHQL testing error.
747  *
748  * 03 24 2010 kevin.huang
749  * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
750  * Add Set / Unset POWER STATE in AIS Network
751  *
752  * 03 16 2010 kevin.huang
753  * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
754  * Add AdHoc Mode
755  *
756  * 03 10 2010 kevin.huang
757  * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
758  * Add Channel Manager for arbitration of JOIN and SCAN Req
759  *
760  * 03 03 2010 kevin.huang
761  * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
762  * Add PHY_CONFIG to change Phy Type
763  *
764  * 03 03 2010 chinghwa.yu
765  * [BORA00000563]Add WiFi CoEx BCM module
766  * Use bcmWiFiNotify to replace wifi_send_msg to pass infomation to BCM module.
767  *
768  * 03 03 2010 chinghwa.yu
769  * [BORA00000563]Add WiFi CoEx BCM module
770  * Remove wmt_task definition and add PTA function.
771  *
772  * 03 02 2010 tehuang.liu
773  * [BORA00000569][WIFISYS] Phase 2 Integration Test
774  * Init TXM and MQM testing procedures in aisFsmRunEventJoinComplete()
775  *
776  * 03 01 2010 tehuang.liu
777  * [BORA00000569][WIFISYS] Phase 2 Integration Test
778  * Modified aisUpdateBssInfo() to call TXM's functions for setting WTBL TX parameters
779  *
780  * 03 01 2010 wh.su
781  * [BORA00000605][WIFISYS] Phase3 Integration
782  * clear the pmkid cache while indicate media disconnect.
783  *
784  * 02 26 2010 tehuang.liu
785  * [BORA00000569][WIFISYS] Phase 2 Integration Test
786  * .
787  *
788  * 02 26 2010 tehuang.liu
789  * [BORA00000569][WIFISYS] Phase 2 Integration Test
790  * Enabled MQM parsing WMM IEs for non-AP mode
791  *
792  * 02 26 2010 kevin.huang
793  * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
794  * Remove CFG_TEST_VIRTUAL_CMD and add support of Driver STA_RECORD_T activation
795  *
796  * 02 25 2010 wh.su
797  * [BORA00000605][WIFISYS] Phase3 Integration
798  * use the Rx0 dor event indicate.
799  *
800  * 02 23 2010 kevin.huang
801  * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
802  * Support dynamic channel selection
803  *
804  * 02 23 2010 wh.su
805  * [BORA00000621][MT6620 Wi-Fi] Add the RSSI indicate to avoid XP stalled for query rssi value
806  * Adding the RSSI event support, using the HAL function to get the rcpi value and tranlsate to RSSI and indicate to driver
807  *
808  * 02 12 2010 cm.chang
809  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
810  * Use bss info array for concurrent handle
811  *
812  * 02 05 2010 kevin.huang
813  * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
814  * Revise data structure to share the same BSS_INFO_T for avoiding coding error
815  *
816  * 02 04 2010 kevin.huang
817  * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
818  * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
819  *
820  * 01 27 2010 tehuang.liu
821  * [BORA00000569][WIFISYS] Phase 2 Integration Test
822  * Set max AMDPU size supported by the peer to 64 KB, removed mqmInit() and mqmTxSendAddBaReq() function calls in aisUpdateBssInfo()
823  *
824  * 01 27 2010 wh.su
825  * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
826  * add and fixed some security function.
827  *
828  * 01 22 2010 cm.chang
829  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
830  * Support protection and bandwidth switch
831  *
832  * 01 20 2010 kevin.huang
833  * [BORA00000569][WIFISYS] Phase 2 Integration Test
834  * Add PHASE_2_INTEGRATION_WORK_AROUND and CFG_SUPPORT_BCM flags
835  *
836  * 01 15 2010 tehuang.liu
837  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
838  * Configured the AMPDU factor to 3 for the APu1rwduu`wvpghlqg|q`mpdkb+ilp
839  *
840  * 01 14 2010 chinghwa.yu
841  * [BORA00000563]Add WiFi CoEx BCM module
842  * Add WiFi BCM module for the 1st time.
843  *
844  * 01 11 2010 kevin.huang
845  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
846  * Add Deauth and Disassoc Handler
847  *
848  * 01 07 2010 kevin.huang
849  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
850  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
851  *
852  * Refine JOIN Complete and seperate the function of Media State indication
853  *
854  * 01 04 2010 tehuang.liu
855  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
856  * For working out the first connection Chariot-verified version
857  *
858  * 12 18 2009 cm.chang
859  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
860  * .
861  *
862  * Dec 10 2009 mtk01088
863  * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
864  * adding the sample code to update the wlan table rate,
865  *
866  * Dec 10 2009 mtk01104
867  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
868  * Different function prototype of wifi_send_msg()
869  *
870  * Dec 9 2009 mtk01104
871  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
872  * Call rlm related function to process HT info when join complete
873  *
874  * Dec 9 2009 mtk01088
875  * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
876  * default the acquired wlan table entry code off
877  *
878  * Dec 9 2009 mtk01088
879  * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
880  * adding the code to acquired the wlan table entry, and a sample code to update the BA bit at table
881  *
882  * Dec 7 2009 mtk01461
883  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
884  * Fix the problem of prSwRfb overwrited by event packet in aisFsmRunEventJoinComplete()
885  *
886  * Dec 4 2009 mtk01088
887  * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
888  * adding the code to integrate the security related code
889  *
890  * Dec 3 2009 mtk01461
891  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
892  * Remove redundant declaration
893  *
894  * Dec 3 2009 mtk01461
895  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
896  * Add code for JOIN init and JOIN complete
897  *
898  * Nov 30 2009 mtk01461
899  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
900  * Rename u4RSSI to i4RSSI
901  *
902  * Nov 30 2009 mtk01461
903  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
904  * Revise ENUM_MEDIA_STATE to ENUM_PARAM_MEDIA_STATE
905  *
906  * Nov 30 2009 mtk01461
907  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
908  * Add fgIsScanReqIssued to CONNECTION_SETTINGS_T
909  *
910  * Nov 26 2009 mtk01461
911  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
912  * Revise Virtual CMD handler due to structure changed
913  *
914  * Nov 25 2009 mtk01461
915  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
916  * Add Virtual CMD & RESP for testing CMD PATH
917  *
918  * Nov 23 2009 mtk01461
919  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
920  * Add aisFsmInitializeConnectionSettings()
921  *
922  * Nov 20 2009 mtk01461
923  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
924  * Add CFG_TEST_MGMT_FSM flag for aisFsmTest()
925  *
926  * Nov 16 2009 mtk01461
927  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
928  *
929 */
930
931 /*******************************************************************************
932 *                         C O M P I L E R   F L A G S
933 ********************************************************************************
934 */
935
936 /*******************************************************************************
937 *                    E X T E R N A L   R E F E R E N C E S
938 ********************************************************************************
939 */
940 #include "precomp.h"
941
942 /*******************************************************************************
943 *                              C O N S T A N T S
944 ********************************************************************************
945 */
946 #define AIS_ROAMING_CONNECTION_TRIAL_LIMIT  2
947
948 /*******************************************************************************
949 *                             D A T A   T Y P E S
950 ********************************************************************************
951 */
952
953 /*******************************************************************************
954 *                            P U B L I C   D A T A
955 ********************************************************************************
956 */
957
958 /*******************************************************************************
959 *                           P R I V A T E   D A T A
960 ********************************************************************************
961 */
962 #if DBG
963 /*lint -save -e64 Type mismatch */
964 static PUINT_8 apucDebugAisState[AIS_STATE_NUM] = {
965     (PUINT_8)DISP_STRING("AIS_STATE_IDLE"),
966     (PUINT_8)DISP_STRING("AIS_STATE_SEARCH"),
967     (PUINT_8)DISP_STRING("AIS_STATE_SCAN"),
968     (PUINT_8)DISP_STRING("AIS_STATE_ONLINE_SCAN"),
969     (PUINT_8)DISP_STRING("AIS_STATE_LOOKING_FOR"),
970     (PUINT_8)DISP_STRING("AIS_STATE_WAIT_FOR_NEXT_SCAN"),
971     (PUINT_8)DISP_STRING("AIS_STATE_REQ_CHANNEL_JOIN"),
972     (PUINT_8)DISP_STRING("AIS_STATE_JOIN"),
973     (PUINT_8)DISP_STRING("AIS_STATE_IBSS_ALONE"),
974     (PUINT_8)DISP_STRING("AIS_STATE_IBSS_MERGE"),
975     (PUINT_8)DISP_STRING("AIS_STATE_NORMAL_TR"),
976     (PUINT_8)DISP_STRING("AIS_STATE_DISCONNECTING")
977 };
978 /*lint -restore */
979 #endif /* DBG */
980
981 /*******************************************************************************
982 *                                 M A C R O S
983 ********************************************************************************
984 */
985
986 /*******************************************************************************
987 *                   F U N C T I O N   D E C L A R A T I O N S
988 ********************************************************************************
989 */
990
991 /*******************************************************************************
992 *                              F U N C T I O N S
993 ********************************************************************************
994 */
995 /*----------------------------------------------------------------------------*/
996 /*!
997 * @brief the function is used to initialize the value of the connection settings for
998 *        AIS network
999 *
1000 * @param (none)
1001 *
1002 * @return (none)
1003 */
1004 /*----------------------------------------------------------------------------*/
1005 VOID
1006 aisInitializeConnectionSettings (
1007     IN P_ADAPTER_T prAdapter,
1008     IN P_REG_INFO_T prRegInfo
1009     )
1010 {
1011     P_CONNECTION_SETTINGS_T prConnSettings;
1012     UINT_8 aucAnyBSSID[] = BC_BSSID;
1013     UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR;
1014
1015     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1016
1017     /* Setup default values for operation */
1018     COPY_MAC_ADDR(prConnSettings->aucMacAddress, aucZeroMacAddr);
1019
1020     prConnSettings->ucDelayTimeOfDisconnectEvent = AIS_DELAY_TIME_OF_DISCONNECT_SEC;
1021
1022     COPY_MAC_ADDR(prConnSettings->aucBSSID, aucAnyBSSID);
1023     prConnSettings->fgIsConnByBssidIssued = FALSE;
1024
1025     prConnSettings->fgIsConnReqIssued = FALSE;
1026
1027     prConnSettings->ucSSIDLen = 0;
1028
1029     prConnSettings->eOPMode = NET_TYPE_INFRA;
1030
1031     prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
1032
1033     if(prRegInfo) {
1034         prConnSettings->ucAdHocChannelNum = (UINT_8) nicFreq2ChannelNum(prRegInfo->u4StartFreq);
1035         prConnSettings->eAdHocBand =  prRegInfo->u4StartFreq < 5000000 ? BAND_2G4 : BAND_5G;
1036         prConnSettings->eAdHocMode = (ENUM_PARAM_AD_HOC_MODE_T) (prRegInfo->u4AdhocMode);
1037     }
1038
1039     prConnSettings->eAuthMode = AUTH_MODE_OPEN;
1040
1041     prConnSettings->eEncStatus = ENUM_ENCRYPTION_DISABLED;
1042
1043     prConnSettings->fgIsScanReqIssued = FALSE;
1044
1045     /* MIB attributes */
1046     prConnSettings->u2BeaconPeriod = DOT11_BEACON_PERIOD_DEFAULT;
1047
1048     prConnSettings->u2RTSThreshold = DOT11_RTS_THRESHOLD_DEFAULT;
1049
1050     prConnSettings->u2DesiredNonHTRateSet = RATE_SET_ALL_ABG;
1051
1052     //prConnSettings->u4FreqInKHz; /* Center frequency */
1053
1054
1055     /* Set U-APSD AC */
1056     prConnSettings->bmfgApsdEnAc = PM_UAPSD_NONE;
1057
1058     secInit(prAdapter, NETWORK_TYPE_AIS_INDEX);
1059
1060     /* Features */
1061     prConnSettings->fgIsEnableRoaming = FALSE;
1062 #if CFG_SUPPORT_ROAMING
1063     if(prRegInfo) {
1064         prConnSettings->fgIsEnableRoaming = ((prRegInfo->fgDisRoaming > 0)?(FALSE):(TRUE));
1065     }
1066 #endif /* CFG_SUPPORT_ROAMING */
1067
1068     prConnSettings->fgIsAdHocQoSEnable = FALSE;
1069
1070     prConnSettings->eDesiredPhyConfig = PHY_CONFIG_802_11ABGN;
1071
1072     /* Set default bandwidth modes */
1073     prConnSettings->uc2G4BandwidthMode = CONFIG_BW_20M;
1074     prConnSettings->uc5GBandwidthMode = CONFIG_BW_20_40M;
1075
1076     return;
1077 } /* end of aisFsmInitializeConnectionSettings() */
1078
1079
1080 /*----------------------------------------------------------------------------*/
1081 /*!
1082 * @brief the function is used to initialize the value in AIS_FSM_INFO_T for
1083 *        AIS FSM operation
1084 *
1085 * @param (none)
1086 *
1087 * @return (none)
1088 */
1089 /*----------------------------------------------------------------------------*/
1090 VOID
1091 aisFsmInit (
1092     IN P_ADAPTER_T prAdapter
1093     )
1094 {
1095     P_AIS_FSM_INFO_T prAisFsmInfo;
1096     P_BSS_INFO_T prAisBssInfo;
1097     P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1098
1099     DEBUGFUNC("aisFsmInit()");
1100     DBGLOG(SW1, INFO, ("->aisFsmInit()\n"));
1101
1102     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1103     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1104     prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1105
1106     //4 <1> Initiate FSM
1107     prAisFsmInfo->ePreviousState = AIS_STATE_IDLE;
1108     prAisFsmInfo->eCurrentState = AIS_STATE_IDLE;
1109
1110     prAisFsmInfo->ucAvailableAuthTypes = 0;
1111
1112     prAisFsmInfo->prTargetBssDesc = (P_BSS_DESC_T)NULL;
1113
1114     prAisFsmInfo->ucSeqNumOfReqMsg = 0;
1115     prAisFsmInfo->ucSeqNumOfChReq = 0;
1116     prAisFsmInfo->ucSeqNumOfScanReq = 0;
1117
1118     prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1119 #if CFG_SUPPORT_ROAMING
1120     prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1121 #endif /* CFG_SUPPORT_ROAMING */
1122     prAisFsmInfo->fgIsChannelRequested = FALSE;
1123     prAisFsmInfo->fgIsChannelGranted = FALSE;
1124
1125     //4 <1.1> Initiate FSM - Timer INIT
1126     cnmTimerInitTimer(prAdapter,
1127             &prAisFsmInfo->rBGScanTimer,
1128             (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventBGSleepTimeOut,
1129             (UINT_32)NULL);
1130
1131     cnmTimerInitTimer(prAdapter,
1132             &prAisFsmInfo->rIbssAloneTimer,
1133             (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventIbssAloneTimeOut,
1134             (UINT_32)NULL);
1135
1136     cnmTimerInitTimer(prAdapter,
1137             &prAisFsmInfo->rIndicationOfDisconnectTimer,
1138             (PFN_MGMT_TIMEOUT_FUNC)aisPostponedEventOfDisconnTimeout,
1139             (UINT_32)NULL);
1140
1141     cnmTimerInitTimer(prAdapter,
1142             &prAisFsmInfo->rJoinTimeoutTimer,
1143             (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventJoinTimeout,
1144             (UINT_32)NULL);
1145
1146     //4 <1.2> Initiate PWR STATE
1147     SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1148
1149
1150     //4 <2> Initiate BSS_INFO_T - common part
1151     BSS_INFO_INIT(prAdapter, NETWORK_TYPE_AIS_INDEX);
1152     COPY_MAC_ADDR(prAisBssInfo->aucOwnMacAddr, prAdapter->rWifiVar.aucMacAddress);
1153
1154     //4 <3> Initiate BSS_INFO_T - private part
1155     /* TODO */
1156     prAisBssInfo->eBand = BAND_2G4;
1157     prAisBssInfo->ucPrimaryChannel = 1;
1158     prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
1159
1160     //4 <4> Allocate MSDU_INFO_T for Beacon
1161     prAisBssInfo->prBeacon = cnmMgtPktAlloc(prAdapter,
1162             OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem[0]) + MAX_IE_LENGTH);
1163
1164     if (prAisBssInfo->prBeacon) {
1165         prAisBssInfo->prBeacon->eSrc = TX_PACKET_MGMT;
1166         prAisBssInfo->prBeacon->ucStaRecIndex = 0xFF; /* NULL STA_REC */
1167     }
1168     else {
1169         ASSERT(0);
1170     }
1171
1172 #if 0
1173     prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = PM_UAPSD_ALL;
1174     prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = PM_UAPSD_ALL;
1175     prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = WMM_MAX_SP_LENGTH_2;
1176 #else
1177     if (prAdapter->u4UapsdAcBmp == 0) {
1178         prAdapter->u4UapsdAcBmp = CFG_INIT_UAPSD_AC_BMP;
1179         //ASSERT(prAdapter->u4UapsdAcBmp);
1180     }
1181     prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = (UINT_8)prAdapter->u4UapsdAcBmp;
1182     prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC =(UINT_8) prAdapter->u4UapsdAcBmp;
1183     prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = (UINT_8)prAdapter->u4MaxSpLen;
1184 #endif
1185
1186     /* request list initialization */
1187     LINK_INITIALIZE(&prAisFsmInfo->rPendingReqList);
1188
1189     //DBGPRINTF("[2] ucBmpDeliveryAC:0x%x, ucBmpTriggerAC:0x%x, ucUapsdSp:0x%x",
1190             //prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC,
1191             //prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC,
1192             //prAisBssInfo->rPmProfSetupInfo.ucUapsdSp);
1193
1194     return;
1195 } /* end of aisFsmInit() */
1196
1197 /*----------------------------------------------------------------------------*/
1198 /*!
1199 * @brief the function is used to uninitialize the value in AIS_FSM_INFO_T for
1200 *        AIS FSM operation
1201 *
1202 * @param (none)
1203 *
1204 * @return (none)
1205 */
1206 /*----------------------------------------------------------------------------*/
1207 VOID
1208 aisFsmUninit (
1209     IN P_ADAPTER_T prAdapter
1210     )
1211 {
1212     P_AIS_FSM_INFO_T prAisFsmInfo;
1213     P_BSS_INFO_T prAisBssInfo;
1214     P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1215
1216     DEBUGFUNC("aisFsmUninit()");
1217     DBGLOG(SW1, INFO, ("->aisFsmUninit()\n"));
1218
1219     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1220     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1221     prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1222
1223     //4 <1> Stop all timers
1224     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
1225     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
1226     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
1227     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1228
1229     //4 <2> flush pending request
1230     aisFsmFlushRequest(prAdapter);
1231
1232     //4 <3> Reset driver-domain BSS-INFO
1233     if(prAisBssInfo->prBeacon) {
1234         cnmMgtPktFree(prAdapter, prAisBssInfo->prBeacon);
1235         prAisBssInfo->prBeacon = NULL;
1236     }
1237
1238 #if CFG_SUPPORT_802_11W
1239     rsnStopSaQuery(prAdapter);
1240 #endif
1241
1242     return;
1243 } /* end of aisFsmUninit() */
1244
1245
1246 /*----------------------------------------------------------------------------*/
1247 /*!
1248 * @brief Initialization of JOIN STATE
1249 *
1250 * @param[in] prBssDesc  The pointer of BSS_DESC_T which is the BSS we will try to join with.
1251 *
1252 * @return (none)
1253 */
1254 /*----------------------------------------------------------------------------*/
1255 VOID
1256 aisFsmStateInit_JOIN (
1257     IN P_ADAPTER_T prAdapter,
1258     P_BSS_DESC_T prBssDesc
1259     )
1260 {
1261     P_AIS_FSM_INFO_T prAisFsmInfo;
1262     P_BSS_INFO_T prAisBssInfo;
1263     P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1264     P_CONNECTION_SETTINGS_T prConnSettings;
1265     P_STA_RECORD_T prStaRec;
1266     P_MSG_JOIN_REQ_T prJoinReqMsg;
1267
1268     DEBUGFUNC("aisFsmStateInit_JOIN()");
1269
1270     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1271     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1272     prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1273     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1274
1275     ASSERT(prBssDesc);
1276
1277     //4 <1> We are going to connect to this BSS.
1278     prBssDesc->fgIsConnecting = TRUE;
1279
1280
1281     //4 <2> Setup corresponding STA_RECORD_T
1282     prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1283             STA_TYPE_LEGACY_AP,
1284             NETWORK_TYPE_AIS_INDEX,
1285             prBssDesc);
1286
1287     prAisFsmInfo->prTargetStaRec = prStaRec;
1288
1289     //4 <2.1> sync. to firmware domain
1290     cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1291
1292     //4 <3> Update ucAvailableAuthTypes which we can choice during SAA
1293     if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1294
1295         prStaRec->fgIsReAssoc = FALSE;
1296
1297         switch (prConnSettings->eAuthMode) {
1298         case AUTH_MODE_OPEN:                /* Note: Omit break here. */
1299         case AUTH_MODE_WPA:
1300         case AUTH_MODE_WPA_PSK:
1301         case AUTH_MODE_WPA2:
1302         case AUTH_MODE_WPA2_PSK:
1303             prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1304             break;
1305
1306
1307         case AUTH_MODE_SHARED:
1308             prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_SHARED_KEY;
1309             break;
1310
1311
1312         case AUTH_MODE_AUTO_SWITCH:
1313             DBGLOG(AIS, LOUD, ("JOIN INIT: eAuthMode == AUTH_MODE_AUTO_SWITCH\n"));
1314             prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)(AUTH_TYPE_OPEN_SYSTEM |
1315                                                           AUTH_TYPE_SHARED_KEY);
1316             break;
1317
1318         default:
1319             ASSERT(!(prConnSettings->eAuthMode == AUTH_MODE_WPA_NONE));
1320             DBGLOG(AIS, ERROR, ("JOIN INIT: Auth Algorithm : %d was not supported by JOIN\n",
1321                                            prConnSettings->eAuthMode));
1322             /* TODO(Kevin): error handling ? */
1323             return;
1324         }
1325
1326         /* TODO(tyhsu): Assume that Roaming Auth Type is equal to ConnSettings eAuthMode */
1327         prAisSpecificBssInfo->ucRoamingAuthTypes = prAisFsmInfo->ucAvailableAuthTypes;
1328
1329         prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
1330
1331     }
1332     else {
1333         ASSERT(prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE);
1334         ASSERT(!prBssDesc->fgIsConnected);
1335
1336         DBGLOG(AIS, LOUD, ("JOIN INIT: AUTH TYPE = %d for Roaming\n",
1337             prAisSpecificBssInfo->ucRoamingAuthTypes));
1338
1339
1340         prStaRec->fgIsReAssoc = TRUE; /* We do roaming while the medium is connected */
1341
1342         /* TODO(Kevin): We may call a sub function to acquire the Roaming Auth Type */
1343         prAisFsmInfo->ucAvailableAuthTypes = prAisSpecificBssInfo->ucRoamingAuthTypes;
1344
1345         prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT_FOR_ROAMING;
1346     }
1347
1348
1349     //4 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes
1350     if (prAisFsmInfo->ucAvailableAuthTypes &
1351         (UINT_8)AUTH_TYPE_OPEN_SYSTEM) {
1352
1353         DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == OPEN_SYSTEM.\n"));
1354         prAisFsmInfo->ucAvailableAuthTypes &=
1355             ~(UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1356
1357         prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
1358     }
1359     else if (prAisFsmInfo->ucAvailableAuthTypes &
1360         (UINT_8)AUTH_TYPE_SHARED_KEY) {
1361
1362         DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == SHARED_KEY.\n"));
1363
1364         prAisFsmInfo->ucAvailableAuthTypes &=
1365             ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1366
1367         prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1368     }
1369     else if (prAisFsmInfo->ucAvailableAuthTypes &
1370         (UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION) {
1371
1372         DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == FAST_BSS_TRANSITION.\n"));
1373
1374         prAisFsmInfo->ucAvailableAuthTypes &=
1375             ~(UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION;
1376
1377         prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_FAST_BSS_TRANSITION;
1378     }
1379     else {
1380         ASSERT(0);
1381     }
1382
1383     //4 <5> Overwrite Connection Setting for eConnectionPolicy == ANY (Used by Assoc Req)
1384     if (prConnSettings->eConnectionPolicy == CONNECT_BY_SSID_ANY) {
1385
1386         if (prBssDesc->ucSSIDLen) {
1387             COPY_SSID(prConnSettings->aucSSID,
1388                       prConnSettings->ucSSIDLen,
1389                       prBssDesc->aucSSID,
1390                       prBssDesc->ucSSIDLen);
1391         }
1392     }
1393
1394     //4 <6> Send a Msg to trigger SAA to start JOIN process.
1395     prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1396     if (!prJoinReqMsg) {
1397
1398         ASSERT(0); // Can't trigger SAA FSM
1399         return;
1400     }
1401
1402     prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1403     prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1404     prJoinReqMsg->prStaRec = prStaRec;
1405
1406     if (1) {
1407         int j;
1408         P_FRAG_INFO_T prFragInfo;
1409         for (j = 0; j < MAX_NUM_CONCURRENT_FRAGMENTED_MSDUS; j++) {
1410             prFragInfo = &prStaRec->rFragInfo[j];
1411
1412             if (prFragInfo->pr1stFrag) {
1413                 //nicRxReturnRFB(prAdapter, prFragInfo->pr1stFrag);
1414                 prFragInfo->pr1stFrag = (P_SW_RFB_T)NULL;
1415             }
1416         }
1417     }
1418
1419     mboxSendMsg(prAdapter,
1420             MBOX_ID_0,
1421             (P_MSG_HDR_T) prJoinReqMsg,
1422             MSG_SEND_METHOD_BUF);
1423
1424     return;
1425 } /* end of aisFsmInit_JOIN() */
1426
1427
1428 /*----------------------------------------------------------------------------*/
1429 /*!
1430 * @brief Retry JOIN for AUTH_MODE_AUTO_SWITCH
1431 *
1432 * @param[in] prStaRec       Pointer to the STA_RECORD_T
1433 *
1434 * @retval TRUE      We will retry JOIN
1435 * @retval FALSE     We will not retry JOIN
1436 */
1437 /*----------------------------------------------------------------------------*/
1438 BOOLEAN
1439 aisFsmStateInit_RetryJOIN (
1440     IN P_ADAPTER_T prAdapter,
1441     P_STA_RECORD_T prStaRec
1442     )
1443 {
1444     P_AIS_FSM_INFO_T prAisFsmInfo;
1445     P_MSG_JOIN_REQ_T prJoinReqMsg;
1446
1447     DEBUGFUNC("aisFsmStateInit_RetryJOIN()");
1448
1449     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1450
1451     /* Retry other AuthType if possible */
1452     if (!prAisFsmInfo->ucAvailableAuthTypes) {
1453         return FALSE;
1454     }
1455
1456     if (prAisFsmInfo->ucAvailableAuthTypes &
1457         (UINT_8)AUTH_TYPE_SHARED_KEY) {
1458
1459         DBGLOG(AIS, INFO, ("RETRY JOIN INIT: Retry Authentication with AuthType == SHARED_KEY.\n"));
1460
1461         prAisFsmInfo->ucAvailableAuthTypes &=
1462             ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1463
1464         prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1465     }
1466     else {
1467         DBGLOG(AIS, ERROR, ("RETRY JOIN INIT: Retry Authentication with Unexpected AuthType.\n"));
1468         ASSERT(0);
1469     }
1470
1471     prAisFsmInfo->ucAvailableAuthTypes = 0; /* No more available Auth Types */
1472
1473     /* Trigger SAA to start JOIN process. */
1474     prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1475     if (!prJoinReqMsg) {
1476
1477         ASSERT(0); // Can't trigger SAA FSM
1478         return FALSE;
1479     }
1480
1481     prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1482     prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1483     prJoinReqMsg->prStaRec = prStaRec;
1484
1485     mboxSendMsg(prAdapter,
1486             MBOX_ID_0,
1487             (P_MSG_HDR_T) prJoinReqMsg,
1488             MSG_SEND_METHOD_BUF);
1489
1490     return TRUE;
1491
1492 }/* end of aisFsmRetryJOIN() */
1493
1494
1495 #if CFG_SUPPORT_ADHOC
1496 /*----------------------------------------------------------------------------*/
1497 /*!
1498 * @brief State Initialization of AIS_STATE_IBSS_ALONE
1499 *
1500 * @param (none)
1501 *
1502 * @return (none)
1503 */
1504 /*----------------------------------------------------------------------------*/
1505 VOID
1506 aisFsmStateInit_IBSS_ALONE (
1507     IN P_ADAPTER_T prAdapter
1508     )
1509 {
1510     P_AIS_FSM_INFO_T prAisFsmInfo;
1511     P_CONNECTION_SETTINGS_T prConnSettings;
1512     P_BSS_INFO_T prAisBssInfo;
1513
1514     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1515     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1516     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1517
1518     //4 <1> Check if IBSS was created before ?
1519     if (prAisBssInfo->fgIsBeaconActivated) {
1520
1521         //4 <2> Start IBSS Alone Timer for periodic SCAN and then SEARCH
1522 #if !CFG_SLT_SUPPORT
1523         cnmTimerStartTimer(prAdapter,
1524                 &prAisFsmInfo->rIbssAloneTimer,
1525                 SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
1526 #endif
1527     }
1528
1529     aisFsmCreateIBSS(prAdapter);
1530
1531     return;
1532 } /* end of aisFsmStateInit_IBSS_ALONE() */
1533
1534
1535 /*----------------------------------------------------------------------------*/
1536 /*!
1537 * @brief State Initialization of AIS_STATE_IBSS_MERGE
1538 *
1539 * @param[in] prBssDesc  The pointer of BSS_DESC_T which is the IBSS we will try to merge with.
1540 *
1541 * @return (none)
1542 */
1543 /*----------------------------------------------------------------------------*/
1544 VOID
1545 aisFsmStateInit_IBSS_MERGE (
1546     IN P_ADAPTER_T prAdapter,
1547     P_BSS_DESC_T prBssDesc
1548     )
1549 {
1550     P_AIS_FSM_INFO_T prAisFsmInfo;
1551     P_CONNECTION_SETTINGS_T prConnSettings;
1552     P_BSS_INFO_T prAisBssInfo;
1553     P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
1554
1555
1556     ASSERT(prBssDesc);
1557
1558     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1559     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1560     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1561
1562     //4 <1> We will merge with to this BSS immediately.
1563     prBssDesc->fgIsConnecting = FALSE;
1564     prBssDesc->fgIsConnected = TRUE;
1565
1566     //4 <2> Setup corresponding STA_RECORD_T
1567     prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1568             STA_TYPE_ADHOC_PEER,
1569             NETWORK_TYPE_AIS_INDEX,
1570             prBssDesc);
1571
1572     prStaRec->fgIsMerging = TRUE;
1573
1574     prAisFsmInfo->prTargetStaRec = prStaRec;
1575
1576     //4 <2.1> sync. to firmware domain
1577     cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1578
1579     //4 <3> IBSS-Merge
1580     aisFsmMergeIBSS(prAdapter, prStaRec);
1581
1582     return;
1583 } /* end of aisFsmStateInit_IBSS_MERGE() */
1584
1585 #endif /* CFG_SUPPORT_ADHOC */
1586
1587
1588 /*----------------------------------------------------------------------------*/
1589 /*!
1590 * @brief Process of JOIN Abort
1591 *
1592 * @param (none)
1593 *
1594 * @return (none)
1595 */
1596 /*----------------------------------------------------------------------------*/
1597 VOID
1598 aisFsmStateAbort_JOIN (
1599     IN P_ADAPTER_T prAdapter
1600     )
1601 {
1602     P_AIS_FSM_INFO_T prAisFsmInfo;
1603     P_MSG_JOIN_ABORT_T prJoinAbortMsg;
1604
1605     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1606
1607     /* 1. Abort JOIN process */
1608     prJoinAbortMsg = (P_MSG_JOIN_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_ABORT_T));
1609     if (!prJoinAbortMsg) {
1610
1611         ASSERT(0); // Can't abort SAA FSM
1612         return;
1613     }
1614
1615     prJoinAbortMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_ABORT;
1616     prJoinAbortMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfReqMsg;
1617     prJoinAbortMsg->prStaRec = prAisFsmInfo->prTargetStaRec;
1618
1619     scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisFsmInfo->prTargetStaRec->aucMacAddr);
1620
1621     mboxSendMsg(prAdapter,
1622             MBOX_ID_0,
1623             (P_MSG_HDR_T) prJoinAbortMsg,
1624             MSG_SEND_METHOD_BUF);
1625
1626     /* 2. Return channel privilege */
1627     aisFsmReleaseCh(prAdapter);
1628
1629     /* 3.1 stop join timeout timer */
1630     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1631
1632     /* 3.2 reset local variable */
1633     prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1634
1635     return;
1636 } /* end of aisFsmAbortJOIN() */
1637
1638
1639 /*----------------------------------------------------------------------------*/
1640 /*!
1641 * @brief Process of SCAN Abort
1642 *
1643 * @param (none)
1644 *
1645 * @return (none)
1646 */
1647 /*----------------------------------------------------------------------------*/
1648 VOID
1649 aisFsmStateAbort_SCAN (
1650     IN P_ADAPTER_T prAdapter
1651     )
1652 {
1653     P_AIS_FSM_INFO_T prAisFsmInfo;
1654     P_MSG_SCN_SCAN_CANCEL prScanCancelMsg;
1655
1656     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1657
1658     /* Abort JOIN process. */
1659     prScanCancelMsg = (P_MSG_SCN_SCAN_CANCEL)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
1660     if (!prScanCancelMsg) {
1661
1662         ASSERT(0); // Can't abort SCN FSM
1663         return;
1664     }
1665
1666     prScanCancelMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_CANCEL;
1667     prScanCancelMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfScanReq;
1668     prScanCancelMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX;
1669 #if CFG_ENABLE_WIFI_DIRECT
1670     if(prAdapter->fgIsP2PRegistered) {
1671         prScanCancelMsg->fgIsChannelExt = FALSE;
1672     }
1673 #endif
1674
1675     /* unbuffered message to guarantee scan is cancelled in sequence */
1676     mboxSendMsg(prAdapter,
1677             MBOX_ID_0,
1678             (P_MSG_HDR_T) prScanCancelMsg,
1679             MSG_SEND_METHOD_UNBUF);
1680
1681     return;
1682 } /* end of aisFsmAbortSCAN() */
1683
1684
1685 /*----------------------------------------------------------------------------*/
1686 /*!
1687 * @brief Process of NORMAL_TR Abort
1688 *
1689 * @param (none)
1690 *
1691 * @return (none)
1692 */
1693 /*----------------------------------------------------------------------------*/
1694 VOID
1695 aisFsmStateAbort_NORMAL_TR (
1696     IN P_ADAPTER_T prAdapter
1697     )
1698 {
1699     P_AIS_FSM_INFO_T prAisFsmInfo;
1700
1701     ASSERT(prAdapter);
1702     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1703
1704     /* TODO(Kevin): Do abort other MGMT func */
1705
1706     /* 1. Release channel to CNM */
1707     aisFsmReleaseCh(prAdapter);
1708
1709     /* 2.1 stop join timeout timer */
1710     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1711
1712     /* 2.2 reset local variable */
1713     prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1714
1715     return;
1716 } /* end of aisFsmAbortNORMAL_TR() */
1717
1718
1719 #if CFG_SUPPORT_ADHOC
1720 /*----------------------------------------------------------------------------*/
1721 /*!
1722 * @brief Process of NORMAL_TR Abort
1723 *
1724 * @param (none)
1725 *
1726 * @return (none)
1727 */
1728 /*----------------------------------------------------------------------------*/
1729 VOID
1730 aisFsmStateAbort_IBSS (
1731     IN P_ADAPTER_T prAdapter
1732     )
1733 {
1734     P_AIS_FSM_INFO_T prAisFsmInfo;
1735     P_BSS_DESC_T prBssDesc;
1736
1737     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1738
1739     // reset BSS-DESC
1740     if (prAisFsmInfo->prTargetStaRec) {
1741         prBssDesc = scanSearchBssDescByTA(prAdapter,
1742                 prAisFsmInfo->prTargetStaRec->aucMacAddr);
1743
1744         if (prBssDesc) {
1745             prBssDesc->fgIsConnected = FALSE;
1746             prBssDesc->fgIsConnecting = FALSE;
1747         }
1748     }
1749
1750     // release channel privilege
1751     aisFsmReleaseCh(prAdapter);
1752
1753     return;
1754 }
1755 #endif /* CFG_SUPPORT_ADHOC */
1756
1757
1758 /*----------------------------------------------------------------------------*/
1759 /*!
1760 * @brief The Core FSM engine of AIS(Ad-hoc, Infra STA)
1761 *
1762 * @param[in] eNextState Enum value of next AIS STATE
1763 *
1764 * @return (none)
1765 */
1766 /*----------------------------------------------------------------------------*/
1767 VOID
1768 aisFsmSteps (
1769     IN P_ADAPTER_T prAdapter,
1770     ENUM_AIS_STATE_T eNextState
1771     )
1772 {
1773     P_AIS_FSM_INFO_T prAisFsmInfo;
1774     P_BSS_INFO_T prAisBssInfo;
1775     P_CONNECTION_SETTINGS_T prConnSettings;
1776     P_BSS_DESC_T prBssDesc;
1777     P_MSG_CH_REQ_T prMsgChReq;
1778     P_MSG_SCN_SCAN_REQ prScanReqMsg;
1779     P_AIS_REQ_HDR_T prAisReq;
1780     ENUM_BAND_T eBand;
1781     UINT_8 ucChannel;
1782     UINT_16 u2ScanIELen;
1783
1784     BOOLEAN fgIsTransition = (BOOLEAN)FALSE;
1785
1786     DEBUGFUNC("aisFsmSteps()");
1787
1788     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1789     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1790     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1791
1792     do {
1793
1794         /* Do entering Next State */
1795         prAisFsmInfo->ePreviousState = prAisFsmInfo->eCurrentState;
1796
1797 #if DBG
1798         DBGLOG(AIS, STATE, ("TRANSITION: [%s] -> [%s]\n",
1799                             apucDebugAisState[prAisFsmInfo->eCurrentState],
1800                             apucDebugAisState[eNextState]));
1801 #else
1802         DBGLOG(AIS, STATE, ("[%d] TRANSITION: [%d] -> [%d]\n",
1803                             DBG_AIS_IDX,
1804                             prAisFsmInfo->eCurrentState,
1805                             eNextState));
1806 #endif
1807         /* NOTE(Kevin): This is the only place to change the eCurrentState(except initial) */
1808         prAisFsmInfo->eCurrentState = eNextState;
1809
1810         fgIsTransition = (BOOLEAN)FALSE;
1811
1812         /* Do tasks of the State that we just entered */
1813         switch (prAisFsmInfo->eCurrentState) {
1814         /* NOTE(Kevin): we don't have to rearrange the sequence of following
1815          * switch case. Instead I would like to use a common lookup table of array
1816          * of function pointer to speed up state search.
1817          */
1818         case AIS_STATE_IDLE:
1819
1820             prAisReq = aisFsmGetNextRequest(prAdapter);
1821
1822             if(prAisReq == NULL || prAisReq->eReqType == AIS_REQUEST_RECONNECT) {
1823                 if (prConnSettings->fgIsConnReqIssued) {
1824
1825                     prAisFsmInfo->fgTryScan = TRUE;
1826
1827                     SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1828                     SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1829
1830                     // sync with firmware
1831                     nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1832
1833                     // reset trial count
1834                     prAisFsmInfo->ucConnTrialCount = 0;
1835
1836                     eNextState = AIS_STATE_SEARCH;
1837                     fgIsTransition = TRUE;
1838                 }
1839                 else {
1840                     UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1841                     SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1842
1843                     // sync with firmware
1844                     nicDeactivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1845
1846                     // check for other pending request
1847                     if(prAisReq) {
1848                         if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
1849                             wlanClearScanningResult(prAdapter);
1850                             eNextState = AIS_STATE_SCAN;
1851
1852                             fgIsTransition = TRUE;
1853                         }
1854                     }
1855                 }
1856
1857                 if(prAisReq) {
1858                     /* free the message */
1859                     cnmMemFree(prAdapter, prAisReq);
1860                 }
1861             }
1862             else if(prAisReq->eReqType == AIS_REQUEST_SCAN) {
1863 #if CFG_SUPPORT_ROAMING
1864                 prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1865 #endif /* CFG_SUPPORT_ROAMING */
1866                 wlanClearScanningResult(prAdapter);
1867
1868                 eNextState = AIS_STATE_SCAN;
1869                 fgIsTransition = TRUE;
1870
1871                 /* free the message */
1872                 cnmMemFree(prAdapter, prAisReq);
1873             }
1874             else if(prAisReq->eReqType == AIS_REQUEST_ROAMING_CONNECT || prAisReq->eReqType == AIS_REQUEST_ROAMING_SEARCH) {
1875                 /* ignore */
1876                 /* free the message */
1877                 cnmMemFree(prAdapter, prAisReq);
1878             }
1879
1880             prAisFsmInfo->u4SleepInterval = AIS_BG_SCAN_INTERVAL_MIN_SEC;
1881
1882             break;
1883
1884         case AIS_STATE_SEARCH:
1885             //4 <1> Search for a matched candidate and save it to prTargetBssDesc.
1886 #if CFG_SLT_SUPPORT
1887             prBssDesc = prAdapter->rWifiVar.rSltInfo.prPseudoBssDesc;
1888 #else
1889             prBssDesc = scanSearchBssDescByPolicy(prAdapter, NETWORK_TYPE_AIS_INDEX);
1890 #endif
1891
1892             // we are under Roaming Condition.
1893             if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
1894                 if(prAisFsmInfo->ucConnTrialCount > AIS_ROAMING_CONNECTION_TRIAL_LIMIT) {
1895 #if CFG_SUPPORT_ROAMING
1896                     roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_CONNLIMIT);
1897 #endif /* CFG_SUPPORT_ROAMING */
1898                     // reset retry count
1899                     prAisFsmInfo->ucConnTrialCount = 0;
1900
1901                     // abort connection trial
1902                     prConnSettings->fgIsConnReqIssued = FALSE;
1903
1904                     eNextState = AIS_STATE_NORMAL_TR;
1905                     fgIsTransition = TRUE;
1906
1907                     break;
1908                 }
1909             }
1910
1911             //4 <2> We are not under Roaming Condition.
1912             if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1913
1914                 //4 <2.a> If we have the matched one
1915                 if (prBssDesc) {
1916
1917                     //4 <A> Stored the Selected BSS security cipher. For later asoc req compose IE
1918                     prAisBssInfo->u4RsnSelectedGroupCipher =
1919                         prBssDesc->u4RsnSelectedGroupCipher;
1920                     prAisBssInfo->u4RsnSelectedPairwiseCipher =
1921                         prBssDesc->u4RsnSelectedPairwiseCipher;
1922                     prAisBssInfo->u4RsnSelectedAKMSuite =
1923                         prBssDesc->u4RsnSelectedAKMSuite;
1924
1925                     //4 <B> Do STATE transition and update current Operation Mode.
1926                     if (prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE) {
1927
1928                         prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
1929
1930                         /* Record the target BSS_DESC_T for next STATE. */
1931                         prAisFsmInfo->prTargetBssDesc = prBssDesc;
1932
1933                         /* Transit to channel acquire */
1934                         eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
1935                         fgIsTransition = TRUE;
1936
1937                         // increase connection trial count
1938                         prAisFsmInfo->ucConnTrialCount++;
1939                     }
1940 #if CFG_SUPPORT_ADHOC
1941                     else if (prBssDesc->eBSSType == BSS_TYPE_IBSS) {
1942
1943                         prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
1944
1945                         /* Record the target BSS_DESC_T for next STATE. */
1946                         prAisFsmInfo->prTargetBssDesc = prBssDesc;
1947
1948                         eNextState = AIS_STATE_IBSS_MERGE;
1949                         fgIsTransition = TRUE;
1950                     }
1951 #endif /* CFG_SUPPORT_ADHOC */
1952                     else {
1953                         ASSERT(0);
1954                         eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
1955                         fgIsTransition = TRUE;
1956                     }
1957                 }
1958                 //4 <2.b> If we don't have the matched one
1959                 else {
1960
1961                     // increase connection trial count for infrastructure connection
1962                     if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
1963                         prAisFsmInfo->ucConnTrialCount++;
1964                     }
1965
1966                     //4 <A> Try to SCAN
1967                     if (prAisFsmInfo->fgTryScan) {
1968                         eNextState = AIS_STATE_LOOKING_FOR;
1969
1970                         fgIsTransition = TRUE;
1971                     }
1972                     //4 <B> We've do SCAN already, now wait in some STATE.
1973                     else {
1974                         if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
1975
1976                             /* issue reconnect request, and retreat to idle state for scheduling */
1977                             aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
1978
1979                             eNextState = AIS_STATE_IDLE;
1980                             fgIsTransition = TRUE;
1981                         }
1982 #if CFG_SUPPORT_ADHOC
1983                         else if ((prConnSettings->eOPMode == NET_TYPE_IBSS)
1984                                     || (prConnSettings->eOPMode == NET_TYPE_AUTO_SWITCH)
1985                                     || (prConnSettings->eOPMode == NET_TYPE_DEDICATED_IBSS)) {
1986
1987                             prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
1988                             prAisFsmInfo->prTargetBssDesc = NULL;
1989
1990                             eNextState = AIS_STATE_IBSS_ALONE;
1991                             fgIsTransition = TRUE;
1992                         }
1993 #endif /* CFG_SUPPORT_ADHOC */
1994                         else {
1995                             ASSERT(0);
1996                             eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
1997                             fgIsTransition = TRUE;
1998                         }
1999                     }
2000                 }
2001             }
2002             //4 <3> We are under Roaming Condition.
2003             else { // prAdapter->eConnectionState == MEDIA_STATE_CONNECTED.
2004
2005                 //4 <3.a> This BSS_DESC_T is our AP.
2006                 /* NOTE(Kevin 2008/05/16): Following cases will go back to NORMAL_TR.
2007                  * CASE I: During Roaming, APP(WZC/NDISTEST) change the connection
2008                  *         settings. That make we can NOT match the original AP, so the
2009                  *         prBssDesc is NULL.
2010                  * CASE II: The same reason as CASE I. Because APP change the
2011                  *          eOPMode to other network type in connection setting
2012                  *          (e.g. NET_TYPE_IBSS), so the BssDesc become the IBSS node.
2013                  * (For CASE I/II, before WZC/NDISTEST set the OID_SSID, it will change
2014                  * other parameters in connection setting first. So if we do roaming
2015                  * at the same time, it will hit these cases.)
2016                  *
2017                  * CASE III: Normal case, we can't find other candidate to roam
2018                  * out, so only the current AP will be matched.
2019                  */
2020                 if ((!prBssDesc) || /* CASE I */
2021                     (prBssDesc->eBSSType != BSS_TYPE_INFRASTRUCTURE) || /* CASE II */
2022                     (prBssDesc->fgIsConnected) /* CASE III */) {
2023 #if DBG
2024                     if ((prBssDesc) &&
2025                         (prBssDesc->fgIsConnected)) {
2026                         ASSERT(EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2027                     }
2028 #endif /* DBG */
2029                     /* We already associated with it, go back to NORMAL_TR */
2030                     /* TODO(Kevin): Roaming Fail */
2031 #if CFG_SUPPORT_ROAMING
2032                     roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_NOCANDIDATE);
2033 #endif /* CFG_SUPPORT_ROAMING */
2034
2035                     /* Retreat to NORMAL_TR state */
2036                     eNextState = AIS_STATE_NORMAL_TR;
2037                     fgIsTransition = TRUE;
2038                 }
2039                 //4 <3.b> Try to roam out for JOIN this BSS_DESC_T.
2040                 else {
2041 #if DBG
2042                     ASSERT(UNEQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2043 #endif /* DBG */
2044
2045                     //4 <A> Record the target BSS_DESC_T for next STATE.
2046                     prAisFsmInfo->prTargetBssDesc = prBssDesc;
2047
2048                     // tyhsu: increase connection trial count
2049                     prAisFsmInfo->ucConnTrialCount++;
2050
2051                     /* Transit to channel acquire */
2052                     eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
2053                     fgIsTransition = TRUE;
2054                 }
2055             }
2056
2057             break;
2058
2059         case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2060
2061             DBGLOG(AIS, LOUD, ("SCAN: Idle Begin - Current Time = %ld\n", kalGetTimeTick()));
2062
2063             cnmTimerStartTimer(prAdapter,
2064                     &prAisFsmInfo->rBGScanTimer,
2065                     SEC_TO_MSEC(prAisFsmInfo->u4SleepInterval));
2066
2067             SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2068
2069             if (prAisFsmInfo->u4SleepInterval < AIS_BG_SCAN_INTERVAL_MAX_SEC) {
2070                 prAisFsmInfo->u4SleepInterval <<= 1;
2071             }
2072             break;
2073
2074         case AIS_STATE_SCAN:
2075         case AIS_STATE_ONLINE_SCAN:
2076         case AIS_STATE_LOOKING_FOR:
2077
2078             if(!IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX)) {
2079                 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2080
2081                 // sync with firmware
2082                 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
2083             }
2084
2085             /* IE length decision */
2086             if(prAisFsmInfo->u4ScanIELength > 0) {
2087                 u2ScanIELen = (UINT_16)prAisFsmInfo->u4ScanIELength;
2088             }
2089             else {
2090 #if CFG_SUPPORT_WPS2
2091                 u2ScanIELen = prAdapter->prGlueInfo->u2WSCIELen;
2092 #else
2093                 u2ScanIELen = 0;
2094 #endif
2095             }
2096
2097             prScanReqMsg = (P_MSG_SCN_SCAN_REQ)cnmMemAlloc(prAdapter,
2098                     RAM_TYPE_MSG,
2099                     OFFSET_OF(MSG_SCN_SCAN_REQ, aucIE) + u2ScanIELen);
2100             if (!prScanReqMsg) {
2101                 ASSERT(0); // Can't trigger SCAN FSM
2102                 return;
2103             }
2104
2105             prScanReqMsg->rMsgHdr.eMsgId    = MID_AIS_SCN_SCAN_REQ;
2106             prScanReqMsg->ucSeqNum          = ++prAisFsmInfo->ucSeqNumOfScanReq;
2107             prScanReqMsg->ucNetTypeIndex    = (UINT_8)NETWORK_TYPE_AIS_INDEX;
2108
2109 #if CFG_SUPPORT_RDD_TEST_MODE
2110             prScanReqMsg->eScanType         = SCAN_TYPE_PASSIVE_SCAN;
2111 #else
2112             prScanReqMsg->eScanType         = SCAN_TYPE_ACTIVE_SCAN;
2113 #endif
2114
2115             if(prAisFsmInfo->eCurrentState == AIS_STATE_SCAN
2116                     || prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
2117                 if(prAisFsmInfo->ucScanSSIDLen == 0) {
2118                     /* Scan for all available SSID */
2119                     prScanReqMsg->ucSSIDType        = SCAN_REQ_SSID_WILDCARD;
2120                 }
2121                 else {
2122                     prScanReqMsg->ucSSIDType        = SCAN_REQ_SSID_SPECIFIED;
2123                     COPY_SSID(prScanReqMsg->aucSSID,
2124                             prScanReqMsg->ucSSIDLength,
2125                             prAisFsmInfo->aucScanSSID,
2126                             prAisFsmInfo->ucScanSSIDLen);
2127                 }
2128             }
2129             else {
2130                 /* Scan for determined SSID */
2131                 prScanReqMsg->ucSSIDType        = SCAN_REQ_SSID_SPECIFIED;
2132                 COPY_SSID(prScanReqMsg->aucSSID,
2133                         prScanReqMsg->ucSSIDLength,
2134                         prConnSettings->aucSSID,
2135                         prConnSettings->ucSSIDLen);
2136             }
2137
2138             /* check if tethering is running and need to fix on specific channel */
2139             if(cnmAisInfraChannelFixed(prAdapter, &eBand, &ucChannel) == TRUE) {
2140                 prScanReqMsg->eScanChannel      = SCAN_CHANNEL_SPECIFIED;
2141                 prScanReqMsg->ucChannelListNum  = 1;
2142                 prScanReqMsg->arChnlInfoList[0].eBand
2143                     = eBand;;
2144                 prScanReqMsg->arChnlInfoList[0].ucChannelNum
2145                     = ucChannel;
2146             }
2147             else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_NULL) {
2148                 if(prAdapter->fgEnable5GBand == TRUE) {
2149                     prScanReqMsg->eScanChannel      = SCAN_CHANNEL_FULL;
2150                 }
2151                 else {
2152                     prScanReqMsg->eScanChannel      = SCAN_CHANNEL_2G4;
2153                 }
2154             }
2155             else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_2G4) {
2156                 prScanReqMsg->eScanChannel      = SCAN_CHANNEL_2G4;
2157             }
2158             else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_5G) {
2159                 prScanReqMsg->eScanChannel      = SCAN_CHANNEL_5G;
2160             }
2161             else {
2162                 prScanReqMsg->eScanChannel      = SCAN_CHANNEL_FULL;
2163                 ASSERT(0);
2164             }
2165
2166             if(prAisFsmInfo->u4ScanIELength > 0) {
2167                 kalMemCopy(prScanReqMsg->aucIE, prAisFsmInfo->aucScanIEBuf, prAisFsmInfo->u4ScanIELength);
2168             }
2169             else {
2170 #if CFG_SUPPORT_WPS2
2171                 if(prAdapter->prGlueInfo->u2WSCIELen > 0) {
2172                             kalMemCopy(prScanReqMsg->aucIE, &prAdapter->prGlueInfo->aucWSCIE, prAdapter->prGlueInfo->u2WSCIELen);
2173                 }
2174             }
2175 #endif
2176
2177             prScanReqMsg->u2IELen = u2ScanIELen;
2178
2179             mboxSendMsg(prAdapter,
2180                     MBOX_ID_0,
2181                     (P_MSG_HDR_T) prScanReqMsg,
2182                     MSG_SEND_METHOD_BUF);
2183
2184             prAisFsmInfo->fgTryScan = FALSE; /* Will enable background sleep for infrastructure */
2185
2186             break;
2187
2188         case AIS_STATE_REQ_CHANNEL_JOIN:
2189             /* send message to CNM for acquiring channel */
2190             prMsgChReq = (P_MSG_CH_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
2191             if (!prMsgChReq) {
2192                 ASSERT(0); // Can't indicate CNM for channel acquiring
2193                 return;
2194             }
2195
2196             prMsgChReq->rMsgHdr.eMsgId      = MID_MNY_CNM_CH_REQ;
2197             prMsgChReq->ucNetTypeIndex      = NETWORK_TYPE_AIS_INDEX;
2198             prMsgChReq->ucTokenID           = ++prAisFsmInfo->ucSeqNumOfChReq;
2199             prMsgChReq->eReqType            = CH_REQ_TYPE_JOIN;
2200             prMsgChReq->u4MaxInterval       = AIS_JOIN_CH_REQUEST_INTERVAL;
2201             prMsgChReq->ucPrimaryChannel    = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
2202             prMsgChReq->eRfSco              = prAisFsmInfo->prTargetBssDesc->eSco;
2203             prMsgChReq->eRfBand             = prAisFsmInfo->prTargetBssDesc->eBand;
2204             COPY_MAC_ADDR(prMsgChReq->aucBSSID, prAisFsmInfo->prTargetBssDesc->aucBSSID);
2205
2206             mboxSendMsg(prAdapter,
2207                     MBOX_ID_0,
2208                     (P_MSG_HDR_T) prMsgChReq,
2209                     MSG_SEND_METHOD_BUF);
2210
2211             prAisFsmInfo->fgIsChannelRequested = TRUE;
2212             break;
2213
2214         case AIS_STATE_JOIN:
2215             aisFsmStateInit_JOIN(prAdapter, prAisFsmInfo->prTargetBssDesc);
2216             break;
2217
2218 #if CFG_SUPPORT_ADHOC
2219         case AIS_STATE_IBSS_ALONE:
2220             aisFsmStateInit_IBSS_ALONE(prAdapter);
2221             break;
2222
2223         case AIS_STATE_IBSS_MERGE:
2224             aisFsmStateInit_IBSS_MERGE(prAdapter, prAisFsmInfo->prTargetBssDesc);
2225             break;
2226 #endif /* CFG_SUPPORT_ADHOC */
2227
2228         case AIS_STATE_NORMAL_TR:
2229             if(prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
2230                 /* Don't do anything when rJoinTimeoutTimer is still ticking */
2231             }
2232             else {
2233                 /* 1. Process for pending scan */
2234                 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
2235                     wlanClearScanningResult(prAdapter);
2236                     eNextState = AIS_STATE_ONLINE_SCAN;
2237                     fgIsTransition = TRUE;
2238                 }
2239                 /* 2. Process for pending roaming scan */
2240                 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE) == TRUE) {
2241                     eNextState = AIS_STATE_LOOKING_FOR;
2242                     fgIsTransition = TRUE;
2243                 }
2244                 /* 3. Process for pending roaming scan */
2245                 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE) == TRUE) {
2246                     eNextState = AIS_STATE_SEARCH;
2247                     fgIsTransition = TRUE;
2248                 }
2249             }
2250
2251             break;
2252
2253         case AIS_STATE_DISCONNECTING:
2254             /* send for deauth frame for disconnection */
2255             authSendDeauthFrame(prAdapter,
2256                     prAisBssInfo->prStaRecOfAP,
2257                     (P_SW_RFB_T)NULL,
2258                     REASON_CODE_DEAUTH_LEAVING_BSS,
2259                     aisDeauthXmitComplete);
2260             break;
2261
2262         default:
2263             ASSERT(0); /* Make sure we have handle all STATEs */
2264             break;
2265
2266         }
2267     }
2268     while (fgIsTransition);
2269
2270     return;
2271
2272 } /* end of aisFsmSteps() */
2273
2274
2275 /*----------------------------------------------------------------------------*/
2276 /*!
2277 * \brief
2278 *
2279 * \param[in]
2280 *
2281 * \return none
2282 */
2283 /*----------------------------------------------------------------------------*/
2284 VOID
2285 aisFsmRunEventScanDone (
2286     IN P_ADAPTER_T prAdapter,
2287     IN P_MSG_HDR_T prMsgHdr
2288     )
2289 {
2290     P_MSG_SCN_SCAN_DONE prScanDoneMsg;
2291     P_AIS_FSM_INFO_T prAisFsmInfo;
2292     ENUM_AIS_STATE_T eNextState;
2293     UINT_8 ucSeqNumOfCompMsg;
2294     P_CONNECTION_SETTINGS_T prConnSettings;
2295
2296     DEBUGFUNC("aisFsmRunEventScanDone()");
2297
2298     ASSERT(prAdapter);
2299     ASSERT(prMsgHdr);
2300
2301     DBGLOG(AIS, LOUD, ("EVENT-SCAN DONE: Current Time = %ld\n", kalGetTimeTick()));
2302
2303     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2304     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2305
2306     prScanDoneMsg = (P_MSG_SCN_SCAN_DONE)prMsgHdr;
2307     ASSERT(prScanDoneMsg->ucNetTypeIndex == (UINT_8)NETWORK_TYPE_AIS_INDEX);
2308
2309     ucSeqNumOfCompMsg = prScanDoneMsg->ucSeqNum;
2310     cnmMemFree(prAdapter, prMsgHdr);
2311
2312     eNextState = prAisFsmInfo->eCurrentState;
2313
2314     if (ucSeqNumOfCompMsg != prAisFsmInfo->ucSeqNumOfScanReq) {
2315         DBGLOG(AIS, WARN, ("SEQ NO of AIS SCN DONE MSG is not matched.\n"));
2316     }
2317     else {
2318         switch (prAisFsmInfo->eCurrentState) {
2319         case AIS_STATE_SCAN:
2320             prConnSettings->fgIsScanReqIssued = FALSE;
2321
2322             /* reset scan IE buffer */
2323             prAisFsmInfo->u4ScanIELength = 0;
2324
2325             kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2326             eNextState = AIS_STATE_IDLE;
2327
2328             break;
2329
2330         case AIS_STATE_ONLINE_SCAN:
2331             prConnSettings->fgIsScanReqIssued = FALSE;
2332
2333             /* reset scan IE buffer */
2334             prAisFsmInfo->u4ScanIELength = 0;
2335
2336             kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2337 #if CFG_SUPPORT_ROAMING
2338             eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2339 #else
2340             eNextState = AIS_STATE_NORMAL_TR;
2341 #endif /* CFG_SUPPORT_ROAMING */
2342
2343             break;
2344
2345         case AIS_STATE_LOOKING_FOR:
2346 #if CFG_SUPPORT_ROAMING
2347             eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2348 #else
2349             eNextState = AIS_STATE_SEARCH;
2350 #endif /* CFG_SUPPORT_ROAMING */
2351             break;
2352
2353         default:
2354             break;
2355
2356         }
2357     }
2358
2359     if (eNextState != prAisFsmInfo->eCurrentState) {
2360         aisFsmSteps(prAdapter, eNextState);
2361     }
2362
2363     return;
2364 } /* end of aisFsmRunEventScanDone() */
2365
2366
2367 /*----------------------------------------------------------------------------*/
2368 /*!
2369 * \brief
2370 *
2371 * \param[in]
2372 *
2373 * \return none
2374 */
2375 /*----------------------------------------------------------------------------*/
2376 VOID
2377 aisFsmRunEventAbort (
2378     IN P_ADAPTER_T prAdapter,
2379     IN P_MSG_HDR_T prMsgHdr
2380     )
2381 {
2382     P_MSG_AIS_ABORT_T prAisAbortMsg;
2383     P_AIS_FSM_INFO_T prAisFsmInfo;
2384     UINT_8 ucReasonOfDisconnect;
2385     BOOLEAN fgDelayIndication;
2386
2387     DEBUGFUNC("aisFsmRunEventAbort()");
2388
2389     ASSERT(prAdapter);
2390     ASSERT(prMsgHdr);
2391     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2392
2393     //4 <1> Extract information of Abort Message and then free memory.
2394     prAisAbortMsg = (P_MSG_AIS_ABORT_T)prMsgHdr;
2395     ucReasonOfDisconnect = prAisAbortMsg->ucReasonOfDisconnect;
2396     fgDelayIndication = prAisAbortMsg->fgDelayIndication;
2397
2398     cnmMemFree(prAdapter, prMsgHdr);
2399
2400 #if DBG
2401     DBGLOG(AIS, LOUD, ("EVENT-ABORT: Current State %s\n",
2402         apucDebugAisState[prAisFsmInfo->eCurrentState]));
2403 #else
2404     DBGLOG(AIS, LOUD, ("[%d] EVENT-ABORT: Current State [%d]\n",
2405         DBG_AIS_IDX,
2406             prAisFsmInfo->eCurrentState));
2407 #endif
2408
2409     //4 <2> clear previous pending connection request and insert new one
2410     aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
2411     aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2412
2413     if(prAisFsmInfo->eCurrentState != AIS_STATE_DISCONNECTING) {
2414         //4 <3> invoke abort handler
2415         aisFsmStateAbort(prAdapter, ucReasonOfDisconnect, fgDelayIndication);
2416     }
2417
2418     return;
2419 } /* end of aisFsmRunEventAbort() */
2420
2421
2422 /*----------------------------------------------------------------------------*/
2423 /*!
2424 * \brief        This function handles AIS-FSM abort event/command
2425 *
2426 * \param[in] prAdapter              Pointer of ADAPTER_T
2427 *            ucReasonOfDisconnect   Reason for disonnection
2428 *            fgDelayIndication      Option to delay disconnection indication
2429 *
2430 * \return none
2431 */
2432 /*----------------------------------------------------------------------------*/
2433 VOID
2434 aisFsmStateAbort (
2435     IN P_ADAPTER_T prAdapter,
2436     UINT_8         ucReasonOfDisconnect,
2437     BOOLEAN        fgDelayIndication
2438     )
2439 {
2440     P_AIS_FSM_INFO_T prAisFsmInfo;
2441     P_BSS_INFO_T prAisBssInfo;
2442     P_CONNECTION_SETTINGS_T prConnSettings;
2443     BOOLEAN fgIsCheckConnected;
2444
2445     ASSERT(prAdapter);
2446
2447     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2448     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2449     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2450     fgIsCheckConnected = FALSE;
2451
2452     //4 <1> Save information of Abort Message and then free memory.
2453     prAisBssInfo->ucReasonOfDisconnect = ucReasonOfDisconnect;
2454
2455     //4 <2> Abort current job.
2456     switch (prAisFsmInfo->eCurrentState) {
2457     case AIS_STATE_IDLE:
2458     case AIS_STATE_SEARCH:
2459         break;
2460
2461     case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2462         /* Do cancel timer */
2463         cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
2464
2465         /* in case roaming is triggered */
2466         fgIsCheckConnected = TRUE;
2467         break;
2468
2469     case AIS_STATE_SCAN:
2470         /* Do abort SCAN */
2471         aisFsmStateAbort_SCAN(prAdapter);
2472
2473         /* queue for later handling */
2474         if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2475             aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2476         }
2477
2478         break;
2479
2480     case AIS_STATE_LOOKING_FOR:
2481           /* Do abort SCAN */
2482         aisFsmStateAbort_SCAN(prAdapter);
2483
2484         /* in case roaming is triggered */
2485         fgIsCheckConnected = TRUE;
2486         break;
2487
2488     case AIS_STATE_REQ_CHANNEL_JOIN:
2489         /* Release channel to CNM */
2490         aisFsmReleaseCh(prAdapter);
2491
2492         /* in case roaming is triggered */
2493         fgIsCheckConnected = TRUE;
2494         break;
2495
2496     case AIS_STATE_JOIN:
2497         /* Do abort JOIN */
2498         aisFsmStateAbort_JOIN(prAdapter);
2499
2500         /* in case roaming is triggered */
2501         fgIsCheckConnected = TRUE;
2502         break;
2503
2504 #if CFG_SUPPORT_ADHOC
2505     case AIS_STATE_IBSS_ALONE:
2506     case AIS_STATE_IBSS_MERGE:
2507         aisFsmStateAbort_IBSS(prAdapter);
2508         break;
2509 #endif /* CFG_SUPPORT_ADHOC */
2510
2511     case AIS_STATE_ONLINE_SCAN:
2512         /* Do abort SCAN */
2513         aisFsmStateAbort_SCAN(prAdapter);
2514
2515         /* queue for later handling */
2516         if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2517             aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2518         }
2519
2520         fgIsCheckConnected = TRUE;
2521         break;
2522
2523     case AIS_STATE_NORMAL_TR:
2524         fgIsCheckConnected = TRUE;
2525         break;
2526
2527     case AIS_STATE_DISCONNECTING:
2528         /* Do abort NORMAL_TR */
2529         aisFsmStateAbort_NORMAL_TR(prAdapter);
2530
2531         break;
2532
2533     default:
2534         break;
2535     }
2536
2537     if (fgIsCheckConnected &&
2538        (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState)) {
2539
2540         /* switch into DISCONNECTING state for sending DEAUTH if necessary */
2541         if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE &&
2542                 prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_NEW_CONNECTION &&
2543                 prAisBssInfo->prStaRecOfAP &&
2544                 prAisBssInfo->prStaRecOfAP->fgIsInUse) {
2545             aisFsmSteps(prAdapter, AIS_STATE_DISCONNECTING);
2546
2547             return;
2548         }
2549         else {
2550             /* Do abort NORMAL_TR */
2551             aisFsmStateAbort_NORMAL_TR(prAdapter);
2552         }
2553     }
2554
2555     aisFsmDisconnect(prAdapter, fgDelayIndication);
2556
2557     return;
2558
2559 } /* end of aisFsmStateAbort() */
2560
2561
2562 /*----------------------------------------------------------------------------*/
2563 /*!
2564 * @brief This function will handle the Join Complete Event from SAA FSM for AIS FSM
2565 *
2566 * @param[in] prMsgHdr   Message of Join Complete of SAA FSM.
2567 *
2568 * @return (none)
2569 */
2570 /*----------------------------------------------------------------------------*/
2571 VOID
2572 aisFsmRunEventJoinComplete (
2573     IN P_ADAPTER_T prAdapter,
2574     IN P_MSG_HDR_T prMsgHdr
2575     )
2576 {
2577     P_MSG_JOIN_COMP_T prJoinCompMsg;
2578     P_AIS_FSM_INFO_T prAisFsmInfo;
2579     ENUM_AIS_STATE_T eNextState;
2580     P_STA_RECORD_T prStaRec;
2581     P_SW_RFB_T prAssocRspSwRfb;
2582
2583     DEBUGFUNC("aisFsmRunEventJoinComplete()");
2584
2585     ASSERT(prMsgHdr);
2586
2587     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2588     prJoinCompMsg = (P_MSG_JOIN_COMP_T)prMsgHdr;
2589     prStaRec = prJoinCompMsg->prStaRec;
2590     prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
2591
2592     eNextState = prAisFsmInfo->eCurrentState;
2593
2594     // Check State and SEQ NUM
2595     if (prAisFsmInfo->eCurrentState == AIS_STATE_JOIN) {
2596         P_BSS_INFO_T prAisBssInfo;
2597
2598         prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2599
2600         // Check SEQ NUM
2601         if (prJoinCompMsg->ucSeqNum == prAisFsmInfo->ucSeqNumOfReqMsg) {
2602
2603
2604             //4 <1> JOIN was successful
2605             if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
2606
2607                 //1. Reset retry count
2608                 prAisFsmInfo->ucConnTrialCount = 0;
2609
2610                 // Completion of roaming
2611                 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2612
2613 #if CFG_SUPPORT_ROAMING
2614                     //2. Deactivate previous BSS
2615                     aisFsmRoamingDisconnectPrevAP(prAdapter, prStaRec);
2616
2617                     //3. Update bss based on roaming staRec
2618                     aisUpdateBssInfoForRoamingAP(prAdapter, prStaRec, prAssocRspSwRfb);
2619 #endif /* CFG_SUPPORT_ROAMING */
2620                 }
2621                 else {
2622                     //4 <1.1> Change FW's Media State immediately.
2623                     aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2624
2625                     //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
2626                     if ((prAisBssInfo->prStaRecOfAP) &&
2627                         (prAisBssInfo->prStaRecOfAP != prStaRec) &&
2628                         (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
2629
2630                         cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
2631                     }
2632
2633                     //4 <1.3> Update BSS_INFO_T
2634                     aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
2635
2636                     //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
2637                     cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2638
2639                     //4 <1.5> Update RSSI if necessary
2640                     nicUpdateRSSI(prAdapter, NETWORK_TYPE_AIS_INDEX, (INT_8)(RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
2641
2642                     //4 <1.6> Indicate Connected Event to Host immediately.
2643                     /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
2644                     aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2645                 }
2646
2647 #if CFG_SUPPORT_ROAMING
2648                 roamingFsmRunEventStart(prAdapter);
2649 #endif /* CFG_SUPPORT_ROAMING */
2650
2651                 //4 <1.7> Set the Next State of AIS FSM
2652                 eNextState = AIS_STATE_NORMAL_TR;
2653             }
2654             //4 <2> JOIN was not successful
2655             else {
2656                 //4 <2.1> Redo JOIN process with other Auth Type if possible
2657                 if (aisFsmStateInit_RetryJOIN(prAdapter, prStaRec) == FALSE) {
2658                     P_BSS_DESC_T prBssDesc;
2659
2660                     /* 1. Increase Failure Count */
2661                     prStaRec->ucJoinFailureCount++;
2662
2663                     /* 2. release channel */
2664                     aisFsmReleaseCh(prAdapter);
2665
2666                     /* 3.1 stop join timeout timer */
2667                     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
2668
2669                     /* 3.2 reset local variable */
2670                     prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
2671
2672                     prBssDesc = scanSearchBssDescByBssid(prAdapter, prStaRec->aucMacAddr);
2673
2674                     ASSERT(prBssDesc);
2675                     ASSERT(prBssDesc->fgIsConnecting);
2676
2677                     if(prBssDesc) {
2678                         prBssDesc->fgIsConnecting = FALSE;
2679                     }
2680
2681                     /* 3.3 Free STA-REC */
2682                     if(prStaRec != prAisBssInfo->prStaRecOfAP) {
2683                         cnmStaRecFree(prAdapter, prStaRec, FALSE);
2684                     }
2685
2686                     if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2687 #if CFG_SUPPORT_ROAMING
2688                         eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2689 #endif /* CFG_SUPPORT_ROAMING */
2690                         }
2691                     else {
2692                         /* 4. send reconnect request */
2693                         aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2694
2695                         eNextState = AIS_STATE_IDLE;
2696                     }
2697                 }
2698             }
2699         }
2700 #if DBG
2701         else {
2702             DBGLOG(AIS, WARN, ("SEQ NO of AIS JOIN COMP MSG is not matched.\n"));
2703         }
2704 #endif /* DBG */
2705
2706     }
2707
2708     if (eNextState != prAisFsmInfo->eCurrentState) {
2709         aisFsmSteps(prAdapter, eNextState);
2710     }
2711
2712     if (prAssocRspSwRfb) {
2713         nicRxReturnRFB(prAdapter, prAssocRspSwRfb);
2714     }
2715
2716     cnmMemFree(prAdapter, prMsgHdr);
2717
2718     return;
2719 } /* end of aisFsmRunEventJoinComplete() */
2720
2721
2722 #if CFG_SUPPORT_ADHOC
2723 /*----------------------------------------------------------------------------*/
2724 /*!
2725 * @brief This function will handle the Grant Msg of IBSS Create which was sent by
2726 *        CNM to indicate that channel was changed for creating IBSS.
2727 *
2728 * @param[in] prAdapter  Pointer of ADAPTER_T
2729 *
2730 * @return (none)
2731 */
2732 /*----------------------------------------------------------------------------*/
2733 VOID
2734 aisFsmCreateIBSS (
2735     IN P_ADAPTER_T prAdapter
2736     )
2737 {
2738     P_AIS_FSM_INFO_T prAisFsmInfo;
2739
2740     ASSERT(prAdapter);
2741
2742     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2743
2744     do {
2745         // Check State
2746         if (prAisFsmInfo->eCurrentState == AIS_STATE_IBSS_ALONE) {
2747             aisUpdateBssInfoForCreateIBSS(prAdapter);
2748         }
2749     }
2750     while (FALSE);
2751
2752     return;
2753 } /* end of aisFsmCreateIBSS() */
2754
2755
2756 /*----------------------------------------------------------------------------*/
2757 /*!
2758 * @brief This function will handle the Grant Msg of IBSS Merge which was sent by
2759 *        CNM to indicate that channel was changed for merging IBSS.
2760 *
2761 * @param[in] prAdapter  Pointer of ADAPTER_T
2762 * @param[in] prStaRec   Pointer of STA_RECORD_T for merge
2763 *
2764 * @return (none)
2765 */
2766 /*----------------------------------------------------------------------------*/
2767 VOID
2768 aisFsmMergeIBSS (
2769     IN P_ADAPTER_T      prAdapter,
2770     IN P_STA_RECORD_T   prStaRec
2771     )
2772 {
2773     P_AIS_FSM_INFO_T prAisFsmInfo;
2774     ENUM_AIS_STATE_T eNextState;
2775     P_BSS_INFO_T prAisBssInfo;
2776
2777     ASSERT(prAdapter);
2778     ASSERT(prStaRec);
2779
2780     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2781     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2782
2783     do {
2784
2785         eNextState = prAisFsmInfo->eCurrentState;
2786
2787         switch (prAisFsmInfo->eCurrentState) {
2788         case AIS_STATE_IBSS_MERGE:
2789         {
2790             P_BSS_DESC_T prBssDesc;
2791
2792             //4 <1.1> Change FW's Media State immediately.
2793             aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2794
2795             //4 <1.2> Deactivate previous Peers' STA_RECORD_T in Driver if have.
2796             bssClearClientList(prAdapter, prAisBssInfo);
2797
2798             //4 <1.3> Unmark connection flag of previous BSS_DESC_T.
2799             if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2800                 prBssDesc->fgIsConnecting = FALSE;
2801                 prBssDesc->fgIsConnected = FALSE;
2802             }
2803
2804             //4 <1.4> Update BSS_INFO_T
2805             aisUpdateBssInfoForMergeIBSS(prAdapter, prStaRec);
2806
2807             //4 <1.5> Add Peers' STA_RECORD_T to Client List
2808             bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2809
2810             //4 <1.6> Activate current Peer's STA_RECORD_T in Driver.
2811             cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2812             prStaRec->fgIsMerging = FALSE;
2813
2814             //4 <1.7> Enable other features
2815
2816             //4 <1.8> Indicate Connected Event to Host immediately.
2817             aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2818
2819             //4 <1.9> Set the Next State of AIS FSM
2820             eNextState = AIS_STATE_NORMAL_TR;
2821
2822             //4 <1.10> Release channel privilege
2823             aisFsmReleaseCh(prAdapter);
2824
2825 #if CFG_SLT_SUPPORT
2826             prAdapter->rWifiVar.rSltInfo.prPseudoStaRec = prStaRec;
2827 #endif
2828         }
2829         break;
2830
2831         default:
2832             break;
2833         }
2834
2835         if (eNextState != prAisFsmInfo->eCurrentState) {
2836             aisFsmSteps(prAdapter, eNextState);
2837         }
2838
2839     }
2840     while (FALSE);
2841
2842     return;
2843 } /* end of aisFsmMergeIBSS() */
2844
2845
2846 /*----------------------------------------------------------------------------*/
2847 /*!
2848 * @brief This function will handle the Notification of existing IBSS was found
2849 *        from SCN.
2850 *
2851 * @param[in] prMsgHdr   Message of Notification of an IBSS was present.
2852 *
2853 * @return (none)
2854 */
2855 /*----------------------------------------------------------------------------*/
2856 VOID
2857 aisFsmRunEventFoundIBSSPeer (
2858     IN P_ADAPTER_T prAdapter,
2859     IN P_MSG_HDR_T prMsgHdr
2860     )
2861 {
2862     P_MSG_AIS_IBSS_PEER_FOUND_T prAisIbssPeerFoundMsg;
2863     P_AIS_FSM_INFO_T prAisFsmInfo;
2864     ENUM_AIS_STATE_T eNextState;
2865     P_STA_RECORD_T prStaRec;
2866     P_BSS_INFO_T prAisBssInfo;
2867     P_BSS_DESC_T prBssDesc;
2868     BOOLEAN fgIsMergeIn;
2869
2870
2871     ASSERT(prMsgHdr);
2872
2873     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2874     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2875
2876     prAisIbssPeerFoundMsg = (P_MSG_AIS_IBSS_PEER_FOUND_T)prMsgHdr;
2877
2878     ASSERT(prAisIbssPeerFoundMsg->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX);
2879
2880     prStaRec = prAisIbssPeerFoundMsg->prStaRec;
2881     ASSERT(prStaRec);
2882
2883     fgIsMergeIn = prAisIbssPeerFoundMsg->fgIsMergeIn;
2884
2885     cnmMemFree(prAdapter, prMsgHdr);
2886
2887
2888     eNextState = prAisFsmInfo->eCurrentState;
2889     switch (prAisFsmInfo->eCurrentState) {
2890     case AIS_STATE_IBSS_ALONE:
2891     {
2892         //4 <1> An IBSS Peer 'merged in'.
2893         if (fgIsMergeIn) {
2894
2895             //4 <1.1> Change FW's Media State immediately.
2896             aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2897
2898             //4 <1.2> Add Peers' STA_RECORD_T to Client List
2899             bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2900
2901 #if CFG_SLT_SUPPORT
2902             //4 <1.3> Mark connection flag of BSS_DESC_T.
2903             if ((prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr)) != NULL) {
2904                 prBssDesc->fgIsConnecting = FALSE;
2905                 prBssDesc->fgIsConnected = TRUE;
2906             }
2907             else {
2908                 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2909             }
2910
2911             //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2912             prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
2913 #else
2914             //4 <1.3> Mark connection flag of BSS_DESC_T.
2915             if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2916                 prBssDesc->fgIsConnecting = FALSE;
2917                 prBssDesc->fgIsConnected = TRUE;
2918             }
2919             else {
2920                 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2921             }
2922
2923
2924             //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2925             prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
2926
2927 #endif
2928
2929             cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2930             prStaRec->fgIsMerging = FALSE;
2931
2932             //4 <1.6> sync. to firmware
2933             nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
2934
2935             //4 <1.7> Indicate Connected Event to Host immediately.
2936             aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2937
2938             //4 <1.8> indicate PM for connected
2939             nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
2940
2941             //4 <1.9> Set the Next State of AIS FSM
2942             eNextState = AIS_STATE_NORMAL_TR;
2943
2944             //4 <1.10> Release channel privilege
2945             aisFsmReleaseCh(prAdapter);
2946         }
2947         //4 <2> We need 'merge out' to this IBSS
2948         else {
2949
2950             //4 <2.1> Get corresponding BSS_DESC_T
2951             prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
2952
2953             prAisFsmInfo->prTargetBssDesc = prBssDesc;
2954
2955             //4 <2.2> Set the Next State of AIS FSM
2956             eNextState = AIS_STATE_IBSS_MERGE;
2957         }
2958     }
2959         break;
2960
2961     case AIS_STATE_NORMAL_TR:
2962     {
2963
2964         //4 <3> An IBSS Peer 'merged in'.
2965         if (fgIsMergeIn) {
2966
2967             //4 <3.1> Add Peers' STA_RECORD_T to Client List
2968             bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2969
2970 #if CFG_SLT_SUPPORT
2971             //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
2972             prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
2973 #else
2974             //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
2975             prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
2976 #endif
2977
2978             cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2979             prStaRec->fgIsMerging = FALSE;
2980
2981         }
2982         //4 <4> We need 'merge out' to this IBSS
2983         else {
2984
2985             //4 <4.1> Get corresponding BSS_DESC_T
2986             prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
2987
2988             prAisFsmInfo->prTargetBssDesc = prBssDesc;
2989
2990             //4 <4.2> Set the Next State of AIS FSM
2991             eNextState = AIS_STATE_IBSS_MERGE;
2992
2993         }
2994     }
2995         break;
2996
2997     default:
2998         break;
2999     }
3000
3001     if (eNextState != prAisFsmInfo->eCurrentState) {
3002         aisFsmSteps(prAdapter, eNextState);
3003     }
3004
3005     return;
3006 } /* end of aisFsmRunEventFoundIBSSPeer() */
3007 #endif /* CFG_SUPPORT_ADHOC */
3008
3009
3010 /*----------------------------------------------------------------------------*/
3011 /*!
3012 * @brief This function will indicate the Media State to HOST
3013 *
3014 * @param[in] eConnectionState   Current Media State
3015 * @param[in] fgDelayIndication  Set TRUE for postponing the Disconnect Indication.
3016 *
3017 * @return (none)
3018 */
3019 /*----------------------------------------------------------------------------*/
3020 VOID
3021 aisIndicationOfMediaStateToHost (
3022     IN P_ADAPTER_T prAdapter,
3023     ENUM_PARAM_MEDIA_STATE_T eConnectionState,
3024     BOOLEAN fgDelayIndication
3025     )
3026 {
3027     EVENT_CONNECTION_STATUS rEventConnStatus;
3028     P_CONNECTION_SETTINGS_T prConnSettings;
3029     P_BSS_INFO_T prAisBssInfo;
3030     P_AIS_FSM_INFO_T prAisFsmInfo;
3031
3032     DEBUGFUNC("aisIndicationOfMediaStateToHost()");
3033
3034     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3035     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3036     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3037
3038     // NOTE(Kevin): Move following line to aisChangeMediaState() macro per CM's request.
3039     //prAisBssInfo->eConnectionState = eConnectionState;
3040
3041     /* For indicating the Disconnect Event only if current media state is
3042      * disconnected and we didn't do indication yet.
3043      */
3044     if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
3045         if (prAisBssInfo->eConnectionStateIndicated == eConnectionState) {
3046             return;
3047         }
3048     }
3049
3050     if (!fgDelayIndication) {
3051         //4 <0> Cancel Delay Timer
3052         cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
3053
3054         //4 <1> Fill EVENT_CONNECTION_STATUS
3055         rEventConnStatus.ucMediaStatus = (UINT_8)eConnectionState;
3056
3057         if (eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
3058             rEventConnStatus.ucReasonOfDisconnect = DISCONNECT_REASON_CODE_RESERVED;
3059
3060             if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
3061                 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_INFRA;
3062                 rEventConnStatus.u2AID = prAisBssInfo->u2AssocId;
3063                 rEventConnStatus.u2ATIMWindow = 0;
3064             }
3065             else if (prAisBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3066                 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_IBSS;
3067                 rEventConnStatus.u2AID = 0;
3068                 rEventConnStatus.u2ATIMWindow = prAisBssInfo->u2ATIMWindow;
3069             }
3070             else {
3071                 ASSERT(0);
3072             }
3073
3074             COPY_SSID(rEventConnStatus.aucSsid,
3075                       rEventConnStatus.ucSsidLen,
3076                       prConnSettings->aucSSID,
3077                       prConnSettings->ucSSIDLen);
3078
3079             COPY_MAC_ADDR(rEventConnStatus.aucBssid, prAisBssInfo->aucBSSID);
3080
3081             rEventConnStatus.u2BeaconPeriod = prAisBssInfo->u2BeaconInterval;
3082             rEventConnStatus.u4FreqInKHz = nicChannelNum2Freq(prAisBssInfo->ucPrimaryChannel);
3083
3084             switch (prAisBssInfo->ucNonHTBasicPhyType) {
3085             case PHY_TYPE_HR_DSSS_INDEX:
3086                 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3087                 break;
3088
3089             case PHY_TYPE_ERP_INDEX:
3090                 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM24;
3091                 break;
3092
3093             case PHY_TYPE_OFDM_INDEX:
3094                 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM5;
3095                 break;
3096
3097             default:
3098                 ASSERT(0);
3099                 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3100                 break;
3101             }
3102         }
3103         else {
3104             /* Deactivate previous Peers' STA_RECORD_T in Driver if have. */
3105             bssClearClientList(prAdapter, prAisBssInfo);
3106
3107             #if CFG_PRIVACY_MIGRATION
3108             /* Clear the pmkid cache while media disconnect */
3109             secClearPmkid(prAdapter);
3110             #endif
3111
3112             rEventConnStatus.ucReasonOfDisconnect = prAisBssInfo->ucReasonOfDisconnect;
3113         }
3114
3115         //4 <2> Indication
3116         nicMediaStateChange(prAdapter, NETWORK_TYPE_AIS_INDEX, &rEventConnStatus);
3117         prAisBssInfo->eConnectionStateIndicated = eConnectionState;
3118     }
3119     else {
3120         /* NOTE: Only delay the Indication of Disconnect Event */
3121         ASSERT(eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED);
3122
3123         DBGLOG(AIS, INFO, ("Postpone the indication of Disconnect for %d seconds\n",
3124             prConnSettings->ucDelayTimeOfDisconnectEvent));
3125
3126         cnmTimerStartTimer(prAdapter,
3127                 &prAisFsmInfo->rIndicationOfDisconnectTimer,
3128                 SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent));
3129     }
3130
3131     return;
3132 } /* end of aisIndicationOfMediaStateToHost() */
3133
3134
3135 /*----------------------------------------------------------------------------*/
3136 /*!
3137 * @brief This function will indicate an Event of "Media Disconnect" to HOST
3138 *
3139 * @param[in] u4Param  Unused timer parameter
3140 *
3141 * @return (none)
3142 */
3143 /*----------------------------------------------------------------------------*/
3144 VOID
3145 aisPostponedEventOfDisconnTimeout (
3146     IN P_ADAPTER_T prAdapter,
3147     UINT_32 u4Param
3148     )
3149 {
3150     P_BSS_INFO_T prAisBssInfo;
3151     P_CONNECTION_SETTINGS_T prConnSettings;
3152
3153
3154     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3155
3156     //4 <1> Deactivate previous AP's STA_RECORD_T in Driver if have.
3157     if (prAisBssInfo->prStaRecOfAP) {
3158         //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3159
3160         prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3161     }
3162
3163     //4 <2> Remove pending connection request
3164     aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3165     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3166     /* Set Connection Request Issued Flag */
3167     prConnSettings->fgIsConnReqIssued = FALSE;
3168
3169     //4 <3> Indicate Disconnected Event to Host immediately.
3170     aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED, FALSE);
3171
3172     return;
3173 } /* end of aisPostponedEventOfDisconnTimeout() */
3174
3175
3176 /*----------------------------------------------------------------------------*/
3177 /*!
3178 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3179 *        the association was completed.
3180 *
3181 * @param[in] prStaRec               Pointer to the STA_RECORD_T
3182 * @param[in] prAssocRspSwRfb        Pointer to SW RFB of ASSOC RESP FRAME.
3183 *
3184 * @return (none)
3185 */
3186 /*----------------------------------------------------------------------------*/
3187 VOID
3188 aisUpdateBssInfoForJOIN (
3189     IN P_ADAPTER_T prAdapter,
3190     P_STA_RECORD_T prStaRec,
3191     P_SW_RFB_T prAssocRspSwRfb
3192     )
3193 {
3194     P_AIS_FSM_INFO_T prAisFsmInfo;
3195     P_BSS_INFO_T prAisBssInfo;
3196     P_CONNECTION_SETTINGS_T prConnSettings;
3197     P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
3198     P_BSS_DESC_T prBssDesc;
3199     UINT_16 u2IELength;
3200     PUINT_8 pucIE;
3201
3202     DEBUGFUNC("aisUpdateBssInfoForJOIN()");
3203
3204     ASSERT(prStaRec);
3205     ASSERT(prAssocRspSwRfb);
3206
3207     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3208     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3209     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3210     prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prAssocRspSwRfb->pvHeader;
3211
3212
3213     DBGLOG(AIS, INFO, ("Update AIS_BSS_INFO_T and apply settings to MAC\n"));
3214
3215
3216     //3 <1> Update BSS_INFO_T from AIS_FSM_INFO_T or User Settings
3217     //4 <1.1> Setup Operation Mode
3218     prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
3219
3220     //4 <1.2> Setup SSID
3221     COPY_SSID(prAisBssInfo->aucSSID,
3222               prAisBssInfo->ucSSIDLen,
3223               prConnSettings->aucSSID,
3224               prConnSettings->ucSSIDLen);
3225
3226     //4 <1.3> Setup Channel, Band
3227     prAisBssInfo->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
3228     prAisBssInfo->eBand = prAisFsmInfo->prTargetBssDesc->eBand;
3229
3230
3231     //3 <2> Update BSS_INFO_T from STA_RECORD_T
3232     //4 <2.1> Save current AP's STA_RECORD_T and current AID
3233     prAisBssInfo->prStaRecOfAP = prStaRec;
3234     prAisBssInfo->u2AssocId = prStaRec->u2AssocId;
3235
3236     //4 <2.2> Setup Capability
3237     prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use AP's Cap Info as BSS Cap Info */
3238
3239     if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3240         prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3241     }
3242     else {
3243         prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3244     }
3245
3246     //4 <2.3> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3247     prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3248
3249     prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3250
3251     prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3252     prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3253
3254
3255     //3 <3> Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3256     //4 <3.1> Setup BSSID
3257     COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prAssocRspFrame->aucBSSID);
3258
3259
3260     u2IELength = (UINT_16) ((prAssocRspSwRfb->u2PacketLen - prAssocRspSwRfb->u2HeaderLen) -
3261         (OFFSET_OF(WLAN_ASSOC_RSP_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN));
3262     pucIE = prAssocRspFrame->aucInfoElem;
3263
3264
3265     //4 <3.2> Parse WMM and setup QBSS flag
3266     /* Parse WMM related IEs and configure HW CRs accordingly */
3267     mqmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3268
3269     prAisBssInfo->fgIsQBSS = prStaRec->fgIsQoS;
3270
3271     //3 <4> Update BSS_INFO_T from BSS_DESC_T
3272     prBssDesc = scanSearchBssDescByBssid(prAdapter, prAssocRspFrame->aucBSSID);
3273     if(prBssDesc) {
3274         prBssDesc->fgIsConnecting = FALSE;
3275         prBssDesc->fgIsConnected = TRUE;
3276
3277         //4 <4.1> Setup MIB for current BSS
3278         prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3279     }
3280     else {
3281         // should never happen
3282         ASSERT(0);
3283     }
3284
3285     /* NOTE: Defer ucDTIMPeriod updating to when beacon is received after connection */
3286     prAisBssInfo->ucDTIMPeriod = 0;
3287     prAisBssInfo->u2ATIMWindow = 0;
3288
3289     prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_INFRA;
3290
3291     //4 <4.2> Update HT information and set channel
3292     /* Record HT related parameters in rStaRec and rBssInfo
3293      * Note: it shall be called before nicUpdateBss()
3294      */
3295     rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3296
3297     //4 <4.3> Sync with firmware for BSS-INFO
3298     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3299
3300     //4 <4.4> *DEFER OPERATION* nicPmIndicateBssConnected() will be invoked
3301     //inside scanProcessBeaconAndProbeResp() after 1st beacon is received
3302
3303     return;
3304 } /* end of aisUpdateBssInfoForJOIN() */
3305
3306
3307 #if CFG_SUPPORT_ADHOC
3308 /*----------------------------------------------------------------------------*/
3309 /*!
3310 * @brief This function will create an Ad-Hoc network and start sending Beacon Frames.
3311 *
3312 * @param (none)
3313 *
3314 * @return (none)
3315 */
3316 /*----------------------------------------------------------------------------*/
3317 VOID
3318 aisUpdateBssInfoForCreateIBSS (
3319     IN P_ADAPTER_T prAdapter
3320     )
3321 {
3322     P_AIS_FSM_INFO_T prAisFsmInfo;
3323     P_BSS_INFO_T prAisBssInfo;
3324     P_CONNECTION_SETTINGS_T prConnSettings;
3325
3326     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3327     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3328     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3329
3330     if (prAisBssInfo->fgIsBeaconActivated) {
3331         return;
3332     }
3333
3334     //3 <1> Update BSS_INFO_T per Network Basis
3335     //4 <1.1> Setup Operation Mode
3336     prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3337
3338     //4 <1.2> Setup SSID
3339     COPY_SSID(prAisBssInfo->aucSSID,
3340               prAisBssInfo->ucSSIDLen,
3341               prConnSettings->aucSSID,
3342               prConnSettings->ucSSIDLen);
3343
3344     //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3345     prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3346     prAisBssInfo->u2AssocId = 0;
3347
3348     //4 <1.4> Setup Channel, Band and Phy Attributes
3349     prAisBssInfo->ucPrimaryChannel = prConnSettings->ucAdHocChannelNum;
3350     prAisBssInfo->eBand = prConnSettings->eAdHocBand;
3351
3352     if (prAisBssInfo->eBand == BAND_2G4) {
3353
3354         prAisBssInfo->ucPhyTypeSet =
3355             prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN; /* Depend on eBand */
3356
3357         prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3358     }
3359     else {
3360
3361         prAisBssInfo->ucPhyTypeSet =
3362             prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11AN; /* Depend on eBand */
3363
3364         prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_11A; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3365     }
3366
3367     //4 <1.5> Setup MIB for current BSS
3368     prAisBssInfo->u2BeaconInterval = prConnSettings->u2BeaconPeriod;
3369     prAisBssInfo->ucDTIMPeriod = 0;
3370     prAisBssInfo->u2ATIMWindow = prConnSettings->u2AtimWindow;
3371
3372     prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3373
3374 #if CFG_PRIVACY_MIGRATION
3375     if (prConnSettings->eEncStatus == ENUM_ENCRYPTION1_ENABLED ||
3376         prConnSettings->eEncStatus == ENUM_ENCRYPTION2_ENABLED ||
3377         prConnSettings->eEncStatus == ENUM_ENCRYPTION3_ENABLED) {
3378         prAisBssInfo->fgIsProtection = TRUE;
3379     }
3380     else {
3381         prAisBssInfo->fgIsProtection = FALSE;
3382     }
3383 #else
3384     prAisBssInfo->fgIsProtection = FALSE;
3385 #endif
3386
3387     //3 <2> Update BSS_INFO_T common part
3388     ibssInitForAdHoc(prAdapter, prAisBssInfo);
3389
3390
3391
3392     //3 <3> Set MAC HW
3393     //4 <3.1> Setup channel and bandwidth
3394     rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3395
3396     //4 <3.2> use command packets to inform firmware
3397     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3398
3399     //4 <3.3> enable beaconing
3400     bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3401
3402     //4 <3.4> Update AdHoc PM parameter
3403     nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_AIS_INDEX);
3404
3405     //3 <4> Set ACTIVE flag.
3406     prAisBssInfo->fgIsBeaconActivated = TRUE;
3407     prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3408
3409     //3 <5> Start IBSS Alone Timer
3410     cnmTimerStartTimer(prAdapter,
3411             &prAisFsmInfo->rIbssAloneTimer,
3412             SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
3413
3414     return;
3415
3416 } /* end of aisCreateIBSS() */
3417
3418
3419 /*----------------------------------------------------------------------------*/
3420 /*!
3421 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3422 *        the existing IBSS was found.
3423 *
3424 * @param[in] prStaRec               Pointer to the STA_RECORD_T
3425 *
3426 * @return (none)
3427 */
3428 /*----------------------------------------------------------------------------*/
3429 VOID
3430 aisUpdateBssInfoForMergeIBSS (
3431     IN P_ADAPTER_T prAdapter,
3432     IN P_STA_RECORD_T prStaRec
3433     )
3434 {
3435     P_AIS_FSM_INFO_T prAisFsmInfo;
3436     P_BSS_INFO_T prAisBssInfo;
3437     P_CONNECTION_SETTINGS_T prConnSettings;
3438     P_BSS_DESC_T prBssDesc;
3439     //UINT_16 u2IELength;
3440     //PUINT_8 pucIE;
3441
3442
3443     ASSERT(prStaRec);
3444
3445     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3446     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3447     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3448
3449     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
3450
3451     if (!prAisBssInfo->fgIsBeaconActivated) {
3452
3453         //3 <1> Update BSS_INFO_T per Network Basis
3454         //4 <1.1> Setup Operation Mode
3455         prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3456
3457         //4 <1.2> Setup SSID
3458         COPY_SSID(prAisBssInfo->aucSSID,
3459                   prAisBssInfo->ucSSIDLen,
3460                   prConnSettings->aucSSID,
3461                   prConnSettings->ucSSIDLen);
3462
3463         //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3464         prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3465         prAisBssInfo->u2AssocId = 0;
3466     }
3467
3468     //3 <2> Update BSS_INFO_T from STA_RECORD_T
3469     //4 <2.1> Setup Capability
3470     prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use Peer's Cap Info as IBSS Cap Info */
3471
3472     if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3473         prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3474         prAisBssInfo->fgUseShortPreamble = TRUE;
3475     }
3476     else {
3477         prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3478         prAisBssInfo->fgUseShortPreamble = FALSE;
3479     }
3480
3481     // 7.3.1.4 For IBSS, the Short Slot Time subfield shall be set to 0.
3482     prAisBssInfo->fgUseShortSlotTime = FALSE; /* Set to FALSE for AdHoc */
3483     prAisBssInfo->u2CapInfo &= ~CAP_INFO_SHORT_SLOT_TIME;
3484
3485     if (prAisBssInfo->u2CapInfo & CAP_INFO_PRIVACY) {
3486         prAisBssInfo->fgIsProtection= TRUE;
3487     }
3488     else {
3489         prAisBssInfo->fgIsProtection = FALSE;
3490     }
3491
3492     //4 <2.2> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3493     prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3494
3495     prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3496
3497     prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3498     prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3499
3500     rateGetDataRatesFromRateSet(prAisBssInfo->u2OperationalRateSet,
3501                                 prAisBssInfo->u2BSSBasicRateSet,
3502                                 prAisBssInfo->aucAllSupportedRates,
3503                                 &prAisBssInfo->ucAllSupportedRatesLen);
3504
3505     //3 <3> X Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3506
3507
3508     //3 <4> Update BSS_INFO_T from BSS_DESC_T
3509     prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3510     if(prBssDesc) {
3511         prBssDesc->fgIsConnecting = FALSE;
3512         prBssDesc->fgIsConnected = TRUE;
3513
3514         //4 <4.1> Setup BSSID
3515         COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prBssDesc->aucBSSID);
3516
3517         //4 <4.2> Setup Channel, Band
3518         prAisBssInfo->ucPrimaryChannel = prBssDesc->ucChannelNum;
3519         prAisBssInfo->eBand = prBssDesc->eBand;
3520
3521         //4 <4.3> Setup MIB for current BSS
3522         prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3523         prAisBssInfo->ucDTIMPeriod = 0;
3524         prAisBssInfo->u2ATIMWindow = 0; /* TBD(Kevin) */
3525
3526         prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3527     }
3528     else {
3529         // should never happen
3530         ASSERT(0);
3531     }
3532
3533
3534     //3 <5> Set MAC HW
3535     //4 <5.1> Find Lowest Basic Rate Index for default TX Rate of MMPDU
3536     {
3537         UINT_8 ucLowestBasicRateIndex;
3538
3539         if (!rateGetLowestRateIndexFromRateSet(prAisBssInfo->u2BSSBasicRateSet,
3540                                               &ucLowestBasicRateIndex)) {
3541
3542             if (prAisBssInfo->ucPhyTypeSet & PHY_TYPE_BIT_OFDM) {
3543                 ucLowestBasicRateIndex = RATE_6M_INDEX;
3544             }
3545             else {
3546                 ucLowestBasicRateIndex = RATE_1M_INDEX;
3547             }
3548         }
3549
3550         prAisBssInfo->ucHwDefaultFixedRateCode =
3551             aucRateIndex2RateCode[prAisBssInfo->fgUseShortPreamble][ucLowestBasicRateIndex];
3552     }
3553
3554     //4 <5.2> Setup channel and bandwidth
3555     rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3556
3557     //4 <5.3> use command packets to inform firmware
3558     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3559
3560     //4 <5.4> enable beaconing
3561     bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3562
3563     //4 <5.5> Update AdHoc PM parameter
3564     nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
3565
3566     //3 <6> Set ACTIVE flag.
3567     prAisBssInfo->fgIsBeaconActivated = TRUE;
3568     prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3569
3570     return;
3571 } /* end of aisUpdateBssInfoForMergeIBSS() */
3572
3573
3574 /*----------------------------------------------------------------------------*/
3575 /*!
3576 * @brief This function will validate the Rx Probe Request Frame and then return
3577 *        result to BSS to indicate if need to send the corresponding Probe Response
3578 *        Frame if the specified conditions were matched.
3579 *
3580 * @param[in] prAdapter          Pointer to the Adapter structure.
3581 * @param[in] prSwRfb            Pointer to SW RFB data structure.
3582 * @param[out] pu4ControlFlags   Control flags for replying the Probe Response
3583 *
3584 * @retval TRUE      Reply the Probe Response
3585 * @retval FALSE     Don't reply the Probe Response
3586 */
3587 /*----------------------------------------------------------------------------*/
3588 BOOLEAN
3589 aisValidateProbeReq (
3590     IN P_ADAPTER_T prAdapter,
3591     IN P_SW_RFB_T prSwRfb,
3592     OUT PUINT_32 pu4ControlFlags
3593     )
3594 {
3595     P_WLAN_MAC_MGMT_HEADER_T prMgtHdr;
3596     P_BSS_INFO_T prBssInfo;
3597     P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
3598     PUINT_8 pucIE;
3599     UINT_16 u2IELength;
3600     UINT_16 u2Offset = 0;
3601     BOOLEAN fgReplyProbeResp = FALSE;
3602
3603
3604     ASSERT(prSwRfb);
3605     ASSERT(pu4ControlFlags);
3606
3607     prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3608
3609     //4 <1> Parse Probe Req IE and Get IE ptr (SSID, Supported Rate IE, ...)
3610     prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T)prSwRfb->pvHeader;
3611
3612     u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
3613     pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
3614
3615     IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
3616         if (ELEM_ID_SSID == IE_ID(pucIE)) {
3617             if ((!prIeSsid) &&
3618                 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
3619                 prIeSsid = (P_IE_SSID_T)pucIE;
3620             }
3621             break;
3622         }
3623     } /* end of IE_FOR_EACH */
3624
3625     //4 <2> Check network conditions
3626
3627     if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3628
3629         if ((prIeSsid) &&
3630             ((prIeSsid->ucLength == BC_SSID_LEN) || /* WILDCARD SSID */
3631              EQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen, /* CURRENT SSID */
3632                         prIeSsid->aucSSID, prIeSsid->ucLength)) ) {
3633             fgReplyProbeResp = TRUE;
3634         }
3635     }
3636
3637     return fgReplyProbeResp;
3638
3639 } /* end of aisValidateProbeReq() */
3640
3641 #endif /* CFG_SUPPORT_ADHOC */
3642
3643 /*----------------------------------------------------------------------------*/
3644 /*!
3645 * @brief This function will modify and update necessary information to firmware
3646 *        for disconnection handling
3647 *
3648 * @param[in] prAdapter          Pointer to the Adapter structure.
3649 *
3650 * @retval None
3651 */
3652 /*----------------------------------------------------------------------------*/
3653 VOID
3654 aisFsmDisconnect (
3655     IN P_ADAPTER_T prAdapter,
3656     IN BOOLEAN     fgDelayIndication
3657     )
3658 {
3659     P_BSS_INFO_T prAisBssInfo;
3660
3661     ASSERT(prAdapter);
3662
3663     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3664
3665     nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
3666
3667 #if CFG_SUPPORT_ADHOC
3668     if (prAisBssInfo->fgIsBeaconActivated) {
3669         nicUpdateBeaconIETemplate(prAdapter,
3670                 IE_UPD_METHOD_DELETE_ALL,
3671                 NETWORK_TYPE_AIS_INDEX,
3672                 0,
3673                 NULL,
3674                 0);
3675
3676         prAisBssInfo->fgIsBeaconActivated = FALSE;
3677     }
3678 #endif
3679
3680     rlmBssAborted(prAdapter, prAisBssInfo);
3681
3682     //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
3683     if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
3684
3685         if (prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_RADIO_LOST) {
3686             scanRemoveBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3687
3688             /* remove from scanning results as well */
3689             wlanClearBssInScanningResult(prAdapter, prAisBssInfo->aucBSSID);
3690
3691             /* trials for re-association */
3692             if (fgDelayIndication) {
3693                 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3694                 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
3695             }
3696         }
3697         else {
3698             scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3699         }
3700
3701         if (fgDelayIndication) {
3702             if (OP_MODE_IBSS != prAisBssInfo->eCurrentOPMode) {
3703                 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3704             }
3705         }
3706         else {
3707             prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3708         }
3709     }
3710     else {
3711         prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3712     }
3713
3714
3715     //4 <4> Change Media State immediately.
3716     aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
3717
3718     //4 <4.1> sync. with firmware
3719     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3720
3721     if (!fgDelayIndication) {
3722         //4 <5> Deactivate previous AP's STA_RECORD_T or all Clients in Driver if have.
3723         if (prAisBssInfo->prStaRecOfAP) {
3724             //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3725
3726             prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3727         }
3728     }
3729
3730 #if CFG_SUPPORT_ROAMING
3731     roamingFsmRunEventAbort(prAdapter);
3732
3733     /* clear pending roaming connection request */
3734     aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
3735     aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
3736 #endif /* CFG_SUPPORT_ROAMING */
3737
3738     //4 <6> Indicate Disconnected Event to Host
3739     aisIndicationOfMediaStateToHost(prAdapter,
3740             PARAM_MEDIA_STATE_DISCONNECTED,
3741             fgDelayIndication);
3742
3743
3744     //4 <7> Trigger AIS FSM
3745     aisFsmSteps(prAdapter, AIS_STATE_IDLE);
3746
3747     return;
3748 } /* end of aisFsmDisconnect() */
3749
3750
3751 /*----------------------------------------------------------------------------*/
3752 /*!
3753 * @brief This function will indicate an Event of "Background Scan Time-Out" to AIS FSM.
3754 *
3755 * @param[in] u4Param  Unused timer parameter
3756 *
3757 * @return (none)
3758 */
3759 /*----------------------------------------------------------------------------*/
3760 VOID
3761 aisFsmRunEventBGSleepTimeOut (
3762     IN P_ADAPTER_T prAdapter,
3763     UINT_32 u4Param
3764     )
3765 {
3766     P_AIS_FSM_INFO_T prAisFsmInfo;
3767     ENUM_AIS_STATE_T eNextState;
3768
3769     DEBUGFUNC("aisFsmRunEventBGSleepTimeOut()");
3770
3771     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3772
3773     eNextState = prAisFsmInfo->eCurrentState;
3774
3775     switch (prAisFsmInfo->eCurrentState) {
3776     case AIS_STATE_WAIT_FOR_NEXT_SCAN:
3777         DBGLOG(AIS, LOUD, ("EVENT - SCAN TIMER: Idle End - Current Time = %ld\n", kalGetTimeTick()));
3778
3779         eNextState = AIS_STATE_LOOKING_FOR;
3780
3781         SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
3782
3783         break;
3784
3785     default:
3786         break;
3787     }
3788
3789     /* Call aisFsmSteps() when we are going to change AIS STATE */
3790     if (eNextState != prAisFsmInfo->eCurrentState) {
3791         aisFsmSteps(prAdapter, eNextState);
3792     }
3793
3794     return;
3795 } /* end of aisFsmBGSleepTimeout() */
3796
3797
3798 /*----------------------------------------------------------------------------*/
3799 /*!
3800 * @brief This function will indicate an Event of "IBSS ALONE Time-Out" to AIS FSM.
3801 *
3802 * @param[in] u4Param  Unused timer parameter
3803 *
3804 * @return (none)
3805 */
3806 /*----------------------------------------------------------------------------*/
3807 VOID
3808 aisFsmRunEventIbssAloneTimeOut (
3809     IN P_ADAPTER_T prAdapter,
3810     UINT_32 u4Param
3811     )
3812 {
3813     P_AIS_FSM_INFO_T prAisFsmInfo;
3814     ENUM_AIS_STATE_T eNextState;
3815
3816     DEBUGFUNC("aisFsmRunEventIbssAloneTimeOut()");
3817
3818     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3819     eNextState = prAisFsmInfo->eCurrentState;
3820
3821     switch(prAisFsmInfo->eCurrentState) {
3822     case AIS_STATE_IBSS_ALONE:
3823
3824         /* There is no one participate in our AdHoc during this TIMEOUT Interval
3825          * so go back to search for a valid IBSS again.
3826          */
3827
3828         DBGLOG(AIS, LOUD, ("EVENT-IBSS ALONE TIMER: Start pairing\n"));
3829
3830         prAisFsmInfo->fgTryScan = TRUE;
3831
3832         /* abort timer */
3833         aisFsmReleaseCh(prAdapter);
3834
3835         /* Pull back to SEARCH to find candidate again */
3836         eNextState = AIS_STATE_SEARCH;
3837
3838         break;
3839
3840     default:
3841         break;
3842     }
3843
3844
3845     /* Call aisFsmSteps() when we are going to change AIS STATE */
3846     if (eNextState != prAisFsmInfo->eCurrentState) {
3847         aisFsmSteps(prAdapter, eNextState);
3848     }
3849
3850     return;
3851 } /* end of aisIbssAloneTimeOut() */
3852
3853
3854 /*----------------------------------------------------------------------------*/
3855 /*!
3856 * @brief This function will indicate an Event of "Join Time-Out" to AIS FSM.
3857 *
3858 * @param[in] u4Param  Unused timer parameter
3859 *
3860 * @return (none)
3861 */
3862 /*----------------------------------------------------------------------------*/
3863 VOID
3864 aisFsmRunEventJoinTimeout (
3865     IN P_ADAPTER_T prAdapter,
3866     UINT_32 u4Param
3867     )
3868 {
3869     P_AIS_FSM_INFO_T prAisFsmInfo;
3870     ENUM_AIS_STATE_T eNextState;
3871
3872     DEBUGFUNC("aisFsmRunEventJoinTimeout()");
3873
3874     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3875     eNextState = prAisFsmInfo->eCurrentState;
3876
3877     switch(prAisFsmInfo->eCurrentState) {
3878     case AIS_STATE_JOIN:
3879         DBGLOG(AIS, LOUD, ("EVENT- JOIN TIMEOUT\n"));
3880
3881         /* 1. Do abort JOIN */
3882         aisFsmStateAbort_JOIN(prAdapter);
3883
3884         /* 2. Increase Join Failure Count */
3885         prAisFsmInfo->prTargetStaRec->ucJoinFailureCount++;
3886
3887         if(prAisFsmInfo->prTargetStaRec->ucJoinFailureCount < JOIN_MAX_RETRY_FAILURE_COUNT) {
3888             /* 3.1 Retreat to AIS_STATE_SEARCH state for next try */
3889             eNextState = AIS_STATE_SEARCH;
3890         }
3891         else {
3892             /* 3.2 Retreat to AIS_STATE_WAIT_FOR_NEXT_SCAN state for next try */
3893             eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
3894         }
3895         break;
3896
3897     case AIS_STATE_NORMAL_TR:
3898         /* 1. release channel */
3899         aisFsmReleaseCh(prAdapter);
3900         prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
3901
3902         /* 2. process if there is pending scan */
3903         if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
3904             wlanClearScanningResult(prAdapter);
3905             eNextState = AIS_STATE_ONLINE_SCAN;
3906         }
3907
3908         break;
3909
3910     default:
3911         /* release channel */
3912         aisFsmReleaseCh(prAdapter);
3913         break;
3914
3915     }
3916
3917
3918     /* Call aisFsmSteps() when we are going to change AIS STATE */
3919     if (eNextState != prAisFsmInfo->eCurrentState) {
3920         aisFsmSteps(prAdapter, eNextState);
3921     }
3922
3923     return;
3924 } /* end of aisFsmRunEventJoinTimeout() */
3925
3926
3927 #if defined(CFG_TEST_MGMT_FSM) && (CFG_TEST_MGMT_FSM != 0)
3928 /*----------------------------------------------------------------------------*/
3929 /*!
3930 * \brief
3931 *
3932 * \param[in]
3933 *
3934 * \return none
3935 */
3936 /*----------------------------------------------------------------------------*/
3937 VOID
3938 aisTest (
3939     VOID
3940     )
3941 {
3942     P_MSG_AIS_ABORT_T prAisAbortMsg;
3943     P_CONNECTION_SETTINGS_T prConnSettings;
3944     UINT_8 aucSSID[]="pci-11n";
3945     UINT_8 ucSSIDLen=7;
3946
3947     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3948
3949     /* Set Connection Request Issued Flag */
3950     prConnSettings->fgIsConnReqIssued = TRUE;
3951     prConnSettings->ucSSIDLen = ucSSIDLen;
3952     kalMemCopy(prConnSettings->aucSSID, aucSSID, ucSSIDLen);
3953
3954     prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
3955     if (!prAisAbortMsg) {
3956
3957         ASSERT(0); // Can't trigger SCAN FSM
3958         return;
3959     }
3960
3961     prAisAbortMsg->rMsgHdr.eMsgId = MID_HEM_AIS_FSM_ABORT;
3962
3963     mboxSendMsg(prAdapter,
3964             MBOX_ID_0,
3965             (P_MSG_HDR_T) prAisAbortMsg,
3966             MSG_SEND_METHOD_BUF);
3967
3968     wifi_send_msg(INDX_WIFI, MSG_ID_WIFI_IST, 0);
3969
3970     return;
3971 }
3972 #endif /* CFG_TEST_MGMT_FSM */
3973
3974
3975 /*----------------------------------------------------------------------------*/
3976 /*!
3977 * \brief    This function is used to handle OID_802_11_BSSID_LIST_SCAN
3978 *
3979 * \param[in] prAdapter  Pointer of ADAPTER_T
3980 * \param[in] prSsid     Pointer of SSID_T if specified
3981 * \param[in] pucIe      Pointer to buffer of extra information elements to be attached
3982 * \param[in] u4IeLength Length of information elements
3983 *
3984 * \return none
3985 */
3986 /*----------------------------------------------------------------------------*/
3987 VOID
3988 aisFsmScanRequest (
3989     IN P_ADAPTER_T prAdapter,
3990     IN P_PARAM_SSID_T prSsid,
3991     IN PUINT_8  pucIe,
3992     IN UINT_32  u4IeLength
3993     )
3994 {
3995     P_CONNECTION_SETTINGS_T prConnSettings;
3996     P_BSS_INFO_T prAisBssInfo;
3997     P_AIS_FSM_INFO_T prAisFsmInfo;
3998
3999     DEBUGFUNC("aisFsmScanRequest()");
4000
4001     ASSERT(prAdapter);
4002     ASSERT(u4IeLength <= MAX_IE_LENGTH);
4003
4004     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4005     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4006     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4007
4008     if (!prConnSettings->fgIsScanReqIssued) {
4009         prConnSettings->fgIsScanReqIssued = TRUE;
4010
4011         if(prSsid == NULL) {
4012             prAisFsmInfo->ucScanSSIDLen = 0;
4013         }
4014         else {
4015             COPY_SSID(prAisFsmInfo->aucScanSSID,
4016                     prAisFsmInfo->ucScanSSIDLen,
4017                     prSsid->aucSsid,
4018                     (UINT_8)prSsid->u4SsidLen);
4019         }
4020
4021         if(u4IeLength > 0 && u4IeLength <= MAX_IE_LENGTH ) {
4022             prAisFsmInfo->u4ScanIELength = u4IeLength;
4023             if(NULL != pucIe)
4024                         kalMemCopy(prAisFsmInfo->aucScanIEBuf, pucIe, u4IeLength);
4025                         DBGLOG(AIS, WARN, ("u4IeLength in aisFsmScanRequest is: %d\n",u4IeLength));
4026         }
4027         else {
4028             prAisFsmInfo->u4ScanIELength = 0;
4029         }
4030
4031         if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR) {
4032             if(prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE
4033                     && prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
4034                 // 802.1x might not finished yet, pend it for later handling ..
4035                 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4036             }
4037             else {
4038                 if(prAisFsmInfo->fgIsChannelGranted == TRUE) {
4039                     DBGLOG(AIS, WARN, ("Scan Request with channel granted for join operation: %d, %d",
4040                                 prAisFsmInfo->fgIsChannelGranted,
4041                                 prAisFsmInfo->fgIsChannelRequested));
4042                 }
4043
4044                 /* start online scan */
4045                 wlanClearScanningResult(prAdapter);
4046                 aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN);
4047             }
4048         }
4049         else if(prAisFsmInfo->eCurrentState == AIS_STATE_IDLE) {
4050             wlanClearScanningResult(prAdapter);
4051             aisFsmSteps(prAdapter, AIS_STATE_SCAN);
4052         }
4053         else {
4054             aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4055         }
4056     }
4057     else {
4058         DBGLOG(AIS, WARN, ("Scan Request dropped. (state: %d)\n", prAisFsmInfo->eCurrentState));
4059     }
4060
4061     return;
4062 } /* end of aisFsmScanRequest() */
4063
4064
4065 /*----------------------------------------------------------------------------*/
4066 /*!
4067 * \brief    This function is invoked when CNM granted channel privilege
4068 *
4069 * \param[in] prAdapter  Pointer of ADAPTER_T
4070 *
4071 * \return none
4072 */
4073 /*----------------------------------------------------------------------------*/
4074 VOID
4075 aisFsmRunEventChGrant (
4076     IN P_ADAPTER_T prAdapter,
4077     IN P_MSG_HDR_T prMsgHdr
4078     )
4079 {
4080     P_BSS_INFO_T prAisBssInfo;
4081     P_AIS_FSM_INFO_T prAisFsmInfo;
4082     P_MSG_CH_GRANT_T prMsgChGrant;
4083     UINT_8 ucTokenID;
4084     UINT_32 u4GrantInterval;
4085
4086     ASSERT(prAdapter);
4087     ASSERT(prMsgHdr);
4088
4089     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4090     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4091     prMsgChGrant = (P_MSG_CH_GRANT_T)prMsgHdr;
4092
4093     ucTokenID = prMsgChGrant->ucTokenID;
4094     u4GrantInterval = prMsgChGrant->u4GrantInterval;
4095
4096     /* 1. free message */
4097     cnmMemFree(prAdapter, prMsgHdr);
4098
4099     if(prAisFsmInfo->eCurrentState == AIS_STATE_REQ_CHANNEL_JOIN &&
4100             prAisFsmInfo->ucSeqNumOfChReq == ucTokenID) {
4101         /* 2. channel privilege has been approved */
4102         prAisFsmInfo->u4ChGrantedInterval = u4GrantInterval;
4103
4104         /* 3. state transition to join/ibss-alone/ibss-merge */
4105         /* 3.1 set timeout timer in cases join could not be completed */
4106         cnmTimerStartTimer(prAdapter,
4107                 &prAisFsmInfo->rJoinTimeoutTimer,
4108                 prAisFsmInfo->u4ChGrantedInterval - AIS_JOIN_CH_GRANT_THRESHOLD);
4109         /* 3.2 set local variable to indicate join timer is ticking */
4110         prAisFsmInfo->fgIsInfraChannelFinished = FALSE;
4111
4112         /* 3.3 switch to join state */
4113         aisFsmSteps(prAdapter, AIS_STATE_JOIN);
4114
4115         prAisFsmInfo->fgIsChannelGranted = TRUE;
4116     }
4117     else { /* mismatched grant */
4118         /* 2. return channel privilege to CNM immediately */
4119         aisFsmReleaseCh(prAdapter);
4120     }
4121
4122     return;
4123 } /* end of aisFsmRunEventChGrant() */
4124
4125
4126 /*----------------------------------------------------------------------------*/
4127 /*!
4128 * \brief    This function is to inform CNM that channel privilege
4129 *           has been released
4130 *
4131 * \param[in] prAdapter  Pointer of ADAPTER_T
4132 *
4133 * \return none
4134 */
4135 /*----------------------------------------------------------------------------*/
4136 VOID
4137 aisFsmReleaseCh (
4138     IN P_ADAPTER_T prAdapter
4139     )
4140 {
4141     P_AIS_FSM_INFO_T prAisFsmInfo;
4142     P_MSG_CH_ABORT_T prMsgChAbort;
4143
4144     ASSERT(prAdapter);
4145
4146     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4147
4148     if(prAisFsmInfo->fgIsChannelGranted == TRUE
4149             || prAisFsmInfo->fgIsChannelRequested == TRUE) {
4150
4151         prAisFsmInfo->fgIsChannelRequested = FALSE;
4152         prAisFsmInfo->fgIsChannelGranted = FALSE;
4153
4154         /* 1. return channel privilege to CNM immediately */
4155         prMsgChAbort = (P_MSG_CH_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_ABORT_T));
4156         if (!prMsgChAbort) {
4157             ASSERT(0); // Can't release Channel to CNM
4158             return;
4159         }
4160
4161         prMsgChAbort->rMsgHdr.eMsgId  = MID_MNY_CNM_CH_ABORT;
4162         prMsgChAbort->ucNetTypeIndex  = NETWORK_TYPE_AIS_INDEX;
4163         prMsgChAbort->ucTokenID       = prAisFsmInfo->ucSeqNumOfChReq;
4164
4165         mboxSendMsg(prAdapter,
4166                 MBOX_ID_0,
4167                 (P_MSG_HDR_T) prMsgChAbort,
4168                 MSG_SEND_METHOD_BUF);
4169     }
4170
4171     return;
4172 } /* end of aisFsmReleaseCh() */
4173
4174
4175 /*----------------------------------------------------------------------------*/
4176 /*!
4177 * \brief    This function is to inform AIS that corresponding beacon has not
4178 *           been received for a while and probing is not successful
4179 *
4180 * \param[in] prAdapter  Pointer of ADAPTER_T
4181 *
4182 * \return none
4183 */
4184 /*----------------------------------------------------------------------------*/
4185 VOID
4186 aisBssBeaconTimeout (
4187     IN P_ADAPTER_T prAdapter
4188     )
4189 {
4190     P_BSS_INFO_T prAisBssInfo;
4191     BOOLEAN fgDoAbortIndication = FALSE;
4192
4193     ASSERT(prAdapter);
4194
4195     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4196
4197     //4 <1> Diagnose Connection for Beacon Timeout Event
4198     if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4199         if (OP_MODE_INFRASTRUCTURE == prAisBssInfo->eCurrentOPMode) {
4200             P_STA_RECORD_T prStaRec = prAisBssInfo->prStaRecOfAP;
4201
4202             if (prStaRec) {
4203                 fgDoAbortIndication = TRUE;
4204             }
4205         }
4206         else if (OP_MODE_IBSS == prAisBssInfo->eCurrentOPMode) {
4207             fgDoAbortIndication = TRUE;
4208         }
4209     }
4210
4211     //4 <2> invoke abort handler
4212     if (fgDoAbortIndication) {
4213         aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_RADIO_LOST, TRUE);
4214     }
4215
4216     return;
4217 } /* end of aisBssBeaconTimeout() */
4218
4219
4220 /*----------------------------------------------------------------------------*/
4221 /*!
4222 * \brief    This function is to inform AIS that DEAUTH frame has been
4223 *           sent and thus state machine could go ahead
4224 *
4225 * \param[in] prAdapter  Pointer of ADAPTER_T
4226 * \param[in] prMsduInfo Pointer of MSDU_INFO_T for DEAUTH frame
4227 * \param[in] prAdapter  Pointer of ADAPTER_T
4228 *
4229 * \return WLAN_STATUS_SUCCESS
4230 */
4231 /*----------------------------------------------------------------------------*/
4232 WLAN_STATUS
4233 aisDeauthXmitComplete (
4234     IN P_ADAPTER_T              prAdapter,
4235     IN P_MSDU_INFO_T            prMsduInfo,
4236     IN ENUM_TX_RESULT_CODE_T    rTxDoneStatus
4237     )
4238 {
4239     P_AIS_FSM_INFO_T prAisFsmInfo;
4240
4241     ASSERT(prAdapter);
4242
4243     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4244
4245     if(prAisFsmInfo->eCurrentState == AIS_STATE_DISCONNECTING) {
4246         if(rTxDoneStatus != TX_RESULT_DROPPED_IN_DRIVER) {
4247             aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_NEW_CONNECTION, FALSE);
4248         }
4249     }
4250     else {
4251         DBGLOG(AIS, WARN, ("DEAUTH frame transmitted without further handling"));
4252     }
4253
4254     return WLAN_STATUS_SUCCESS;
4255
4256 } /* end of aisDeauthXmitComplete() */
4257
4258 #if CFG_SUPPORT_ROAMING
4259 /*----------------------------------------------------------------------------*/
4260 /*!
4261 * @brief This function will indicate an Event of "Looking for a candidate due to weak signal" to AIS FSM.
4262 *
4263 * @param[in] u4ReqScan  Requesting Scan or not
4264 *
4265 * @return (none)
4266 */
4267 /*----------------------------------------------------------------------------*/
4268 VOID
4269 aisFsmRunEventRoamingDiscovery (
4270     IN P_ADAPTER_T prAdapter,
4271     UINT_32 u4ReqScan
4272     )
4273 {
4274     P_AIS_FSM_INFO_T prAisFsmInfo;
4275     P_CONNECTION_SETTINGS_T prConnSettings;
4276     ENUM_AIS_REQUEST_TYPE_T eAisRequest;
4277
4278     DBGLOG(AIS, LOUD, ("aisFsmRunEventRoamingDiscovery()\n"));
4279
4280     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4281     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4282
4283     /* search candidates by best rssi */
4284     prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
4285
4286     /* results are still new */
4287     if (!u4ReqScan) {
4288         roamingFsmRunEventRoam(prAdapter);
4289         eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4290     }
4291     else {
4292         if(prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN
4293                 || prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4294             eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4295         }
4296         else {
4297             eAisRequest = AIS_REQUEST_ROAMING_SEARCH;
4298         }
4299     }
4300
4301     if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR && prAisFsmInfo->fgIsInfraChannelFinished == TRUE) {
4302         if(eAisRequest == AIS_REQUEST_ROAMING_SEARCH) {
4303             aisFsmSteps(prAdapter, AIS_STATE_LOOKING_FOR);
4304         }
4305         else {
4306             aisFsmSteps(prAdapter, AIS_STATE_SEARCH);
4307         }
4308     }
4309     else {
4310         aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
4311         aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
4312
4313         aisFsmInsertRequest(prAdapter, eAisRequest);
4314     }
4315
4316     return;
4317 } /* end of aisFsmRunEventRoamingDiscovery() */
4318
4319 /*----------------------------------------------------------------------------*/
4320 /*!
4321 * @brief Update the time of ScanDone for roaming and transit to Roam state.
4322 *
4323 * @param (none)
4324 *
4325 * @return (none)
4326 */
4327 /*----------------------------------------------------------------------------*/
4328 ENUM_AIS_STATE_T
4329 aisFsmRoamingScanResultsUpdate (
4330     IN P_ADAPTER_T prAdapter
4331     )
4332 {
4333           P_AIS_FSM_INFO_T prAisFsmInfo;
4334           P_ROAMING_INFO_T prRoamingFsmInfo;
4335           ENUM_AIS_STATE_T eNextState;
4336
4337     DBGLOG(AIS, LOUD, ("->aisFsmRoamingScanResultsUpdate()\n"));
4338
4339     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4340     prRoamingFsmInfo = (P_ROAMING_INFO_T)&(prAdapter->rWifiVar.rRoamingInfo);
4341
4342     roamingFsmScanResultsUpdate(prAdapter);
4343
4344     eNextState = prAisFsmInfo->eCurrentState;
4345     if (prRoamingFsmInfo->eCurrentState == ROAMING_STATE_DISCOVERY) {
4346         roamingFsmRunEventRoam(prAdapter);
4347         eNextState = AIS_STATE_SEARCH;
4348     }
4349     else if (prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4350         eNextState = AIS_STATE_SEARCH;
4351     }
4352     else if (prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
4353         eNextState = AIS_STATE_NORMAL_TR;
4354     }
4355
4356     return eNextState;
4357 } /* end of aisFsmRoamingScanResultsUpdate() */
4358
4359 /*----------------------------------------------------------------------------*/
4360 /*!
4361 * @brief This function will modify and update necessary information to firmware
4362 *        for disconnection of last AP before switching to roaming bss.
4363 *
4364 * @param IN prAdapter          Pointer to the Adapter structure.
4365 *           prTargetStaRec     Target of StaRec of roaming
4366 *
4367 * @retval None
4368 */
4369 /*----------------------------------------------------------------------------*/
4370 VOID
4371 aisFsmRoamingDisconnectPrevAP (
4372     IN P_ADAPTER_T prAdapter,
4373     IN P_STA_RECORD_T prTargetStaRec
4374     )
4375 {
4376     P_BSS_INFO_T prAisBssInfo;
4377
4378     DBGLOG(AIS, LOUD, ("aisFsmRoamingDisconnectPrevAP()"));
4379
4380     ASSERT(prAdapter);
4381
4382     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4383
4384     nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
4385
4386     /* Not invoke rlmBssAborted() here to avoid prAisBssInfo->fg40mBwAllowed
4387      * to be reset. RLM related parameters will be reset again when handling
4388      * association response in rlmProcessAssocRsp(). 20110413
4389      */
4390      //rlmBssAborted(prAdapter, prAisBssInfo);
4391
4392     //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
4393     if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4394         scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
4395     }
4396
4397     //4 <4> Change Media State immediately.
4398     aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
4399
4400     //4 <4.1> sync. with firmware
4401     prTargetStaRec->ucNetTypeIndex = 0xff; /* Virtial NetType */
4402     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
4403     prTargetStaRec->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX; /* Virtial NetType */
4404
4405     return;
4406 } /* end of aisFsmRoamingDisconnectPrevAP() */
4407
4408 /*----------------------------------------------------------------------------*/
4409 /*!
4410 * @brief This function will update the contain of BSS_INFO_T for AIS network once
4411 *        the roaming was completed.
4412 *
4413 * @param IN prAdapter          Pointer to the Adapter structure.
4414 *           prStaRec           StaRec of roaming AP
4415 *           prAssocRspSwRfb
4416 *
4417 * @retval None
4418 */
4419 /*----------------------------------------------------------------------------*/
4420 VOID
4421 aisUpdateBssInfoForRoamingAP (
4422     IN P_ADAPTER_T prAdapter,
4423     IN P_STA_RECORD_T prStaRec,
4424     IN P_SW_RFB_T prAssocRspSwRfb
4425     )
4426 {
4427     P_BSS_INFO_T prAisBssInfo;
4428
4429     DBGLOG(AIS, LOUD, ("aisUpdateBssInfoForRoamingAP()"));
4430
4431     ASSERT(prAdapter);
4432
4433     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4434
4435     //4 <1.1> Change FW's Media State immediately.
4436     aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
4437
4438     //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
4439     if ((prAisBssInfo->prStaRecOfAP) &&
4440        (prAisBssInfo->prStaRecOfAP != prStaRec) &&
4441        (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
4442         cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
4443     }
4444
4445     //4 <1.3> Update BSS_INFO_T
4446     aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
4447
4448     //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
4449     cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
4450
4451     //4 <1.6> Indicate Connected Event to Host immediately.
4452     /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
4453     aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
4454
4455     return;
4456 } /* end of aisFsmRoamingUpdateBss() */
4457
4458 #endif /* CFG_SUPPORT_ROAMING */
4459
4460
4461 /*----------------------------------------------------------------------------*/
4462 /*!
4463 * @brief Check if there is any pending request and remove it (optional)
4464 *
4465 * @param prAdapter
4466 *        eReqType
4467 *        bRemove
4468 *
4469 * @return TRUE
4470 *         FALSE
4471 */
4472 /*----------------------------------------------------------------------------*/
4473 BOOLEAN
4474 aisFsmIsRequestPending (
4475     IN P_ADAPTER_T prAdapter,
4476     IN ENUM_AIS_REQUEST_TYPE_T eReqType,
4477     IN BOOLEAN bRemove
4478     )
4479 {
4480     P_AIS_FSM_INFO_T prAisFsmInfo;
4481     P_AIS_REQ_HDR_T prPendingReqHdr, prPendingReqHdrNext;
4482
4483     ASSERT(prAdapter);
4484     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4485
4486     /* traverse through pending request list */
4487     LINK_FOR_EACH_ENTRY_SAFE(prPendingReqHdr,
4488             prPendingReqHdrNext,
4489             &(prAisFsmInfo->rPendingReqList),
4490             rLinkEntry,
4491             AIS_REQ_HDR_T) {
4492         /* check for specified type */
4493         if(prPendingReqHdr->eReqType == eReqType) {
4494             /* check if need to remove */
4495             if(bRemove == TRUE) {
4496                 LINK_REMOVE_KNOWN_ENTRY(&(prAisFsmInfo->rPendingReqList), &(prPendingReqHdr->rLinkEntry));
4497
4498                 cnmMemFree(prAdapter, prPendingReqHdr);
4499             }
4500
4501             return TRUE;
4502         }
4503     }
4504
4505     return FALSE;
4506 }
4507
4508
4509 /*----------------------------------------------------------------------------*/
4510 /*!
4511 * @brief Get next pending request
4512 *
4513 * @param prAdapter
4514 *
4515 * @return P_AIS_REQ_HDR_T
4516 */
4517 /*----------------------------------------------------------------------------*/
4518 P_AIS_REQ_HDR_T
4519 aisFsmGetNextRequest (
4520     IN P_ADAPTER_T prAdapter
4521     )
4522 {
4523     P_AIS_FSM_INFO_T prAisFsmInfo;
4524     P_AIS_REQ_HDR_T prPendingReqHdr;
4525
4526     ASSERT(prAdapter);
4527     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4528
4529     LINK_REMOVE_HEAD(&(prAisFsmInfo->rPendingReqList), prPendingReqHdr, P_AIS_REQ_HDR_T);
4530
4531     return prPendingReqHdr;
4532 }
4533
4534
4535 /*----------------------------------------------------------------------------*/
4536 /*!
4537 * @brief Insert a new request
4538 *
4539 * @param prAdapter
4540 *        eReqType
4541 *
4542 * @return TRUE
4543 *         FALSE
4544 */
4545 /*----------------------------------------------------------------------------*/
4546 BOOLEAN
4547 aisFsmInsertRequest (
4548     IN P_ADAPTER_T prAdapter,
4549     IN ENUM_AIS_REQUEST_TYPE_T eReqType
4550     )
4551 {
4552     P_AIS_REQ_HDR_T prAisReq;
4553     P_AIS_FSM_INFO_T prAisFsmInfo;
4554
4555     ASSERT(prAdapter);
4556     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4557
4558     prAisReq = (P_AIS_REQ_HDR_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(AIS_REQ_HDR_T));
4559
4560     if(!prAisReq) {
4561         ASSERT(0); // Can't generate new message
4562         return FALSE;
4563     }
4564
4565     prAisReq->eReqType = eReqType;
4566
4567     /* attach request into pending request list */
4568     LINK_INSERT_TAIL(&prAisFsmInfo->rPendingReqList, &prAisReq->rLinkEntry);
4569
4570     return TRUE;
4571 }
4572
4573
4574 /*----------------------------------------------------------------------------*/
4575 /*!
4576 * @brief Flush all pending requests
4577 *
4578 * @param prAdapter
4579 *
4580 * @return (none)
4581 */
4582 /*----------------------------------------------------------------------------*/
4583 VOID
4584 aisFsmFlushRequest (
4585     IN P_ADAPTER_T prAdapter
4586     )
4587 {
4588     P_AIS_REQ_HDR_T prAisReq;
4589
4590     ASSERT(prAdapter);
4591
4592     while((prAisReq = aisFsmGetNextRequest(prAdapter)) != NULL) {
4593         cnmMemFree(prAdapter, prAisReq);
4594     }
4595
4596     return;
4597 }
4598
4599