1a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/*
2a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * ScanSrv.c
3a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
4a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Copyright(c) 1998 - 2009 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 ScanSrv.c
35a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *  \brief This file include the scan SRV module implementation
36a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
37a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *  \see   ScanSrv.h, ScanSrvSm.h, ScanSrvSm.c
38a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
39a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
40a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
41a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#define __FILE_ID__  FILE_ID_115
42a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "report.h"
43a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "timer.h"
44a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "ScanSrv.h"
45a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "ScanSrvSM.h"
46a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "MacServices.h"
47a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "MacServices_api.h"
48a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "eventMbox_api.h"
49a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "CmdBld.h"
50a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
51a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
52a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
53a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 16-Oct-2004\n
54a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Creates the scan SRV object
55a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
56a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
57a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hOS - handle to the OS object.\n
58a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return a handle to the scan SRV object, NULL if an error occurred.\n
59a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
60a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_HANDLE MacServices_scanSRV_create( TI_HANDLE hOS )
61a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
62a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* allocate the scan SRV object */
63a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t *pScanSRV = os_memoryAlloc( hOS, sizeof(scanSRV_t));
64a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ( NULL == pScanSRV )
65a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
66a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        WLAN_OS_REPORT( ("ERROR: Failed to create scan SRV module"));
67a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        return NULL;
68a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
69a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
70a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    os_memoryZero( pScanSRV->hOS, pScanSRV, sizeof(scanSRV_t));
71a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
72a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* allocate the state machine */
73a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ( TI_OK != fsm_Create( hOS, &(pScanSRV->SM), SCAN_SRV_NUM_OF_STATES, SCAN_SRV_NUM_OF_EVENTS ))
74a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
75a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        WLAN_OS_REPORT( ("ERROR: Failed to allocate scan SRV state machine"));
76a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        os_memoryFree( hOS, pScanSRV, sizeof(scanSRV_t));
77a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        return NULL;
78a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
79a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
80a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* store the OS handle */
81a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->hOS = hOS;
82a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
83a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    return pScanSRV;
84a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
85a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
86a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
87a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
88a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 29-Dec-2004\n
89a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Finalizes the scan SRV module (releasing memory and timer)
90a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
91a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
92a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hScanSRV - handle to the scan SRV object.\n
93a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
94a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid MacServices_scanSRV_destroy( TI_HANDLE hScanSRV )
95a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
96a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t *pScanSRV = (scanSRV_t*)hScanSRV;
97a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
98a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* free timer */
99a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	if (pScanSRV->hScanSrvTimer)
100a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	{
101a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		tmr_DestroyTimer (pScanSRV->hScanSrvTimer);
102a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	}
103a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
104a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* free memory */
105a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    fsm_Unload( pScanSRV->hOS, pScanSRV->SM );
106a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    os_memoryFree( pScanSRV->hOS, (TI_HANDLE)pScanSRV , sizeof(scanSRV_t));
107a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
108a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
109a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
110a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
111a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 29-Dec-2004\n
112a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Initializes the scan SRV module, registers SCAN_COMPLETE to HAL.
113a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
114a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
115a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hScanSRV - handle to the scan SRV object.\n
116a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param Handles of other modules.\n
117a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt  */
118a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS MacServices_scanSRV_init (TI_HANDLE hMacServices,
119a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                    TI_HANDLE hReport,
120a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                    TI_HANDLE hTWD,
121a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                    TI_HANDLE hTimer,
122a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                    TI_HANDLE hEventMbox,
123a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                    TI_HANDLE hCmdBld)
124a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
125a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    MacServices_t* pMacServices =  (MacServices_t*)hMacServices;
126a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t *pScanSRV =  pMacServices->hScanSRV;
127a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
128a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* store handles */
129a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->hTWD = hTWD;
130a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->hTimer = hTimer;
131a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->hReport = hReport;
132a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->hEventMbox = hEventMbox;
133a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->hPowerSrv = pMacServices->hPowerSrv;
134a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->hCmdBld = hCmdBld;
135a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->commandResponseFunc = NULL;
136a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->commandResponseObj = NULL;
137a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
138a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* create the timer */
139a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->hScanSrvTimer = tmr_CreateTimer (pScanSRV->hTimer);
140a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	if (pScanSRV->hScanSrvTimer == NULL)
141a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	{
142a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE0(pScanSRV->hReport, REPORT_SEVERITY_ERROR, "MacServices_scanSRV_init(): Failed to create hScanSrvTimer!\n");
143a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		return TI_NOK;
144a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	}
145a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
146a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* init state machine */
147a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRVSM_init ((TI_HANDLE)pScanSRV);
148a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
149a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* Register our scan complete handler to the HAL events mailbox */
150a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    eventMbox_RegisterEvent (pScanSRV->hEventMbox,
151a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                              TWD_OWN_EVENT_SCAN_CMPLT,
152a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                              (void *)MacServices_scanSRV_scanCompleteCB,
153a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                              (TI_HANDLE)pScanSRV);
154a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    eventMbox_RegisterEvent (pScanSRV->hEventMbox,
155a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                              TWD_OWN_EVENT_SPS_SCAN_CMPLT,
156a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                              (void *)MacServices_scanSRV_scanCompleteCB,
157a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                              (TI_HANDLE)pScanSRV);
158a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
159a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* init other stuff */
160a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->currentNumberOfConsecutiveNoScanCompleteEvents = 0;
161a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
162a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TRACE0( hReport, REPORT_SEVERITY_INIT, ".....Scan SRV configured successfully.\n");
163a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
164a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    return TI_OK;
165a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
166a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
167a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
168a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Restart the scan SRV module upon recovery.
169a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
170a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
171a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hScanSRV - handle to the scan SRV object.\n
172a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
173a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid scanSRV_restart (TI_HANDLE hScanSRV)
174a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
175a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	scanSRV_t *pScanSRV =  (scanSRV_t *)hScanSRV;
176a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* init state machine */
177a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	/* initialize current state */
178a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	pScanSRV->SMState = SCAN_SRV_STATE_IDLE;
179a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
180a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (pScanSRV->bTimerRunning)
181a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
182a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        tmr_StopTimer (pScanSRV->hScanSrvTimer);
183a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->bTimerRunning = TI_FALSE;
184a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
185a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
186a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
187a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
188a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
189a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 26-July-2006\n
190a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Configures the scan SRV module with initialization values
191a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
192a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
193a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hScanSRV - handle to the scan SRV object.\n
194a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hReport - handle to the report object.\n
195a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hTWD - handle to the HAL ctrl object.\n
196a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt  */
197a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid MacServices_scanSrv_config( TI_HANDLE hMacServices, TScanSrvInitParams* pInitParams )
198a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
199a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    MacServices_t* pMacServices =  (MacServices_t*)hMacServices;
200a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t *pScanSRV =  pMacServices->hScanSRV;
201a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
202a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->numberOfNoScanCompleteToRecovery = pInitParams->numberOfNoScanCompleteToRecovery;
203a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
204a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* Set Triggered scan time out per channel */
205a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->uTriggeredScanTimeOut = pInitParams->uTriggeredScanTimeOut;
206a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	TWD_CmdSetSplitScanTimeOut (pScanSRV->hTWD, pScanSRV->uTriggeredScanTimeOut);
207a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
208a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
209a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
210a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
211a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 29-Dec-2004\n
212a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Registers a complete callback for scan complete notifications.
213a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
214a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
215a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hMacServices - handle to the MacServices object.\n
216a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param scanCompleteCB - the complete callback function.\n
217a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hScanCompleteObj - handle to the object passed to the scan complete callback function.\n
218a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
219a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid MacServices_scanSRV_registerScanCompleteCB( TI_HANDLE hMacServices,
220a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                     TScanSrvCompleteCb scanCompleteCB, TI_HANDLE hScanCompleteObj )
221a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
222a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t *pScanSRV = (scanSRV_t*)((MacServices_t*)hMacServices)->hScanSRV;
223a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
224a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->scanCompleteNotificationFunc = scanCompleteCB;
225a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->scanCompleteNotificationObj = hScanCompleteObj;
226a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
227a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
228a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
229a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Registers a failure event callback for scan error notifications.
230a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
231a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e member.\n
232a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hScanSRV - handle to the Scan SRV object.\n
233a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param failureEventCB - the failure event callback function.\n
234a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hFailureEventObj - handle to the object passed to the failure event callback function.\n
235a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
236a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid scanSRV_registerFailureEventCB( TI_HANDLE hScanSRV,
237a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                     void * failureEventCB, TI_HANDLE hFailureEventObj )
238a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
239a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t *pScanSRV = (scanSRV_t*)(hScanSRV);
240a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
241a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->failureEventFunc  = (TFailureEventCb)failureEventCB;
242a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->failureEventObj   = hFailureEventObj;
243a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
244a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
245a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
246a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
247a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 27-Sep-2005\n
248a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief This function is the CB which is called as response to 'StartScan' or 'StopScan' \n.
249a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *        here we check if there is a GWSI command response , and call it if necessary .\n
250a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Private.\n
251a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hScanSrv - handle to the scan SRV object.\n
252a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param MboxStatus - mailbox status. \n
253a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
254a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid MacServices_scanSRVCommandMailBoxCB(TI_HANDLE hScanSrv,TI_UINT16 MboxStatus)
255a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
256a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t* pScanSRV = (scanSRV_t*)hScanSrv;
257a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_UINT16 responseStatus;
258a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TCmdResponseCb CB_Func;
259a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_HANDLE  CB_Handle;
260a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
261a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TRACE1( pScanSRV->hReport, REPORT_SEVERITY_INFORMATION, " status %u\n",MboxStatus);
262a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
263a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* set response to TI_OK or TI_NOK */
264a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    responseStatus = ((MboxStatus > 0) ? TI_NOK : TI_OK);
265a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
266a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* if we have a Response Function (only in GWSI) we set it back to NULL and then
267a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        we call it */
268a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (pScanSRV->commandResponseFunc != NULL)
269a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
270a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        CB_Func = pScanSRV->commandResponseFunc;
271a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        CB_Handle = pScanSRV->commandResponseObj;
272a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
273a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->commandResponseFunc = NULL;
274a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->commandResponseObj = NULL;
275a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
276a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        CB_Func(CB_Handle, responseStatus);
277a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
278a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt     /* if scan request failed */
279a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ( TI_OK != responseStatus )
280a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
281a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE0( pScanSRV->hReport, REPORT_SEVERITY_ERROR, "Mail box returned error , quitting scan.\n");
282a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
283a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* send a scan complete event. This will do all necessary clean-up (timer, power manager, notifying scan complete) */
284a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        scanSRVSM_SMEvent( hScanSrv, (scan_SRVSMStates_e*)&pScanSRV->SMState, SCAN_SRV_EVENT_SCAN_COMPLETE );
285a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
286a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
287a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
288a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
289a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
290a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 29-Dec-2004\n
291a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Performs a scan
292a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
293a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
294a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hMacServices - handle to the MacServices object.\n
295a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param scanParams - the scan specific parameters.\n
296a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param eScanresultTag - tag used for result and scan complete tracking
297a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param bHighPriority - whether to perform a high priority (overlaps DTIM) scan.\n
298a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param bDriverMode - whether to try to enter driver mode (with PS on) before issuing the scan command.\n
299a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param bScanOnDriverModeError - whether to proceed with the scan if requested to enter driver mode and failed.\n
300a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param psRequest - Parameter sent to PowerSaveServer on PS request to indicate PS on or "keep current"
301a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param bSendNullData - whether to send Null data when exiting driver mode on scan complete.\n
302a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param commandResponseFunc - CB function which called after downloading the command. \n
303a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param commandResponseObj -  The CB function Obj (Notice : last 2 params are NULL in Legacy run). \n
304a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param psRequest - Parameter sent to PowerSaveServer on PS request to indicate PS on or "keep current"
305a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK if successful (various, TBD codes if not).\n
306a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
307a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS MacServices_scanSRV_scan( TI_HANDLE hMacServices, TScanParams *scanParams, EScanResultTag eScanTag,
308a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                    TI_BOOL bHighPriority, TI_BOOL bDriverMode, TI_BOOL bScanOnDriverModeError,
309a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        E80211PsMode psRequest, TI_BOOL bSendNullData,
310a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        TCmdResponseCb commandResponseFunc, TI_HANDLE commandResponseObj)
311a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
312a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt   scanSRV_t *pScanSRV = (scanSRV_t*)((MacServices_t*)hMacServices)->hScanSRV;
313a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
314a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
315a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TRACE0( pScanSRV->hReport, REPORT_SEVERITY_INFORMATION, "Scan request received.\n");
316a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
317a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* sanity check - scan can only start if the scan SRV is idle */
318a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ( SCAN_SRV_STATE_IDLE != pScanSRV->SMState )
319a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
320a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE0( pScanSRV->hReport, REPORT_SEVERITY_WARNING, "Scan request while scan is running!\n");
321a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        return TI_NOK;
322a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
323a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
324a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* Response function for GWSI only. In Legacy run we get NULL and never use it. */
325a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->commandResponseFunc = commandResponseFunc;
326a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->commandResponseObj  = commandResponseObj;
327a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
328a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->bInRequest = TI_TRUE;
329a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->returnStatus = TI_OK;
330a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
331a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* copy scan paramaters */
332a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->scanParams = scanParams;
333a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->eScanTag = eScanTag;
334a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->uResultCount = 0;
335a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->bHighPriority = bHighPriority;
336a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->bScanOnDriverModeFailure = bScanOnDriverModeError;
337a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->bSendNullData = bSendNullData;
338a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->psRequest = psRequest;
339a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
340a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ( SCAN_TYPE_SPS == scanParams->scanType )
341a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
342a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->bSPSScan = TI_TRUE;
343a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
344a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
345a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else
346a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
347a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->bSPSScan = TI_FALSE;
348a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
349a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
350a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
351a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* check whether the scan will overlap DTIM frame */
352a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ( (TI_FALSE == bHighPriority) && (TI_TRUE == bDriverMode))
353a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
354a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->bDtimOverlapping = TI_FALSE;
355a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
356a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else
357a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
358a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->bDtimOverlapping = TI_TRUE;
359a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
360a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
361a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* mark the no scan complete flag. The purpose of this flag is to be able to identify
362a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       whether the scan complete is a normal process, or was it generated because a no scan ocmplete
363a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       was identified, a stop scan command was snet to the FW, and thus a scan complete was received.
364a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       In the former case we nullify the consecutive no scan complete counter, whereas in the latter
365a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       we do not. */
366a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->bNoScanCompleteFlag = TI_FALSE;
367a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
368a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* if required to enter driver mode */
369a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ( TI_TRUE == bDriverMode )
370a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
371a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->bExitFromDriverMode = TI_TRUE;
372a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* send a PS_REQUEST event */
373a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        scanSRVSM_SMEvent( (TI_HANDLE)pScanSRV, (scan_SRVSMStates_e*)&(pScanSRV->SMState), SCAN_SRV_EVENT_REQUEST_PS );
374a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
375a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* no driver mode required */
376a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else
377a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
378a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->bExitFromDriverMode = TI_FALSE;
379a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* send a PS_SUCCESS event - will start the scan */
380a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        scanSRVSM_SMEvent( (TI_HANDLE)pScanSRV, (scan_SRVSMStates_e*)&pScanSRV->SMState, SCAN_SRV_EVENT_PS_SUCCESS );
381a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
382a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
383a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->bInRequest = TI_FALSE;
384a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
385a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    return pScanSRV->returnStatus;
386a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
387a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
388a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
389a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
390a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 29-Dec-2004\n
391a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Sends a Stop Scan command to FW, no matter if we are in scan progress or not
392a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
393a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
394a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hMacServices - handle to the MacServices object.\n
395a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param eScanTag - scan tag, used for scan complete and result tracking
396a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param bSendNullData - indicates whether to send Null data when exiting driver mode.\n
397a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param commandResponseFunc - CB function which called after downloading the command. \n
398a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param commandResponseObj -  The CB function Obj (Notice : last 2 params are NULL in Legacy run). \n
399a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK if successful (various, TBD codes if not).\n
400a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
401a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS MacServices_scanSRV_stopScan( TI_HANDLE hMacServices, EScanResultTag eScanTag, TI_BOOL bSendNullData,
402a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                        TCmdResponseCb ScanCommandResponseCB, TI_HANDLE CB_handle )
403a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
404a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t *pScanSRV = (scanSRV_t*)((MacServices_t*)hMacServices)->hScanSRV;
405a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_INT32 stopScanStatus;
406a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
407a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TRACE0( pScanSRV->hReport, REPORT_SEVERITY_INFORMATION, "Stop scan request received.\n");
408a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
409a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* update the driver mode exit flag */
410a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->bSendNullData = bSendNullData;
411a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
412a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ( TI_TRUE == pScanSRV->bSPSScan )
413a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
414a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        stopScanStatus = cmdBld_CmdStopSPSScan (pScanSRV->hCmdBld, eScanTag, (void *)ScanCommandResponseCB, CB_handle);
415a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
416a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else
417a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
418a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        stopScanStatus = cmdBld_CmdStopScan (pScanSRV->hCmdBld, eScanTag, (void *)ScanCommandResponseCB, CB_handle);
419a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
420a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
421a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (TI_OK != stopScanStatus)
422a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
423a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        return TI_NOK;
424a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
425a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
426a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* send a stop scan event */
427a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRVSM_SMEvent( (TI_HANDLE)pScanSRV, (scan_SRVSMStates_e*)&pScanSRV->SMState, SCAN_SRV_EVENT_STOP_SCAN );
428a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
429a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    return pScanSRV->returnStatus;
430a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
431a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
432a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
433a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
434a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 17-Jan-2005\n
435a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Notifies the scan SRV of a FW reset (that had originally been reported by a different module).\n
436a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
437a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
438a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hMacServices - handle to the MacServices object.\n
439a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK if successful (various, TBD codes if not).\n
440a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
441a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS MacServices_scanSRV_stopOnFWReset( TI_HANDLE hMacServices )
442a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
443a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt   scanSRV_t *pScanSRV = (scanSRV_t*)((MacServices_t*)hMacServices)->hScanSRV;
444a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
445a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TRACE0( pScanSRV->hReport, REPORT_SEVERITY_INFORMATION, "FW reset notification received.\n");
446a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
447a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* mark the return status */
448a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->returnStatus = TI_NOK;
449a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
450a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* send a FW reset event */
451a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    return scanSRVSM_SMEvent( (TI_HANDLE)pScanSRV, (scan_SRVSMStates_e*)&pScanSRV->SMState, SCAN_SRV_EVENT_FW_RESET );
452a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
453a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
454a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
455a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
456a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 29-Dec-2004\n
457a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief callback function used by the power server to notify driver mode result
458a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *          this CB is used in requesting PS and exiting PS.
459a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
460a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hScanSRV - handle to the scan SRV object.\n
461a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param psStatus - the power save request status.\n
462a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
463a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid MacServices_scanSRV_powerSaveCB( TI_HANDLE hScanSRV, TI_UINT8 PSMode,TI_UINT8 psStatus )
464a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
465a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t *pScanSRV = (scanSRV_t*)hScanSRV;
466a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
467a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TRACE1( pScanSRV->hReport, REPORT_SEVERITY_INFORMATION, "PS Call Back status %d .\n",psStatus);
468a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
469a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* if driver mode enter/exit succeedded */
470a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ( (ENTER_POWER_SAVE_SUCCESS == psStatus) || (EXIT_POWER_SAVE_SUCCESS == psStatus))
471a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
472a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE0( pScanSRV->hReport, REPORT_SEVERITY_INFORMATION, "PS successful.\n");
473a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
474a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* send a PS_SUCCESS event */
475a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        scanSRVSM_SMEvent( (TI_HANDLE)pScanSRV, (scan_SRVSMStates_e*)&pScanSRV->SMState, SCAN_SRV_EVENT_PS_SUCCESS );
476a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
477a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* driver mode entry failed, and scan is requested even on PS failure but we are entering PS and not Exiting */
478a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else if ( (TI_TRUE == pScanSRV->bScanOnDriverModeFailure) && ( ENTER_POWER_SAVE_FAIL == psStatus))
479a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
480a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE0( pScanSRV->hReport, REPORT_SEVERITY_INFORMATION, "PS enter failed, continune scan .\n");
481a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
482a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* send a PS_SUCCESS event */
483a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        scanSRVSM_SMEvent( (TI_HANDLE)pScanSRV, (scan_SRVSMStates_e*)&pScanSRV->SMState, SCAN_SRV_EVENT_PS_SUCCESS );
484a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
485a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* driver mode enter or exit failed */
486a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else
487a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
488a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* if we are trying to enter PS and fail to do so - return error on scan complete */
489a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        if ( ENTER_POWER_SAVE_FAIL == psStatus)
490a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
491a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            TRACE0( pScanSRV->hReport, REPORT_SEVERITY_WARNING, "PS enter failed . quiting scan .\n");
492a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            /* Set the return status  */
493a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pScanSRV->returnStatus = TI_NOK;
494a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
495a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
496a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* send a PS FAIL event */
497a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        scanSRVSM_SMEvent( (TI_HANDLE)pScanSRV, (scan_SRVSMStates_e*)&pScanSRV->SMState, SCAN_SRV_EVENT_PS_FAIL );
498a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
499a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
500a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
501a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
502a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
503a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
504a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 29-Dec-2004\n
505a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Callback function used by the HAL ctrl to notify scan complete
506a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
507a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
508a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hScanSRV - handle to the scan SRV object.\n
509a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param str - pointer to scan result buffer (holding SPS status for SPS scan only!).\n
510a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param strLen - scan result buffer length (should ALWAYS be 2, even for non SPS scans).\n
511a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
512a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid MacServices_scanSRV_scanCompleteCB( TI_HANDLE hScanSRV, char* str, TI_UINT32 strLen )
513a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
514a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t *pScanSRV = (scanSRV_t*)hScanSRV;
515a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanCompleteResults_t   *pResult = (scanCompleteResults_t*)str;
516a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
517a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TRACE0( pScanSRV->hReport, REPORT_SEVERITY_INFORMATION, "Scan complete notification from TNET.\n");
518a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
519a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	/* nullify the consecutive no scan complete events counter  - only if this is a scan complete that
520a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt       does not happen afetr a stop scan (due to a timer expiry) */
521a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	if ( TI_FALSE == pScanSRV->bNoScanCompleteFlag )
522a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
523a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->currentNumberOfConsecutiveNoScanCompleteEvents = 0;
524a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
525a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
526a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* copy result counter and scan tag */
527a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->uResultCount = pResult->numberOfScanResults;
528a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->eScanTag = (EScanResultTag)pResult->scanTag;
529a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
530a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* copy scan SPS addmitted channels and SPS result */
531a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (TI_FALSE == pScanSRV->bSPSScan)
532a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
533a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* normal scan - no result is available */
534a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->bTSFError = TI_FALSE;
535a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE0( pScanSRV->hReport, REPORT_SEVERITY_INFORMATION, "Normal scan completed.\n");
536a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
537a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else
538a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
539a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* SPS scan - first byte indicates whether a TSF error (AP recovery) occured */
540a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        if ( 0 != (pResult->scheduledScanStatus >> 24))
541a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
542a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pScanSRV->bTSFError = TI_TRUE;
543a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
544a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        else
545a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
546a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            pScanSRV->bTSFError = TI_FALSE;
547a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
548a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
549a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* next two bytes indicates on which channels scan was attempted */
550a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->SPSScanResult = (TI_UINT16)(pResult->scheduledScanStatus >> 16) | 0xff;
551a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        pScanSRV->SPSScanResult = ENDIAN_HANDLE_WORD( pScanSRV->SPSScanResult );
552a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE1( pScanSRV->hReport, REPORT_SEVERITY_INFORMATION, "SPS scan completed. TSF error: , SPS result: %x\n", pScanSRV->SPSScanResult);
553a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
554a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
555a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* send a SCAN_COMPLETE event  */
556a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRVSM_SMEvent( (TI_HANDLE)pScanSRV, (scan_SRVSMStates_e*)&pScanSRV->SMState, SCAN_SRV_EVENT_SCAN_COMPLETE );
557a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
558a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
559a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
560a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
561a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 29-Dec-2004\n
562a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief called when a scan timer expires. Completes the scan and starts a recovery process.
563a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
564a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
565a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hScanSRV - handle to the scan SRV object.\n
566a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param bTwdInitOccured - Indicates if TWDriver recovery occured since timer started.\n
567a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
568a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid MacServices_scanSRV_scanTimerExpired (TI_HANDLE hScanSRV, TI_BOOL bTwdInitOccured)
569a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
570a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t *pScanSRV = (scanSRV_t*)hScanSRV;
571a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
572a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* mark that no scan complete occured (see sanSRV_scan for more detailed explanation) */
573a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->bNoScanCompleteFlag = TI_TRUE;
574a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
575a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* send a TIMER_EXPIRED event */
576a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRVSM_SMEvent( (TI_HANDLE)pScanSRV, (scan_SRVSMStates_e*)&pScanSRV->SMState, SCAN_SRV_EVENT_TIMER_EXPIRED );
577a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
578a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
579a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
580a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
581a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 29-Dec-2004\n
582a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Calculates the maximal time required for a scan operation
583a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
584a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
585a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hScanSRV - handle to the scan SRV object.\n
586a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param scanParams - the scan parameters
587a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param bConsiderDTIM - whether this scan overlaps DTIM
588a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return the time (in milliseconds)
589a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
590a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_UINT32 MacServices_scanSRVcalculateScanTimeout( TI_HANDLE hScanSRV, TScanParams* scanParams, TI_BOOL bConsiderDTIM )
591a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
592a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TI_UINT32 i, uDtimPeriodMs, uBeaconIntervalMs, timeout = 0;
593a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t *pScanSRV = (scanSRV_t*)hScanSRV;
594a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
595a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /********************************************************************************
596a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        timeout calculation is performed according to scan type:
597a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        1. for normal scan, multiply the channel time by the number of channels.
598a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           if this scan is not overlapping DTIM, add the DTIM period (in case
599a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           starting the scan right now will cause the very last milliseconds of the
600a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           scan to overlap the next DTIM). Add the guard time.
601a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        2. for triggered scan, multiply the channel time plus the trigger time
602a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           constant (the maximum time between two frames from the Tid
603a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           according to which the scan is triggered) by the number of channels.
604a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           DTIM period is added only as precaution - since the scan is divided to
605a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           channels, only very few of them will be delayed due to DTIM (in the worst
606a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           case), and this delay would be only the length of one channel scan.
607a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           Eventually, Add the guard time.
608a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        3. for SPS scan: Measure the time from current TSF to the TSF at which the
609a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           scan is scheduled to finish (done by the scan manager, and passed as
610a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           a parameter in the scan structure). Add guard time. DTIM overlapping is not
611a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           considered because if the scan overlaps DTIM the channels which are
612a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           scheduled during the DTIM (if any) won't be scanned.
613a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt     ********************************************************************************/
614a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
615a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    /* get DTIM time, if scanning in connected mode and need to consider DTIM */
616a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if ( bConsiderDTIM )
617a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
618a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* new dtimPeriod calculation */
619a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        uBeaconIntervalMs = MacServices_scanSRVConvertTUToMsec (pScanSRV->uBeaconInterval);
620a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        uDtimPeriodMs     = uBeaconIntervalMs * pScanSRV->uDtimPeriod;
621a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
622a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    else
623a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
624a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        uDtimPeriodMs = 0;
625a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
626a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
627a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    switch (scanParams->scanType)
628a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
629a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    case SCAN_TYPE_NORMAL_ACTIVE:
630a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    case SCAN_TYPE_NORMAL_PASSIVE:
631a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* the timeout is the scan duration on all channels */
632a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        for ( i = 0; i < scanParams->numOfChannels; i++ )
633a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
634a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            timeout += scanParams->channelEntry[ i ].normalChannelEntry.maxChannelDwellTime;
635a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
636a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        timeout = (timeout / 1000) + uDtimPeriodMs + SCAN_SRV_FW_GUARD_TIME_MS;
637a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        break;
638a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
639a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    case SCAN_TYPE_TRIGGERED_ACTIVE:
640a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    case SCAN_TYPE_TRIGGERED_PASSIVE:
641a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        /* the timeout is the scan duration on all channels, plus the maximum time that can pass
642a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt           between two different frames from the same Tid */
643a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        for ( i = 0; i < scanParams->numOfChannels; i++ )
644a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        {
645a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt            timeout += scanParams->channelEntry[ i ].normalChannelEntry.maxChannelDwellTime;
646a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        }
647a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        timeout = (timeout / 1000) + uDtimPeriodMs +
648a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                  ((pScanSRV->uTriggeredScanTimeOut / 1000 + 1) * scanParams->numOfChannels) +
649a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                  SCAN_SRV_FW_GUARD_TIME_MS;
650a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        break;
651a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
652a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    case SCAN_TYPE_SPS:
653a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        timeout = scanParams->SPSScanDuration + SCAN_SRV_FW_GUARD_TIME_MS;
654a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        break;
655a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
656a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    default:
657a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        TRACE1( pScanSRV->hReport, REPORT_SEVERITY_ERROR, "Trying to calculate timeout for undefined scan type %d\n", scanParams->scanType);
658a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        break;
659a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
660a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    TRACE1( pScanSRV->hReport, REPORT_SEVERITY_INFORMATION, "scanSRVcalculateScanTimeout, timeout = %d\n", timeout);
661a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
662a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    return timeout;
663a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
664a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
665a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
666a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
667a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date 16-Jan-2005\n
668a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Convert time units (1024 usecs) to millisecs
669a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
670a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Private.\n
671a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param tu - the time in time units
672a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return the time in milliseconds
673a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
674a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_UINT32 MacServices_scanSRVConvertTUToMsec( TI_UINT32 tu )
675a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
676a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    return (tu * 1024) / 1000;
677a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
678a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
679a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
680a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
681a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
682a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Save DTIM and Beacon periods for scan timeout calculations
683a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
684a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
685a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hMacServices    - module object
686a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param uDtimPeriod     - DTIM period in number of beacons
687a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param uBeaconInterval - Beacon perios in TUs (1024 msec)
688a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return void
689a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
690a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid MacServices_scanSrv_UpdateDtimTbtt (TI_HANDLE hMacServices,
691a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                         TI_UINT8  uDtimPeriod,
692a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                                         TI_UINT16 uBeaconInterval)
693a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
694a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    scanSRV_t *pScanSRV = (scanSRV_t*)((MacServices_t*)hMacServices)->hScanSRV;
695a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
696a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->uDtimPeriod     = uDtimPeriod;
697a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    pScanSRV->uBeaconInterval = uBeaconInterval;
698a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
699a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
700a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
701a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#ifdef TI_DBG
702a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/**
703a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \\n
704a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \date God knows when...\n
705a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Prints Scan Server SM status.\n
706a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
707a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Function Scope \e Public.\n
708a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hMacServices - handle to the Mac Services object.\n
709a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return always TI_OK.\n
710a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
711a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid MacServices_scanSrv_printDebugStatus(TI_HANDLE hMacServices)
712a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
713a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt   scanSRV_t *pScanSRV = (scanSRV_t*)((MacServices_t*)hMacServices)->hScanSRV;
714a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
715a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    WLAN_OS_REPORT(("scanSrv State="));
716a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    switch (pScanSRV->SMState)
717a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
718a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    case SCAN_SRV_STATE_IDLE:
719a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        WLAN_OS_REPORT((" IDLE\n"));
720a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        break;
721a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    case SCAN_SRV_STATE_PS_WAIT:
722a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        WLAN_OS_REPORT((" PS_WAIT\n"));
723a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        break;
724a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    case SCAN_SRV_STATE_PS_EXIT:
725a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        WLAN_OS_REPORT((" PS_EXIT\n"));
726a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        break;
727a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    case SCAN_SRV_STATE_SCANNING:
728a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        WLAN_OS_REPORT((" SCANNING\n"));
729a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        break;
730a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    case SCAN_SRV_STATE_STOPPING:
731a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        WLAN_OS_REPORT((" STOPPING\n"));
732a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        break;
733a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    default:
734a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        WLAN_OS_REPORT((" Invalid State=%d\n",pScanSRV->SMState));
735a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        break;
736a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
737a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
738a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
739a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    if (NULL != pScanSRV->scanParams)
740a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    {
741a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        WLAN_OS_REPORT(("scanSrv bExitFromDriverMode=%d, bHighPriority=%d, bInRequest=%d,\n \
742a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        bScanOnDriverModeFailure=%d, bSendNullData=%d, bSPSScan=%d, bTimerRunning=%d, \n \
743a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        psRequest=%d, scanType=%d\n",
744a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        pScanSRV->bExitFromDriverMode,
745a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        pScanSRV->bHighPriority,
746a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        pScanSRV->bInRequest,
747a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        pScanSRV->bScanOnDriverModeFailure,
748a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        pScanSRV->bSendNullData,
749a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        pScanSRV->bSPSScan,
750a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        pScanSRV->bTimerRunning,
751a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        pScanSRV->psRequest,
752a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt                        pScanSRV->scanParams->scanType));
753a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    }
754a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
755a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#endif
756a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
757