1a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/*
2a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * smeSm.c
3a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
43bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved.
5a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * All rights reserved.
6a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
7a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Redistribution and use in source and binary forms, with or without
8a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * modification, are permitted provided that the following conditions
9a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * are met:
10a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
11a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *  * Redistributions of source code must retain the above copyright
12a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *    notice, this list of conditions and the following disclaimer.
13a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *  * Redistributions in binary form must reproduce the above copyright
14a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *    notice, this list of conditions and the following disclaimer in
15a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *    the documentation and/or other materials provided with the
16a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *    distribution.
17a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *  * Neither the name Texas Instruments nor the names of its
18a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *    contributors may be used to endorse or promote products derived
19a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *    from this software without specific prior written permission.
20a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
21a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
33a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
34a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** \file  smeSm.c
35a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *  \brief SME state machine implementation
36a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
37a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *  \see   smeSm.h, sme.c, sme.h
38a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
39a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
40a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
41a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#define __FILE_ID__  FILE_ID_43
42a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "GenSM.h"
43a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "smeSm.h"
44a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "smePrivate.h"
45a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "connApi.h"
46a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "apConn.h"
47a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "ScanCncn.h"
48a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "scanResultTable.h"
49a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "EvHandler.h"
50a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "regulatoryDomainApi.h"
51a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "siteMgrApi.h"
52a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "DrvMain.h"
53a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
54a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
55a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic OS_802_11_DISASSOCIATE_REASON_E eDisassocConvertTable[ MGMT_STATUS_MAX_NUM +1] =
56a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
57a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_UNSPECIFIED,
58a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_UNSPECIFIED,
59a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_AUTH_REJECT,
60a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_ASSOC_REJECT,
61a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_SECURITY_FAILURE,
62a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_AP_DEAUTHENTICATE,
63a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_AP_DISASSOCIATE,
64a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_ROAMING_TRIGGER,
65a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_UNSPECIFIED,
66a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_UNSPECIFIED,
67a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_UNSPECIFIED,
68a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_UNSPECIFIED,
69a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_UNSPECIFIED,
70a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_UNSPECIFIED,
71a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_UNSPECIFIED,
72a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_DISASSOC_STATUS_UNSPECIFIED
73a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt};
74a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
75a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#define SME_CONVERT_DISASSOC_CODES(disassocReason)     (eDisassocConvertTable[ (disassocReason) ])
76a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
77a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_Start (TI_HANDLE hSme);
78a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_Stop (TI_HANDLE hSme);
79a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_PreConnect (TI_HANDLE hSme);
80a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_Connect (TI_HANDLE hSme);
81a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_ConnectSuccess (TI_HANDLE hSme);
82a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_Disconnect (TI_HANDLE hSme);
83a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_DisconnectDone (TI_HANDLE hSme);
84a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_StopScan (TI_HANDLE hSme);
85a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_StopConnect (TI_HANDLE hSme);
86a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_ConnWhenConnecting (TI_HANDLE hSme);
87a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_ActionUnexpected (TI_HANDLE hSme);
88a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_NopAction (TI_HANDLE hSme);
89a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_CheckStartConditions (TI_HANDLE hSme);
90a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
91a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic TI_STATUS sme_StartScan (TI_HANDLE hSme);
92a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void sme_updateScanCycles (TI_HANDLE hSme,
93a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                  TI_BOOL bDEnabled,
94a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                  TI_BOOL bCountryValid,
95a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                  TI_BOOL bConstantScan);
96a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void sme_CalculateCyclesNumber (TI_HANDLE hSme, TI_UINT32 uTotalTimeMs);
97a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
98a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTGenSM_actionCell tSmMatrix[ SME_SM_NUMBER_OF_STATES ][ SME_SM_NUMBER_OF_EVENTS ] =
99a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
100a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        { /* SME_SM_STATE_IDLE */
101a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_WAIT_CONNECT, smeSm_Start },             /* SME_SM_EVENT_START */
102a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_IDLE, smeSm_ActionUnexpected },          /* SME_SM_EVENT_STOP */
103a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_IDLE, smeSm_ActionUnexpected },          /* SME_SM_EVENT_CONNECT */
104a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_IDLE, smeSm_ActionUnexpected },          /* SME_SM_EVENT_CONNECT_SUCCESS */
105a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_IDLE, smeSm_ActionUnexpected },          /* SME_SM_EVENT_CONNECT_FAILURE */
106a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_IDLE, smeSm_CheckStartConditions },          /* SME_SM_EVENT_DISCONNECT */
107a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        },
108a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        { /* SME_SM_STATE_WAIT_CONNECT */
109a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_WAIT_CONNECT, smeSm_ActionUnexpected },  /* SME_SM_EVENT_START */
110a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_IDLE, smeSm_Stop },                      /* SME_SM_EVENT_STOP */
111a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_SCANNING, smeSm_PreConnect },            /* SME_SM_EVENT_CONNECT */
112a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_WAIT_CONNECT, smeSm_ActionUnexpected },  /* SME_SM_EVENT_CONNECT_SUCCESS */
113a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_WAIT_CONNECT, smeSm_ActionUnexpected },  /* SME_SM_EVENT_CONNECT_FAILURE */
114a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_WAIT_CONNECT, smeSm_Start },             /* SME_SM_EVENT_DISCONNECT */
115a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        },
116a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        { /* SME_SM_STATE_SCANNING */
117a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_SCANNING, smeSm_ActionUnexpected },      /* SME_SM_EVENT_START */
118a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_DISCONNECTING, smeSm_StopScan },         /* SME_SM_EVENT_STOP */
119a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_CONNECTING, smeSm_Connect },             /* SME_SM_EVENT_CONNECT */
120a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_SCANNING, smeSm_ActionUnexpected },      /* SME_SM_EVENT_CONNECT_SUCCESS */
121a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_WAIT_CONNECT, smeSm_DisconnectDone },    /* SME_SM_EVENT_CONNECT_FAILURE */
122a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_DISCONNECTING, smeSm_StopScan },         /* SME_SM_EVENT_DISCONNECT */
123a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        },
124a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        { /* SME_SM_STATE_CONNECTING */
125a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_CONNECTING, smeSm_ActionUnexpected },    /* SME_SM_EVENT_START */
126a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_DISCONNECTING, smeSm_StopConnect },      /* SME_SM_EVENT_STOP */
127a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_CONNECTING, smeSm_ConnWhenConnecting },  /* SME_SM_EVENT_CONNECT */
128a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_CONNECTED, smeSm_ConnectSuccess },       /* SME_SM_EVENT_CONNECT_SUCCESS */
129a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_WAIT_CONNECT, smeSm_DisconnectDone },    /* SME_SM_EVENT_CONNECT_FAILURE */
130a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_DISCONNECTING, smeSm_StopConnect },      /* SME_SM_EVENT_DISCONNECT */
131a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        },
132a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        { /* SME_SM_STATE_CONNECTED */
133a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_CONNECTED, smeSm_ActionUnexpected },     /* SME_SM_EVENT_START */
134a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_DISCONNECTING, smeSm_Disconnect },       /* SME_SM_EVENT_STOP */
135a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_CONNECTED, smeSm_ActionUnexpected },     /* SME_SM_EVENT_CONNECT */
136a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_CONNECTED, smeSm_ActionUnexpected },     /* SME_SM_EVENT_CONNECT_SUCCESS */
137a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_WAIT_CONNECT, smeSm_DisconnectDone },    /* SME_SM_EVENT_CONNECT_FAILURE */
138a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_DISCONNECTING, smeSm_Disconnect },       /* SME_SM_EVENT_DISCONNECT */
139a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        },
140a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        { /* SME_SM_STATE_DISCONNECTING */
141a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_DISCONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_START */
142a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_DISCONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_STOP */
143a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_DISCONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT */
144a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_DISCONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_SUCCESS */
145a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_WAIT_CONNECT, smeSm_DisconnectDone },    /* SME_SM_EVENT_CONNECT_FAILURE */
146a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            { SME_SM_STATE_DISCONNECTING, smeSm_NopAction }, /* SME_SM_EVENT_DISCONNECT */
147a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
148a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    };
149a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
150a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_INT8*  uStateDescription[] =
151a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
152a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        "IDLE",
153a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        "WAIT_CONNECT",
154a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        "SCANNING",
155a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        "CONNECTING",
156a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        "CONNECTED",
157a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        "DISCONNECTING"
158a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    };
159a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
160a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_INT8*  uEventDescription[] =
161a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
162a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        "START",
163a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        "STOP",
164a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        "CONNECT",
165a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        "CONNECT_SUCCESS",
166a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        "CONNECT_FAILURE",
167a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        "DISCONNECT"
168a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    };
169a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
170a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
171a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     smeSm_Start
172a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Starts STA opeartion by moving SCR out of idle group and starting connection process
173a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
174a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Starts STA opeartion by moving SCR out of idle group and starting connection process
175a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
176a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
177a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
178a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     smeSm_Stop, sme_start
179a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
180a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_Start (TI_HANDLE hSme)
181a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
182a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme    *pSme = (TSme*)hSme;
183a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
184a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* set SCR group according to connection mode */
185a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (CONNECT_MODE_AUTO == pSme->eConnectMode)
186a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
187a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "smeSm_Start: changing SCR group to DRV scan\n");
188a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        scr_setGroup (pSme->hScr, SCR_GID_DRV_SCAN);
189a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
190a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else
191a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
192a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "smeSm_Start: changing SCR group to APP scan\n");
193a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        scr_setGroup (pSme->hScr, SCR_GID_APP_SCAN);
194a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
195a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
196a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ((TI_FALSE == pSme->bRadioOn) || (TI_FALSE == pSme->bRunning))
197a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
198a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* Radio is off so send stop event */
1993bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt        sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_STOP, hSme);
200a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
201a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else if (TI_TRUE == pSme->bConnectRequired)
202a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
203a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* if connection was required, start the process */
2043bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt        sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT, hSme);
205a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
206a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
207a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
208a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
209a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     smeSm_Stop
210a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Turns off the STA
211a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
212a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Turns off the STA by moving the SCr to idle
213a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
214a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
215a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
216a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     smeSm_Start, sme_Stop
217a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
218a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_Stop (TI_HANDLE hSme)
219a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
220a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme    *pSme = (TSme*)hSme;
221a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
222a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* set SCR group to idle */
223a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scr_setGroup (pSme->hScr, SCR_GID_IDLE);
224a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
225a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (TI_FALSE == pSme->bRunning)
226a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
227a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* call DrvMain */
228a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        drvMain_SmeStop (pSme->hDrvMain);
229a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
230a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
231a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
232a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
233a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     smeSm_PreConnect
234a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Initiates the connection process
235a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
236a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Initiates the connection process - for automatic mode, start scan, for manual mode - triggers connection
237a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
238a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
239a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
240a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     smeSm_Connect, smeSm_ConnectSuccess
241a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
242a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_PreConnect (TI_HANDLE hSme)
243a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
244a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme *pSme = (TSme *)hSme;
245a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    paramInfo_t	*pParam;
246a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
247a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* set the connection mode with which this connection attempt is starting */
248a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pSme->eLastConnectMode = pSme->eConnectMode;
249a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
250a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* mark that no authentication/assocaition was yet sent */
251a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pSme->bAuthSent = TI_FALSE;
252a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
253a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* try to find a connection candidate (manual mode have already performed scann */
254a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pSme->pCandidate = sme_Select (hSme);
255a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (NULL != pSme->pCandidate)
256a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
257a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* candidate is available - attempt connection */
2583bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt        sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT, hSme);
259a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
260a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* no candidate */
261a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else
262a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
263a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        if (CONNECT_MODE_AUTO == pSme->eConnectMode)
264a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
265a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* automatic mode - start scanning */
266a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            if (TI_OK != sme_StartScan (hSme))
267a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            {
268a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                TRACE0(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_PreConnect: unable to start scan, stopping the SME\n");
269a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                pSme->bRadioOn = TI_FALSE;
2703bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt                sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme);
271a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            }
272a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
273a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* update scan count counter */
274a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            if(pSme->uScanCount < PERIODIC_SCAN_MAX_INTERVAL_NUM)
275a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            {
276a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                pSme->uScanCount++;
277a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            }
278a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
279a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
280a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        else		/* Manual mode */
281a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
282a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt			/* for IBSS or any, if no entries where found, add the self site */
283a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt			if (pSme->eBssType == BSS_INFRASTRUCTURE)
284a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            {
285a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                /* makr whether we need to stop the attempt connection in manual mode */
286a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                pSme->bConnectRequired = TI_FALSE;
287ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt
288ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt				TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "smeSm_PreConnect: No candidate available, sending connect failure\n");
289a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                /* manual mode and no connection candidate is available - connection failed */
2903bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt                sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme);
291a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt			}
292a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
293a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt			else		/* IBSS */
294a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt			{
295ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt				TI_UINT8    uDesiredChannel;
296a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                TI_BOOL     channelValidity;
297ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt
298a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		        pSme->bConnectRequired = TI_FALSE;
299a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
300a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                pParam = (paramInfo_t *)os_memoryAlloc(pSme->hOS, sizeof(paramInfo_t));
301a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                if (!pParam)
302a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                {
303a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                    return;
304a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                }
305a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
306a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				pParam->paramType = SITE_MGR_DESIRED_CHANNEL_PARAM;
307a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				siteMgr_getParam(pSme->hSiteMgr, pParam);
308a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				uDesiredChannel = pParam->content.siteMgrDesiredChannel;
309a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
310a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				if (uDesiredChannel >= SITE_MGR_CHANNEL_A_MIN)
311a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				{
312a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				   pParam->content.channelCapabilityReq.band = RADIO_BAND_5_0_GHZ;
313a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				}
314a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				else
315a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				{
316a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				   pParam->content.channelCapabilityReq.band = RADIO_BAND_2_4_GHZ;
317a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				}
318a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
319a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				/*
320a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				update the regulatory domain with the selected band
321a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				*/
322a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				/* Check if the selected channel is valid according to regDomain */
323a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				pParam->paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES;
324a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				pParam->content.channelCapabilityReq.scanOption = ACTIVE_SCANNING;
325a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				pParam->content.channelCapabilityReq.channelNum = uDesiredChannel;
326a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
327ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt				regulatoryDomain_getParam (pSme->hRegDomain, pParam);
328a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                channelValidity = pParam->content.channelCapabilityRet.channelValidity;
329a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                os_memoryFree(pSme->hOS, pParam, sizeof(paramInfo_t));
330a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				if (!channelValidity)
331a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				{
332a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				   TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "IBSS SELECT FAILURE  - No channel !!!\n\n");
333a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
3343bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt				   sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme);
335a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
336a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				   return;
337a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				}
338a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
339a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				pSme->pCandidate = (TSiteEntry *)addSelfSite(pSme->hSiteMgr);
340a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
341a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				if (pSme->pCandidate == NULL)
342a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				{
343a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				   TRACE0(pSme->hReport, REPORT_SEVERITY_ERROR , "IBSS SELECT FAILURE  - could not open self site !!!\n\n");
344a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
3453bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt				   sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme);
346a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
347a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				   return;
348a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				}
349a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
350a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#ifdef REPORT_LOG
351a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				TRACE6(pSme->hReport, REPORT_SEVERITY_CONSOLE,"%%%%%%%%%%%%%%	SELF SELECT SUCCESS, bssid: %X-%X-%X-%X-%X-%X	%%%%%%%%%%%%%%\n\n", pSme->pCandidate->bssid[0], pSme->pCandidate->bssid[1], pSme->pCandidate->bssid[2], pSme->pCandidate->bssid[3], pSme->pCandidate->bssid[4], pSme->pCandidate->bssid[5]);
352a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                WLAN_OS_REPORT (("%%%%%%%%%%%%%%	SELF SELECT SUCCESS, bssid: %02x.%02x.%02x.%02x.%02x.%02x %%%%%%%%%%%%%%\n\n", pSme->pCandidate->bssid[0], pSme->pCandidate->bssid[1], pSme->pCandidate->bssid[2], pSme->pCandidate->bssid[3], pSme->pCandidate->bssid[4], pSme->pCandidate->bssid[5]));
353a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#endif
354a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt				/* a connection candidate is available, send a connect event */
3553bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt				sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT, hSme);
356a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt			}
357a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
358a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
359a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
360a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
361a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
362a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     smeSm_Connect
363a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Starts a connection process with the selected network
364a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
365a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Starts a connection process with the selected network
366a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
367a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
368a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
369a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     smeSm_PreConnect, smeSm_ConnectSuccess
370a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
371a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_Connect (TI_HANDLE hSme)
372a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
373ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt    TSme            *pSme = (TSme*)hSme;
374a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_STATUS       tStatus;
375a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    paramInfo_t     *pParam;
376a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
377a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* Sanity check - if no connection candidate was found so far */
378a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (NULL == pSme->pCandidate)
379a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
380a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE0(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_Connect: No candidate available, sending connect failure\n");
3813bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt        sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme);
382a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
383a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else
384a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
385a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pParam = (paramInfo_t *)os_memoryAlloc(pSme->hOS, sizeof(paramInfo_t));
386a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        if (!pParam)
387a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
388a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            return;
389a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
390a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
391a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       /* set SCR group */
392a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       if (BSS_INFRASTRUCTURE == pSme->pCandidate->bssType)
393a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       {
394a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           scr_setGroup (pSme->hScr, SCR_GID_CONNECT);
395a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       }
396a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
397a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       /***************** Config Connection *************************/
398a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       pParam->paramType = CONN_TYPE_PARAM;
399a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       if (BSS_INDEPENDENT == pSme->pCandidate->bssType)
400a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           if (SITE_SELF == pSme->pCandidate->siteType)
401a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           {
402a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt               pParam->content.connType = CONNECTION_SELF;
403a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           }
404a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           else
405a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           {
406a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt               pParam->content.connType = CONNECTION_IBSS;
407a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           }
408a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       else
409ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt           pParam->content.connType = CONNECTION_INFRA;
410ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt       conn_setParam(pSme->hConn, pParam);
411a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       os_memoryFree(pSme->hOS, pParam, sizeof(paramInfo_t));
412a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
413a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       /* start the connection process */
414a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       tStatus = conn_start (pSme->hConn, CONN_TYPE_FIRST_CONN, sme_ReportConnStatus, hSme, TI_FALSE, TI_FALSE);
415a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       if (TI_OK != tStatus)
416a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       {
417a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_Connect: conn_start returned status %d\n", tStatus);
418a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       }
419a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
420a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
421a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
422a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
423a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     smeSm_ConnectSuccess
424a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Handles connection success indication
425a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
426a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Handles connection success indication - starts AP conn and set SCR group to connected
427a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
428a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
429a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
430a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     smeSm_PreConnect, smeSm_Connect
431a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
432a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_ConnectSuccess (TI_HANDLE hSme)
433a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
434a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme        *pSme = (TSme*)hSme;
435a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
436a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pSme->uScanCount = 0;
437a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
438a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* connection succedded to the connection candidate - start AP connection */
439a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (BSS_INFRASTRUCTURE == pSme->pCandidate->bssType)
440a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
441a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* Start the AP connection */
442a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        apConn_start (pSme->hApConn,
443a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                      (pSme->tSsid.len != 0) && !OS_802_11_SSID_JUNK (pSme->tSsid.str, pSme->tSsid.len));
444a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
445a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
446a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* Set SCR group to connected */
447a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scr_setGroup (pSme->hScr, SCR_GID_CONNECTED);
448a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
449a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
450a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
451a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     smeSm_Disconnect
452a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Starts a disconnect by calling the AP connection or connect modules
453a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
454a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Starts a disconnect by calling the AP connection or connect modules
455a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
456a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
457a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
458a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     smeSm_DisconnectDone
459a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
460a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_Disconnect (TI_HANDLE hSme)
461a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
462a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme        *pSme = (TSme*)hSme;
463a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_STATUS   tStatus;
464a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
465a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* set the SCr group to connecting */
466a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scr_setGroup (pSme->hScr, SCR_GID_CONNECT);
467a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
468a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (BSS_INFRASTRUCTURE == pSme->pCandidate->bssType)
469a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
470a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		 /* Call the AP connection to perform disconnect */
471a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		 tStatus = apConn_stop (pSme->hApConn, TI_TRUE);
472a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	}
473a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	else
474a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	{
475a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	    /* In IBSS disconnect is done directly with the connection SM */
476a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		tStatus = conn_stop(pSme->hConn, DISCONNECT_DE_AUTH, STATUS_UNSPECIFIED,
477a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt						   TI_TRUE, sme_ReportConnStatus, hSme);
478a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		if (tStatus != TI_OK)
479a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		{
480a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_Disconnect: conn_stop retruned %d\n", tStatus);
481a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		}
482a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
483a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
484a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
485a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
486a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     smeSm_DisconnectDone
487a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Finish a disconnect process
488a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
489a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Finish a disconnect process by sending the appropriate event and restarting the state-machine
490a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
491a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
492a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
493a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     smeSm_Disconnect
494a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
495a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_DisconnectDone (TI_HANDLE hSme)
496a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
497a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme        *pSme = (TSme*)hSme;
498a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    OS_802_11_DISASSOCIATE_REASON_T	    tEventReason;
499a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
500a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (TI_FALSE == pSme->bReselect)
501a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
502a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* send an event notifying the disassocation */
503a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        if (TI_TRUE == pSme->bAuthSent)
504a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
505a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            tEventReason.eDisAssocType = SME_CONVERT_DISASSOC_CODES (pSme->tDisAssoc.eMgmtStatus);
506a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            tEventReason.uStatusCode = pSme->tDisAssoc.uStatusCode;
507a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            EvHandlerSendEvent (pSme->hEvHandler, IPC_EVENT_DISASSOCIATED, (TI_UINT8*)&tEventReason,
508a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                sizeof(OS_802_11_DISASSOCIATE_REASON_T));
509a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
510a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        else if (CONNECT_MODE_AUTO != pSme->eLastConnectMode)
511a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
512a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            EvHandlerSendEvent (pSme->hEvHandler, IPC_EVENT_NOT_ASSOCIATED, NULL, 0);
513a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
514a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
515a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
516a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    siteMgr_disSelectSite (pSme->hSiteMgr);
517a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
518a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* try to reconnect */
519a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    smeSm_Start (hSme);
520a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
521a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
522a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
523a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     smeSm_StopScan
524a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Stops the SME scan operation
525a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
526a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Stops the SME scan operation
527a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
528a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
529a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
530a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     smeSm_PreConnect, sme_StartScan
531a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
532a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_StopScan (TI_HANDLE hSme)
533a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
534a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme        *pSme = (TSme*)hSme;
535a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
536a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanCncn_StopPeriodicScan (pSme->hScanCncn, SCAN_SCC_DRIVER);
537a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
538a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
539a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
540a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     smeSm_StopConnect
541a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Stops the connect module
542a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
543a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Stops the connect module (if the SME is stopped during a connect attempt
544a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
545a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
546a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
547a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     smeSm_Connect
548a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
549a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_StopConnect (TI_HANDLE hSme)
550a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
551a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme        *pSme = (TSme*)hSme;
552a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_STATUS   tStatus;
553a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
554a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    tStatus = conn_stop (pSme->hConn, DISCONNECT_DE_AUTH, STATUS_UNSPECIFIED,
555a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                         TI_TRUE, sme_ReportConnStatus, hSme);
556a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
557a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (TI_OK != tStatus)
558a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
559a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_StopConnect: conn_stop returned status %d\n", tStatus);
560a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
561a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
562a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
563a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
564a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     smeSm_ConnWhenConnecting
565a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Starts the connect process again
566a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
567a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Starts the connect process again
568a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
569a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
570a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
571a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     smeSm_Connect
572a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
573a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_ConnWhenConnecting (TI_HANDLE hSme)
574a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
575a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme        *pSme = (TSme*)hSme;
576a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_STATUS   tStatus;
577a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
578a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* start the connection process */
579a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    tStatus = conn_start (pSme->hConn, CONN_TYPE_FIRST_CONN, sme_ReportConnStatus, hSme, TI_FALSE, TI_FALSE);
580a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (TI_OK != tStatus)
581a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
582a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_ConnWhenConnecting: conn_start returned status %d\n", tStatus);
583a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
584a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
585a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
586a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
587a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     smeSm_ActionUnexpected
588a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Called when an unexpected event (for current state) is received
589a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
590a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Called when an unexpected event (for current state) is received
591a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
592a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
593a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
594a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
595a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_ActionUnexpected (TI_HANDLE hSme)
596a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
597a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme        *pSme = (TSme*)hSme;
598a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
599a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TRACE0(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_ActionUnexpected called\n");
600a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
601a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
602a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
603a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     smeSm_NopAction
604a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Called when event call and don't need to do nothing.
605a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
606a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
607a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
608a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
609a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_NopAction (TI_HANDLE hSme)
610a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
611a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme        *pSme = (TSme*)hSme;
612a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
613a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "smeSm_NopAction called\n");
614a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
615a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
616a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_CheckStartConditions (TI_HANDLE hSme)
617a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
618a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme        *pSme = (TSme*)hSme;
619a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
620a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ((TI_TRUE == pSme->bRunning) && (TI_TRUE == pSme->bRadioOn))
621a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
622a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* send a start event */
6233bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt        sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_START, hSme);
624a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
625a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
626a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
627a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
628a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* do we need to verify G only / A only / dual-band with site mgr? or rely on channels only? */
629a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
630a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
631a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     sme_StartScan
632a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Set scan parameters and calls scan concnetartor to start the scan operation.
633a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
634a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Set scan parameters and calls scan concnetartor to start the scan operation.
635a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
636a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Scan parameters are set according to scan target - find country IE, find desired SSID, or both
637a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * (one on each band). To find country IE we use passive scan forever, to find the desired SSID we
638a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * use active scan until the current country IE expires. In addition, we take into account the WSC PB
639a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * mode - scan constantly for two minutes (but under the country validity and expiry constraints)
640a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
641a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
642a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK if scan started successfully, TI_NOK otherwise
643a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     smeSm_PreConnect
644a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
645a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS sme_StartScan (TI_HANDLE hSme)
646a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
647a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme            *pSme = (TSme*)hSme;
648a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    paramInfo_t     *pParam;
649a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_BOOL         bDEnabled, bCountryValid;
650a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_BOOL         bBandChannelExist[ RADIO_BAND_NUM_OF_BANDS ];
651a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_BOOL         bBandCountryFound[ RADIO_BAND_NUM_OF_BANDS ];
652a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_STATUS       tStatus;
653a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_UINT32       uIndex;
654a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
655a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* get 802.11d enable state */
656a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pParam = (paramInfo_t *)os_memoryAlloc(pSme->hOS, sizeof(paramInfo_t));
657a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (!pParam)
658a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
659a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        return TI_NOK;
660a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
661a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
662a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pParam->paramType = REGULATORY_DOMAIN_ENABLED_PARAM;
663a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    regulatoryDomain_getParam (pSme->hRegDomain, pParam);
664a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    bDEnabled = pParam->content.regulatoryDomainEnabled;
665a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
666a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pParam->paramType = REGULATORY_DOMAIN_IS_COUNTRY_FOUND;
667a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* get country validity for all bands */
668a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    for (uIndex = 0; uIndex < RADIO_BAND_NUM_OF_BANDS; uIndex++)
669a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
6703bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt        pParam->content.eRadioBand = (ERadioBand)uIndex;
671a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        regulatoryDomain_getParam (pSme->hRegDomain, pParam);
672a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        bBandCountryFound[ uIndex ] = pParam->content.bIsCountryFound;
673a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* also nullify the channel exist indication for this band */
674a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        bBandChannelExist[ uIndex ] = TI_FALSE;
675a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
676a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    os_memoryFree(pSme->hOS, pParam, sizeof(paramInfo_t));
677a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
678a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* First fill the channels */
679a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    for (uIndex = 0; uIndex < pSme->tInitParams.uChannelNum; uIndex++)
680a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
681a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* for each channel, if country is found, set active scan */
682a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.tChannels[ uIndex ].eBand = pSme->tInitParams.tChannelList[ uIndex ].eBand;
683a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.tChannels[ uIndex ].uChannel = pSme->tInitParams.tChannelList[ uIndex ].uChannel;
684a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.tChannels[ uIndex ].uMaxDwellTimeMs = pSme->tInitParams.uMaxScanDuration;
685a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.tChannels[ uIndex ].uMinDwellTimeMs = pSme->tInitParams.uMinScanDuration;
686a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.tChannels[ uIndex ].uTxPowerLevelDbm = DEF_TX_POWER;
687a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
688a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* if 802.11d is disabled, or country is available for this band */
689a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        if ((TI_FALSE == bDEnabled) ||
690a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            (TI_TRUE == bBandCountryFound[ pSme->tInitParams.tChannelList[ uIndex ].eBand ]))
691a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
692a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* set active scan */
693a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.tChannels[ uIndex ].eScanType = SCAN_TYPE_NORMAL_ACTIVE;
694a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
695a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* 802.11d is enabled and no country available */
696a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        else
697a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
698a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* set passive scan */
699a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.tChannels[ uIndex ].eScanType = SCAN_TYPE_NORMAL_PASSIVE;
700a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
701a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /*
702a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             * in order to fined country set uMaxDwellTimeMs ( that at passive scan set the passiveScanDuration )
703a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             * to significant value
704a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             */
705a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.tChannels[ uIndex ].uMaxDwellTimeMs = SCAN_CNCN_REGULATORY_DOMAIN_PASSIVE_DWELL_TIME_DEF;
706a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
707a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* mark that a channel exists for this band */
708a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        bBandChannelExist[ pSme->tInitParams.tChannelList[ uIndex ].eBand ] = TI_TRUE;
709a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
710a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* set number of channels */
711a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pSme->tScanParams.uChannelNum = pSme->tInitParams.uChannelNum;
712a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
713a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* now, fill global parameters */
714a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pSme->tScanParams.uProbeRequestNum = pSme->tInitParams.uProbeReqNum;
715a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pSme->tScanParams.iRssiThreshold = pSme->tInitParams.iRssiThreshold;
716a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pSme->tScanParams.iSnrThreshold = pSme->tInitParams.iSnrThreshold;
717a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pSme->tScanParams.bTerminateOnReport = TI_TRUE;
718a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pSme->tScanParams.uFrameCountReportThreshold = 1;
719a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
720a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /*
721a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt     * if for at least one band country is known and scan is performed on this band - means we need to
722a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt     * take into consideration country expiry, plus we are scanning for the desired SSID
723a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt     */
724a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    bCountryValid = ((TI_TRUE == bBandChannelExist[ RADIO_BAND_2_4_GHZ ]) && (TI_TRUE == bBandCountryFound[ RADIO_BAND_2_4_GHZ ])) ||
725a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                    ((TI_TRUE == bBandChannelExist[ RADIO_BAND_5_0_GHZ ]) && (TI_TRUE == bBandCountryFound[ RADIO_BAND_5_0_GHZ ]));
726a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
727a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* set SSID(s) and BSS type according to 802.11d status, and country availability */
728a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* if 802.11d is disabled */
729a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (TI_FALSE == bDEnabled)
730a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
731a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.eBssType = pSme->eBssType;
732a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* set the deisred SSID, or any SSID if this is the desired SSID */
733a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        if (SSID_TYPE_ANY == pSme->eSsidType)
734a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
735a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.uSsidNum = 0;
736a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.uSsidListFilterEnabled = 1;
737a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
738a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        else
739a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
740a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.tDesiredSsid[ 0 ].eVisability = SCAN_SSID_VISABILITY_HIDDEN;
741a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            os_memoryCopy (pSme->hOS, &(pSme->tScanParams.tDesiredSsid[ 0 ].tSsid), &(pSme->tSsid), sizeof (TSsid));
742a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.uSsidNum = 1;
743a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.uSsidListFilterEnabled = 1;
744a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
745a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#ifdef XCC_MODULE_INCLUDED
746a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.uSsidListFilterEnabled = (TI_UINT8)TI_FALSE;
747a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.uSsidNum = 2;
748a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.tDesiredSsid[ 1 ].tSsid.len = 0;
749a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.tDesiredSsid[ 1 ].eVisability =  SCAN_SSID_VISABILITY_PUBLIC;
750a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#endif
751a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
752a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
753a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
754a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* Country code exists and scan is performed on this band - take country expiry timr into account */
755a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else if (TI_TRUE == bCountryValid)
756a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
757a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "sme_StartScan: performing active scan to find desired SSID\n");
758a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
759a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* we already know that at least on one band we know the country IE, so we scan for our SSID */
760a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.tDesiredSsid[ 0 ].eVisability = SCAN_SSID_VISABILITY_HIDDEN;
761a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        os_memoryCopy (pSme->hOS, &(pSme->tScanParams.tDesiredSsid[ 0 ].tSsid), &(pSme->tSsid), sizeof (TSsid));
762a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /*
763a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt         * if, in addition, we scan the other band to find its country, and the desired SSDI is not any SSID,
764a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt         * add an empty SSID
765a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt         */
766a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        if ((SSID_TYPE_ANY != pSme->eSsidType) &&
767a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            (((TI_TRUE == bBandChannelExist[ RADIO_BAND_2_4_GHZ ]) && (TI_FALSE == bBandCountryFound[ RADIO_BAND_2_4_GHZ ])) ||
768a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             ((TI_TRUE == bBandChannelExist[ RADIO_BAND_5_0_GHZ ]) && (TI_FALSE == bBandCountryFound[ RADIO_BAND_5_0_GHZ ]))))
769a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
770a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.tDesiredSsid[ 1 ].eVisability = SCAN_SSID_VISABILITY_PUBLIC;
771a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.tDesiredSsid[ 1 ].tSsid.len = 0;
772a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.uSsidNum = 2;
773a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.uSsidListFilterEnabled = 1;
774a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /*
775a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             * since we are also looking for an AP with country IE (not include in IBSS), we need to make sure
776a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             * the desired BSS type include infrastructure BSSes.
777a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             */
778a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            if (BSS_INDEPENDENT == pSme->eBssType)
779a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            {
780a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                /* the desired is only IBSS - scan for any */
781a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                pSme->tScanParams.eBssType = BSS_ANY;
782a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            }
783a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            else
784a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            {
785a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                /* the desired is either infrastructure or any - use it */
786a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                pSme->tScanParams.eBssType = pSme->eBssType;
787a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            }
788a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
789a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        else
790a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
791a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.uSsidNum = 1;
792a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.uSsidListFilterEnabled = 1;
793a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* only looking for the desired SSID - set the desired BSS type */
794a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.eBssType = pSme->eBssType;
795a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
796a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
797a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* no scanned band has a counrty code - meaning all scan is passive (to find country) */
798a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else
799a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
800a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "sme_StartScan: performing passive scan to find country IE\n");
801a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.eBssType = BSS_INFRASTRUCTURE; /* only an AP would transmit a country IE */
802a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.uSsidNum = 0;
803a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.uSsidListFilterEnabled = 1;
804a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
805a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
806a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* update scan cycle number and scan intervals according to 802.11d status and country availability  */
807a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    sme_updateScanCycles (hSme, bDEnabled, bCountryValid, pSme->bConstantScan);
808a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
809a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* Finally(!!!), start the scan */
810a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    tStatus = scanCncn_StartPeriodicScan (pSme->hScanCncn, SCAN_SCC_DRIVER, &(pSme->tScanParams));
811a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (SCAN_CRS_SCAN_RUNNING != tStatus)
812a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
813a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "sme_StartScan: scan concentrator returned status %d\n", tStatus);
814a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        return TI_NOK;
815a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
816a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
817a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    return TI_OK;
818a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
819a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
820a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
821a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     sme_updateScanCycles
822a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Updates the scan intervals and cycle number according to 802.11d status, country availability and WSC PB mode
823a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
824a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Updates the scan intervals and cycle number according to 802.11d status, country availability and WSC PB mode.
825a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Possible scenarios - D disabled - WSC PB off - scan forever with supplied intervals
826a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *                    - D enabled - country unknown - WSC PB off - scan forever with supplied intervals
827a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *                    - D disabled - WSC PB on - scan for two minutes with zero intervals
828a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *                    - D enabled - country unknown - WSC PB on - scan for two minutes with zero intervals
829a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *                    - D enabled - country known - WSC PB off - scan until country expiry with supplied intervals
830a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *                    - D enabled - country known - WSC PB on - scan for the minimu of two minutes and country expiry with zero intervals
831a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
832a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
833a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  bDEnabled - TRUE if 802.11d is enabled
834a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  bCountryValid - TRUE if a country IE is valid for a band on which we scan
835a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  bConstantScan - TRUE if WSC PB mode is on
836a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
837a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     sme_CalculateCyclesNumber, sme_StartScan
838a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
839a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid sme_updateScanCycles (TI_HANDLE hSme,
840a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                           TI_BOOL bDEnabled,
841a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                           TI_BOOL bCountryValid,
842a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                           TI_BOOL bConstantScan)
843a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
844a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme            *pSme = (TSme*)hSme;
845a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_UINT32       uIndex, uScanPeriodMs, uScanDurationMs;
846a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    paramInfo_t     *pParam;
847a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
848a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* 802.11d is disabled, or no country is valid */
849a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ((TI_FALSE == bDEnabled) || (TI_FALSE == bCountryValid))
850a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
851a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* WSC PB mode is disabled */
852a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        if (TI_FALSE == bConstantScan)
853a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
854a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /*
855a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             * copy intervals
856a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             * In order to avoid tight loop of scan-select or scan-select-connecting operation,
857a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             * the prepare scan function takes into account the value of the scan_count when setting the 16 periods in the scan command
858a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             */
859a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            os_memoryCopy (pSme->hOS, &(pSme->tScanParams.uCycleIntervalMsec[ 0 ]),
860a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                           &(pSme->tInitParams.uScanIntervals[ pSme->uScanCount ]), sizeof (TI_UINT32) * (PERIODIC_SCAN_MAX_INTERVAL_NUM - pSme->uScanCount));
861a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
862a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            for(uIndex = (PERIODIC_SCAN_MAX_INTERVAL_NUM - pSme->uScanCount); uIndex < PERIODIC_SCAN_MAX_INTERVAL_NUM; uIndex++)
863a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            {
864a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                pSme->tScanParams.uCycleIntervalMsec[ uIndex ] = pSme->tInitParams.uScanIntervals[ PERIODIC_SCAN_MAX_INTERVAL_NUM - 1 ];
865a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            }
866a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
867a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* scan for default number (until a result is found) */
868a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.uCycleNum = pSme->tInitParams.uCycleNum;
869a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
870a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* WSC PB mode is enabled */
871a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        else
872a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
873a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
874a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* nullify all intervals */
875a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            os_memoryZero (pSme->hOS, &(pSme->tScanParams.uCycleIntervalMsec[ 0 ]),
876a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                           sizeof (TI_UINT32) * PERIODIC_SCAN_MAX_INTERVAL_NUM);
877a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
878a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* calculate the duration of one scan cycle */
879a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            uScanDurationMs = 0;
880a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            for (uIndex = 0; uIndex < pSme->tScanParams.uChannelNum; uIndex++)
881a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            {
882a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                uScanDurationMs += pSme->tScanParams.tChannels[ uIndex ].uMaxDwellTimeMs;
883a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            }
884a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
885a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* set the number of cycles - 2 minutes divided by one cycle duration */
886a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->tScanParams.uCycleNum = (120000 / uScanDurationMs) + 1;
887a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
888a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
889a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* 802.11d is enabled, and country is valid on at least one band */
890a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else
891a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
892a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pParam = (paramInfo_t *)os_memoryAlloc(pSme->hOS, sizeof(paramInfo_t));
893a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        if (!pParam)
894a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
895a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            return;
896a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
897a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
898a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* get country expiry time */
899a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pParam->paramType = REGULATORY_DOMAIN_TIME_TO_COUNTRY_EXPIRY;
900a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        regulatoryDomain_getParam (pSme->hRegDomain, pParam);
901a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
902a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* WSC PB mode is disabled */
903a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        if (TI_FALSE == bConstantScan)
904a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
905a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /*
906a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             * copy intervals
907a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             * In order to avoid tight loop of scan-select or scan-select-connecting operation,
908a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             * the prepare scan function takes into account the value of the scan_count when setting the 16 periods in the scan command
909a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt             */
910a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            os_memoryCopy (pSme->hOS, &(pSme->tScanParams.uCycleIntervalMsec[ 0 ]),
911a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                           &(pSme->tInitParams.uScanIntervals[ pSme->uScanCount ]), sizeof (TI_UINT32) * (PERIODIC_SCAN_MAX_INTERVAL_NUM - pSme->uScanCount));
912a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
913a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            for(uIndex = (PERIODIC_SCAN_MAX_INTERVAL_NUM - pSme->uScanCount); uIndex < PERIODIC_SCAN_MAX_INTERVAL_NUM; uIndex++)
914a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            {
915a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                pSme->tScanParams.uCycleIntervalMsec[ uIndex ] = pSme->tInitParams.uScanIntervals[ PERIODIC_SCAN_MAX_INTERVAL_NUM - 1 ];
916a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            }
917a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
918a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* set cycle number according to country expiry time */
919a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            sme_CalculateCyclesNumber (hSme, pParam->content.uTimeToCountryExpiryMs);
920a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
921a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* WSC PB mode is enabled */
922a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        else
923a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
924a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* turn off WSC PB mode (for next scan) */
925a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pSme->bConstantScan = TI_FALSE;
926a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
927a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* set scan period to minimum of WSC PB duration (2 minutes) and country expiry time */
928a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            uScanPeriodMs = TI_MIN (120000, pParam->content.uTimeToCountryExpiryMs);
929a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
930a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* nullify all intervals */
931a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            os_memoryZero (pSme->hOS, &(pSme->tScanParams.uCycleIntervalMsec[ 0 ]),
932a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                           sizeof (TI_UINT32) * PERIODIC_SCAN_MAX_INTERVAL_NUM);
933a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
934a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* calculate the duration of one scan cycle */
935a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            uScanDurationMs = 0;
936a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            for (uIndex = 0; uIndex < pSme->tScanParams.uChannelNum; uIndex++)
937a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            {
938a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                uScanDurationMs += pSme->tScanParams.tChannels[ uIndex ].uMaxDwellTimeMs;
939a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            }
940a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
941a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            if (uScanDurationMs != 0)
942a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            {
943a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                /* set the number of cycles - scan period divided by one cycle duration */
944a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                pSme->tScanParams.uCycleNum = (uScanPeriodMs / uScanDurationMs) + 1;
945a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            }
946a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            else
947a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            {
948a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                pSme->tScanParams.uCycleNum = pSme->tInitParams.uCycleNum;
949a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            }
950a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
951a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        os_memoryFree(pSme->hOS, pParam, sizeof(paramInfo_t));
952a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
953a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
954a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* in case independent mode and to avoid supplicant send disconnect event after 60s */
955a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (pSme->eBssType != BSS_INFRASTRUCTURE)
956a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
957a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.uCycleNum = 1;
958a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
959a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
960a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
961a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
962a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn     sme_CalculateCyclesNumber
963a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief  Calculates the cycle number required for a gicen time, according to scan intervals
964a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
965a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Calculates the cycle number required for a gicen time, according to scan intervals. First check the 16
966a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * different intervals, and if more time is available, find how many cycles still fit. Write the result
967a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * to the SME scan command
968a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
969a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  hSme - handle to the SME object
970a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param  uToTalTimeMs - the total periodic scan operation duartion
971a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None
972a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa     sme_updateScanCycles, sme_StartScan
973a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
974a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid sme_CalculateCyclesNumber (TI_HANDLE hSme, TI_UINT32 uTotalTimeMs)
975a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
976a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TSme            *pSme = (TSme*)hSme;
977a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_UINT32       uIndex, uCurrentTimeMs = 0;
978a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
979a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /*
980a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt     * the total time should exceed country code expiration by one interval (so that next scan wouldn't
981a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt     * have a valid country code)
982a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt     */
983a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
984a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* nullify cycle number */
985a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pSme->tScanParams.uCycleNum = 0;
986a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* now find how many cycles fit within this time. First, check if all first 16 configured intervals fit */
987a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    for (uIndex = 0;
988a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt         (uIndex < PERIODIC_SCAN_MAX_INTERVAL_NUM) && (uCurrentTimeMs < uTotalTimeMs);
989a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt         uIndex++)
990a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
991a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.uCycleNum++;
992a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        uCurrentTimeMs += pSme->tScanParams.uCycleIntervalMsec[ uIndex ];
993a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
994a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* now find out how many more cycles with the last interval still fits */
995a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (uCurrentTimeMs < uTotalTimeMs)
996a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
997a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /*
998a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt         * divide the reamining time (time until expiry minus the total time calculated so far)
999a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt         * by the last interval time, to get how many more scans would fit after the first 16 intervals
1000a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt         */
1001a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.uCycleNum += (uTotalTimeMs - uCurrentTimeMs) /
1002a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                            pSme->tScanParams.uCycleIntervalMsec[ PERIODIC_SCAN_MAX_INTERVAL_NUM - 1];
1003a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* and add one, to compensate for the reminder */
1004a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pSme->tScanParams.uCycleNum++;
1005a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
1006a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
1007a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
1008