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