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