1/*
2 * PowerMgr.c
3 *
4 * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 *  * Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 *  * Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in
15 *    the documentation and/or other materials provided with the
16 *    distribution.
17 *  * Neither the name Texas Instruments nor the names of its
18 *    contributors may be used to endorse or promote products derived
19 *    from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file PowerMgr.c
35 *  \brief This is the PowerMgr module implementation.
36 *  \
37 *  \date 24-Oct-2005
38 */
39
40/****************************************************************************
41 *                                                                          *
42 *   MODULE:  PowerMgr                                                      *
43 *   PURPOSE: PowerMgr Module implementation.                               *
44 *                                                                          *
45 ****************************************************************************/
46
47#define __FILE_ID__  FILE_ID_71
48#include "tidef.h"
49#include "osApi.h"
50#include "timer.h"
51#include "paramOut.h"
52#include "report.h"
53#include "PowerMgr.h"
54#include "PowerMgr_API.h"
55#include "TrafficMonitorAPI.h"
56#include "qosMngr_API.h"
57#include "siteMgrApi.h"
58#include "TWDriver.h"
59#include "SoftGeminiApi.h"
60#include "DrvMainModules.h"
61#include "PowerMgrKeepAlive.h"
62#include "CmdBld.h"
63
64
65/*****************************************************************************
66 **         Defines                                                         **
67 *****************************************************************************/
68#define DEFAULT_LISTEN_INTERVAL (1)
69#define BET_DISABLE 0
70#define BET_ENABLE  1
71
72
73/*****************************************************************************
74 **         Private Function prototypes                                      **
75 *****************************************************************************/
76
77static void         powerSaveCompleteCB(TI_HANDLE hPowerMgr,TI_UINT8 PSMode,TI_UINT8 transStatus);
78static void         PowerMgrTMThresholdCrossCB( TI_HANDLE hPowerMgr, TI_UINT32 cookie );
79static void         powerMgrDisableThresholdsIndications(TI_HANDLE hPowerMgr);
80static void         powerMgrEnableThresholdsIndications(TI_HANDLE hPowerMgr);
81static void         powerMgrStartAutoPowerMode(TI_HANDLE hPowerMgr);
82static void         powerMgrRetryPsTimeout(TI_HANDLE hPowerMgr, TI_BOOL bTwdInitOccured);
83static void         powerMgrPowerProfileConfiguration(TI_HANDLE hPowerMgr, PowerMgr_PowerMode_e desiredPowerMode);
84static void         PowerMgr_setDozeModeInAuto(TI_HANDLE hPowerMgr,PowerMgr_PowerMode_e dozeMode);
85static void         PowerMgrConfigBetToFw( TI_HANDLE hPowerMgr, TI_UINT32 cookie );
86static void         PowerMgr_PsPollFailureCB( TI_HANDLE hPowerMgr );
87static void 		powerMgr_PsPollFailureTimeout( TI_HANDLE hPowerMgr, TI_BOOL bTwdInitOccured );
88static void 		powerMgr_SGSetUserDesiredwakeUpCond( TI_HANDLE hPowerMgr );
89static TI_STATUS    powerMgrSendMBXWakeUpConditions(TI_HANDLE hPowerMgr,TI_UINT8 listenInterval, ETnetWakeOn tnetWakeupOn);
90static TI_STATUS    powerMgrNullPacketRateConfiguration(TI_HANDLE hPowerMgr);
91static PowerMgr_PowerMode_e powerMgrGetHighestPriority(TI_HANDLE hPowerMgr);
92
93
94/*****************************************************************************
95 **         Public Function prototypes                                      **
96 *****************************************************************************/
97
98
99/****************************************************************************************
100 *                        PowerMgr_create                                                           *
101 ****************************************************************************************
102DESCRIPTION: Creates the object of the power Manager.
103                performs the following:
104                -   Allocate the Power Manager handle
105                -   Creates the retry timer
106
107INPUT:          - hOs - Handle to OS
108OUTPUT:
109RETURN:     Handle to the Power Manager module on success, NULL otherwise
110****************************************************************************************/
111TI_HANDLE PowerMgr_create(TI_HANDLE hOs)
112{
113
114    PowerMgr_t * pPowerMgr = NULL;
115    pPowerMgr = (PowerMgr_t*) os_memoryAlloc (hOs, sizeof(PowerMgr_t));
116    if ( pPowerMgr == NULL )
117    {
118        WLAN_OS_REPORT(("PowerMgr_create - Memory Allocation Error!\n"));
119        return NULL;
120    }
121
122    os_memoryZero (hOs, pPowerMgr, sizeof(PowerMgr_t));
123
124    pPowerMgr->hOS = hOs;
125
126    /* create the power manager keep-alive sub module */
127    pPowerMgr->hPowerMgrKeepAlive = powerMgrKL_create (hOs);
128
129    return pPowerMgr;
130
131}
132
133
134/****************************************************************************************
135*                        powerSrv_destroy                                                          *
136****************************************************************************************
137DESCRIPTION: Destroy the object of the power Manager.
138               -   delete Power Manager alocation
139               -   call the destroy function of the timer
140
141INPUT:          - hPowerMgr - Handle to the Power Manager
142OUTPUT:
143RETURN:    TI_STATUS - TI_OK on success else TI_NOK.
144****************************************************************************************/
145TI_STATUS PowerMgr_destroy(TI_HANDLE hPowerMgr)
146{
147    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
148
149    /* destroy the power manager keep-alive sub module */
150    powerMgrKL_destroy (pPowerMgr->hPowerMgrKeepAlive);
151
152    if (pPowerMgr->hRetryPsTimer)
153    {
154        tmr_DestroyTimer (pPowerMgr->hRetryPsTimer);
155    }
156
157    if ( pPowerMgr->hPsPollFailureTimer != NULL )
158    {
159        tmr_DestroyTimer(pPowerMgr->hPsPollFailureTimer);
160    }
161    os_memoryFree(pPowerMgr->hOS, pPowerMgr, sizeof(PowerMgr_t));
162
163    return TI_OK;
164}
165
166
167/****************************************************************************************
168*                        PowerMgr_init                                                         *
169****************************************************************************************
170DESCRIPTION: Power Manager init function, called in init phase.
171
172INPUT:     pStadHandles  - The driver modules handles
173
174OUTPUT:
175
176RETURN:    void
177****************************************************************************************/
178void PowerMgr_init (TStadHandlesList *pStadHandles)
179{
180    PowerMgr_t *pPowerMgr = (PowerMgr_t*)(pStadHandles->hPowerMgr);
181
182    pPowerMgr->hReport          = pStadHandles->hReport;
183    pPowerMgr->hTrafficMonitor  = pStadHandles->hTrafficMon;
184    pPowerMgr->hSiteMgr         = pStadHandles->hSiteMgr;
185    pPowerMgr->hTWD             = pStadHandles->hTWD;
186    pPowerMgr->hSoftGemini      = pStadHandles->hSoftGemini;
187    pPowerMgr->hTimer           = pStadHandles->hTimer;
188    pPowerMgr->psEnable         = TI_FALSE;
189
190    /* initialize the power manager keep-alive sub module */
191    powerMgrKL_init (pPowerMgr->hPowerMgrKeepAlive, pStadHandles);
192
193}
194
195
196TI_STATUS PowerMgr_SetDefaults (TI_HANDLE hPowerMgr, PowerMgrInitParams_t* pPowerMgrInitParams)
197{
198    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
199    TI_UINT8 index;
200    /* used to initialize the Traffic Monitor for Auto Ps events */
201    TrafficAlertRegParm_t tmRegParam;
202    TI_STATUS status;
203
204	pPowerMgr->reAuthActivePriority		= pPowerMgrInitParams->reAuthActivePriority;
205
206    /* init power management options */
207    pPowerMgr->beaconListenInterval = pPowerMgrInitParams->beaconListenInterval;
208    pPowerMgr->dtimListenInterval = pPowerMgrInitParams->dtimListenInterval;
209    pPowerMgr->defaultPowerLevel =  pPowerMgrInitParams->defaultPowerLevel;
210    pPowerMgr->PowerSavePowerLevel =  pPowerMgrInitParams->PowerSavePowerLevel;
211    pPowerMgr->powerMngPriority  = POWER_MANAGER_USER_PRIORITY;
212    pPowerMgr->maxFullBeaconInterval = pPowerMgrInitParams->MaximalFullBeaconReceptionInterval;
213    pPowerMgr->PsPollDeliveryFailureRecoveryPeriod = pPowerMgrInitParams->PsPollDeliveryFailureRecoveryPeriod;
214
215    /*
216     set AUTO PS parameters
217     */
218    pPowerMgr->autoModeInterval = pPowerMgrInitParams->autoModeInterval;
219    pPowerMgr->autoModeActiveTH = pPowerMgrInitParams->autoModeActiveTH;
220    pPowerMgr->autoModeDozeTH = pPowerMgrInitParams->autoModeDozeTH;
221    pPowerMgr->autoModeDozeMode = pPowerMgrInitParams->autoModeDozeMode;
222
223    /*
224     register threshold in the traffic monitor.
225     */
226  	pPowerMgr->betEnable = pPowerMgrInitParams->BetEnable; /* save BET enable flag for CLI configuration */
227	pPowerMgr->betTrafficEnable = TI_FALSE;                   /* starting without BET */
228
229    /* BET thresholds */
230    /* general parameters */
231    tmRegParam.Context = pPowerMgr;
232    tmRegParam.TimeIntervalMs = BET_INTERVAL_VALUE;
233    tmRegParam.Trigger = TRAFF_EDGE;
234    tmRegParam.MonitorType = TX_RX_ALL_802_11_DATA_FRAMES;
235    tmRegParam.CallBack = PowerMgrConfigBetToFw;
236
237    /* BET enable event */
238    tmRegParam.Direction = TRAFF_DOWN;
239    tmRegParam.Threshold = pPowerMgrInitParams->BetEnableThreshold;
240    pPowerMgr->BetEnableThreshold = pPowerMgrInitParams->BetEnableThreshold;
241    tmRegParam.Cookie = (TI_UINT32)BET_ENABLE;
242    pPowerMgr->betEnableTMEvent = TrafficMonitor_RegEvent (pPowerMgr->hTrafficMonitor,
243                                                             &tmRegParam,
244                                                             TI_FALSE);
245    /* BET disable event */
246    tmRegParam.Direction = TRAFF_UP;
247    tmRegParam.Threshold = pPowerMgrInitParams->BetDisableThreshold;
248    pPowerMgr->BetDisableThreshold = pPowerMgrInitParams->BetDisableThreshold;
249    tmRegParam.Cookie = (TI_UINT32)BET_DISABLE;
250    pPowerMgr->betDisableTMEvent = TrafficMonitor_RegEvent (pPowerMgr->hTrafficMonitor,
251                                                             &tmRegParam,
252                                                             TI_FALSE);
253
254    if ( (pPowerMgr->betDisableTMEvent == NULL) ||
255         (pPowerMgr->betEnableTMEvent == NULL))
256    {
257        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - TM - ERROR registering BET events - ABROTING init!\n");
258        return TI_NOK;
259    }
260    /*
261    set the events as resets for one another
262    */
263    status = TrafficMonitor_SetRstCondition (pPowerMgr->hTrafficMonitor,
264                                            pPowerMgr->betDisableTMEvent,
265                                            pPowerMgr->betEnableTMEvent,
266                                            TI_TRUE);
267    if ( status != TI_OK )
268    {
269        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - PowerMgr_init - ERROR binding BET events - ABROTING init!\n");
270        return TI_NOK;
271    }
272
273    /* general parameters */
274    tmRegParam.Context = pPowerMgr;
275
276    tmRegParam.Cookie = (TI_UINT32)POWER_MODE_ACTIVE;
277    tmRegParam.TimeIntervalMs = pPowerMgr->autoModeInterval;
278    tmRegParam.Trigger = TRAFF_EDGE;
279    tmRegParam.MonitorType = TX_RX_ALL_802_11_DATA_FRAMES;
280
281    /* Active threshold */
282    tmRegParam.CallBack = PowerMgrTMThresholdCrossCB;
283    tmRegParam.Direction = TRAFF_UP;
284    tmRegParam.Threshold = pPowerMgr->autoModeActiveTH;
285    pPowerMgr->passToActiveTMEvent = TrafficMonitor_RegEvent (pPowerMgr->hTrafficMonitor,
286                                                             &tmRegParam,
287                                                             TI_FALSE);
288    /* Doze threshold */
289    tmRegParam.Direction = TRAFF_DOWN;
290    tmRegParam.Threshold = pPowerMgr->autoModeDozeTH;
291    tmRegParam.Cookie = (TI_UINT32)POWER_MODE_SHORT_DOZE; /* diffrentiation between long / short doze is done at the
292                                                          CB, according to configuration at time of CB invokation */
293    pPowerMgr->passToDozeTMEvent = TrafficMonitor_RegEvent (pPowerMgr->hTrafficMonitor,
294                                                           &tmRegParam,
295                                                           TI_FALSE);
296
297    if ( (pPowerMgr->passToActiveTMEvent == NULL) ||
298         (pPowerMgr->passToDozeTMEvent == NULL))
299    {
300        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - PowerMgr_init - ERROR registering Auto mode events - ABROTING init!\n");
301        return TI_NOK;
302    }
303
304    /*
305    set the events as resets for one another
306    */
307    status = TrafficMonitor_SetRstCondition (pPowerMgr->hTrafficMonitor,
308                                            pPowerMgr->passToActiveTMEvent,
309                                            pPowerMgr->passToDozeTMEvent,
310                                            TI_TRUE);
311    if ( status != TI_OK )
312    {
313        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - PowerMgr_init - ERROR binding Auto mode events - ABROTING init!\n");
314        return TI_NOK;
315    }
316
317    /*
318    configure the initialize power mode
319    */
320    pPowerMgr->desiredPowerModeProfile = pPowerMgrInitParams->powerMode;
321    for ( index = 0;index < POWER_MANAGER_MAX_PRIORITY;index++ )
322    {
323        pPowerMgr->powerMngModePriority[index].powerMode = pPowerMgr->desiredPowerModeProfile;
324        pPowerMgr->powerMngModePriority[index].priorityEnable = TI_FALSE;
325    }
326    pPowerMgr->powerMngModePriority[POWER_MANAGER_USER_PRIORITY].priorityEnable = TI_TRUE;
327
328    if (pPowerMgr->reAuthActivePriority)
329		pPowerMgr->powerMngModePriority[POWER_MANAGER_REAUTH_PRIORITY].powerMode = POWER_MODE_ACTIVE;
330
331    /* set the defualt power policy */
332    TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->defaultPowerLevel);
333
334
335    /*create the timers */
336    pPowerMgr->hRetryPsTimer = tmr_CreateTimer(pPowerMgr->hTimer);
337
338    pPowerMgr->hPsPollFailureTimer = tmr_CreateTimer(pPowerMgr->hTimer);
339
340    if ( (pPowerMgr->hPsPollFailureTimer == NULL) || (pPowerMgr->hRetryPsTimer == NULL))
341    {
342TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_SetDefaults - ERROR creating timers - ABROTING init!\n");
343        return TI_NOK;
344    }
345
346    /* Register and Enable the PsPoll failure */
347    TWD_RegisterEvent (pPowerMgr->hTWD,
348        TWD_OWN_EVENT_PSPOLL_DELIVERY_FAILURE,
349        (void *)PowerMgr_PsPollFailureCB,
350        hPowerMgr);
351    TWD_EnableEvent (pPowerMgr->hTWD, TWD_OWN_EVENT_PSPOLL_DELIVERY_FAILURE);
352
353    TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - PowerMgr Initialized\n");
354
355    /* set defaults for the power manager keep-alive sub module */
356    powerMgrKL_setDefaults (pPowerMgr->hPowerMgrKeepAlive);
357
358    return TI_OK;
359}
360
361/****************************************************************************************
362 *                        PowerMgr_startPS                                                          *
363 ****************************************************************************************
364DESCRIPTION: Start the power save algorithm of the driver and also the 802.11 PS.
365
366INPUT:          - hPowerMgr             - Handle to the Power Manager
367
368OUTPUT:
369RETURN:    TI_STATUS - TI_OK or PENDING on success else TI_NOK.\n
370****************************************************************************************/
371TI_STATUS PowerMgr_startPS(TI_HANDLE hPowerMgr)
372{
373    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
374	int frameCount;
375
376
377    TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_startPS - called\n");
378
379    if ( pPowerMgr->psEnable == TI_TRUE )
380    {
381        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_startPS - PS mechanism is already Enable! Aborting psEnable=%d !\n", pPowerMgr->psEnable);
382        /*
383        this is a FATAL ERROR of the power manager!
384        already enable power-save! thus return TI_OK, but there is an error in the upper
385        layer that call tp PowerMgr_startPS() twice - should know that power-save
386        is already enable therefor print the Error message.
387        or
388        the state machine while NOT in PS can be only in ACTIVE state and in some cases in
389        PS_PENDING state. therefore the state machine is out of sync from it logic!
390        */
391        return TI_OK;
392    }
393
394    pPowerMgr->psEnable = TI_TRUE;
395    /*set the correct rate after connection*/
396    powerMgrNullPacketRateConfiguration(hPowerMgr);
397    /*
398    if in auto mode then need to refer to the threshold cross indication from the traffic monitor,
399    else it need to refer to the configured power mode profile from the user.
400    */
401    pPowerMgr->desiredPowerModeProfile = powerMgrGetHighestPriority(hPowerMgr);
402
403    if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
404    {
405        powerMgrStartAutoPowerMode(hPowerMgr);
406    }
407    else /*not auto mode - according to the current profle*/
408    {
409        powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->desiredPowerModeProfile);
410    }
411
412    TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->PowerSavePowerLevel);
413
414   if ((pPowerMgr->betEnable)&&( pPowerMgr->desiredPowerModeProfile != POWER_MODE_ACTIVE ))
415   {
416		TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
417									   pPowerMgr->betEnableTMEvent);
418
419		TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
420									   pPowerMgr->betDisableTMEvent);
421
422
423		frameCount = TrafficMonitor_GetFrameBandwidth(pPowerMgr->hTrafficMonitor);
424
425		if (frameCount < pPowerMgr->BetEnableThreshold)
426		{
427            pPowerMgr->betTrafficEnable = TI_TRUE;
428
429		}
430		else if (frameCount > pPowerMgr->BetDisableThreshold)
431		{
432			pPowerMgr->betTrafficEnable = TI_FALSE;
433        }
434
435		PowerMgrConfigBetToFw(hPowerMgr,pPowerMgr->betTrafficEnable);
436	}
437
438    /* also start the power manager keep-alive sub module */
439    powerMgrKL_start (pPowerMgr->hPowerMgrKeepAlive);
440
441    return TI_OK;
442}
443
444
445/****************************************************************************************
446 *                        PowerMgr_stopPS                                                           *
447 ****************************************************************************************
448DESCRIPTION: Stop the power save algorithm of the driver and also the 802.11 PS.
449
450INPUT:          - hPowerMgr             - Handle to the Power Manager
451
452OUTPUT:
453RETURN:    TI_STATUS - TI_OK or PENDING on success else TI_NOK.\n
454****************************************************************************************/
455TI_STATUS PowerMgr_stopPS(TI_HANDLE hPowerMgr, TI_BOOL bDisconnect)
456{
457    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
458    /*TI_STATUS status;*/
459
460    TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_stopPS - called\n");
461
462    if ( pPowerMgr->psEnable == TI_FALSE )
463    {
464        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_stopPS - PS is already Disable! Aborting!\n");
465        /*
466        Print Info message incase callng PowerMgr_stopPS() more than once in a row, without
467        calling to PowerMgr_startPS() in the middle.
468        this will return with TI_OK and not doing the Stop action!
469        */
470        return TI_OK;
471    }
472
473    pPowerMgr->psEnable = TI_FALSE;
474    tmr_StopTimer (pPowerMgr->hRetryPsTimer);
475
476    /* Check if PsPoll work-around is currently enabled */
477    if ( pPowerMgr->powerMngModePriority[POWER_MANAGER_PS_POLL_FAILURE_PRIORITY].priorityEnable == TI_TRUE)
478    {
479        tmr_StopTimer(pPowerMgr->hPsPollFailureTimer);
480        /* Exit the PsPoll work-around */
481        powerMgr_PsPollFailureTimeout( hPowerMgr, TI_FALSE );
482    }
483
484    if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
485    {
486        powerMgrDisableThresholdsIndications(hPowerMgr);
487    }
488
489    TWD_SetPsMode (pPowerMgr->hTWD, POWER_SAVE_OFF, TI_FALSE, NULL, NULL, NULL);
490
491    /* set the power policy of the system */
492    TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->defaultPowerLevel);
493    if ((pPowerMgr->betEnable)&&( pPowerMgr->desiredPowerModeProfile != POWER_MODE_ACTIVE ))
494	{
495		TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
496									  pPowerMgr->betEnableTMEvent);
497
498		TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
499									  pPowerMgr->betDisableTMEvent);
500	}
501
502   /* also stop the power manager keep-alive sub module */
503    powerMgrKL_stop (pPowerMgr->hPowerMgrKeepAlive, bDisconnect);
504
505    return TI_OK;
506}
507
508
509/****************************************************************************************
510 *                        PowerMgr_getPsStatus                                                          *
511 ****************************************************************************************
512DESCRIPTION: returns the 802.11 power save status (enable / disable).
513
514INPUT:          - hPowerMgr             - Handle to the Power Manager
515
516OUTPUT:
517RETURN:    TI_BOOL - TI_TRUE if enable else TI_FALSE.\n
518****************************************************************************************/
519TI_BOOL PowerMgr_getPsStatus(TI_HANDLE hPowerMgr)
520{
521    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
522
523    return  TWD_GetPsStatus (pPowerMgr->hTWD);
524}
525
526
527/****************************************************************************************
528 *                        PowerMgr_setPowerMode                                                         *
529 ****************************************************************************************
530DESCRIPTION: Configure of the PowerMode profile (auto / active / short doze / long doze).
531
532INPUT:          - hPowerMgr             - Handle to the Power Manager
533            - thePowerMode      - the requested power mode (auto / active / short doze / long doze).
534OUTPUT:
535RETURN:    TI_STATUS - TI_OK on success else TI_NOK.\n
536****************************************************************************************/
537TI_STATUS PowerMgr_setPowerMode(TI_HANDLE hPowerMgr)
538{
539    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
540    PowerMgr_PowerMode_e powerMode;
541
542    /*in this way we will run with the highest priority that is enabled*/
543    powerMode = powerMgrGetHighestPriority(hPowerMgr);
544
545    /* sanity checking */
546    if ( powerMode >= POWER_MODE_MAX)
547    {
548        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_setPowerMode - unknown parameter: %d\n", powerMode);
549        return TI_NOK;
550    }
551
552    TRACE1( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_setPowerMode, power mode = %d\n", powerMode);
553
554    if ( pPowerMgr->desiredPowerModeProfile != powerMode )
555    {
556        PowerMgr_PowerMode_e previousPowerModeProfile;
557        previousPowerModeProfile = pPowerMgr->desiredPowerModeProfile;
558        pPowerMgr->desiredPowerModeProfile = powerMode;
559
560        if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
561        {
562            if ( pPowerMgr->psEnable == TI_TRUE )
563            {
564                powerMgrStartAutoPowerMode(hPowerMgr);
565            }
566
567            /*
568            the transitions of state will be done according to the events from the
569            traffic monitor - therefor abort and wait event from the traffic monitor.
570            */
571            return TI_OK;
572        }
573        else if ( previousPowerModeProfile == POWER_MODE_AUTO )
574        {
575            /*
576            if the old power mode is AUTO and the new power mode is NOT then need
577            to disable the thresholds indications from the traffic monitor.
578            */
579            powerMgrDisableThresholdsIndications(hPowerMgr);
580        }
581        if ( pPowerMgr->psEnable == TI_TRUE )
582        {
583            powerMgrPowerProfileConfiguration(hPowerMgr, powerMode);
584        }
585    }
586    else
587    {
588        /*
589        the power mode is already configure to the module - don't need to do anything!
590        */
591        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, "PowerMgr_setPowerMode - desiredPowerModeProfile == thePowerMode (=%d), ABORTING!\n", powerMode);
592    }
593
594    return TI_OK;
595}
596
597
598/****************************************************************************************
599 *                        PowerMgr_setDozeModeInAuto                                    *
600 ****************************************************************************************
601DESCRIPTION: Configure the doze mode (short-doze / long-doze) that auto mode will toggle between doze vs active.
602INPUT:      - hPowerMgr             - Handle to the Power Manager
603            - dozeMode      - the requested doze mode when Mgr is in Auto mode (short-doze / long-doze)
604OUTPUT:
605RETURN:
606****************************************************************************************/
607void PowerMgr_setDozeModeInAuto(TI_HANDLE hPowerMgr, PowerMgr_PowerMode_e dozeMode)
608{
609    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
610    PowerMgr_PowerMode_e powerMode = powerMgrGetHighestPriority(hPowerMgr);
611
612    /* check if we are trying to configure the same Doze mode */
613    if ( dozeMode != pPowerMgr->autoModeDozeMode )
614    {
615        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_setDozeModeInAuto - autoModeDozeMode == %d \n", dozeMode);
616
617        pPowerMgr->autoModeDozeMode = dozeMode;
618
619        /* in case we are already in Auto mode, we have to set the wake up condition MIB */
620        if ( powerMode == POWER_MODE_AUTO )
621        {
622            if ( dozeMode == POWER_MODE_SHORT_DOZE )
623            {
624                if ( pPowerMgr->beaconListenInterval > 1 )
625                {
626                    powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);
627                }
628                else
629                {
630                    powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);
631                }
632            }
633            else  /* POWER_MODE_LONG_DOZE */
634            {
635                if ( pPowerMgr->dtimListenInterval > 1 )
636                {
637                    powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);
638                }
639                else
640                {
641                    powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);
642                }
643            }
644
645            TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_setDozeModeInAuto - already in Auto\n");
646        }
647    }
648    else
649    {
650        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, "PowerMgr_setDozeModeInAuto - autoModeDozeMode == %d (same same ...)\n", dozeMode);
651    }
652}
653
654/****************************************************************************************
655 *                        PowerMgr_getPowerMode                                                         *
656 ****************************************************************************************
657DESCRIPTION: Get the current PowerMode of the PowerMgr module.
658
659INPUT:          - hPowerMgr             - Handle to the Power Manager
660OUTPUT:
661RETURN:    PowerMgr_PowerMode_e - (auto / active / short doze / long doze).\n
662****************************************************************************************/
663PowerMgr_PowerMode_e PowerMgr_getPowerMode(TI_HANDLE hPowerMgr)
664{
665    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
666
667    return pPowerMgr->desiredPowerModeProfile;
668}
669
670
671TI_STATUS powerMgr_setParam(TI_HANDLE thePowerMgrHandle,
672                            paramInfo_t *theParamP)
673{
674    PowerMgr_t *pPowerMgr = (PowerMgr_t*)thePowerMgrHandle;
675
676    switch ( theParamP->paramType )
677    {
678    case POWER_MGR_POWER_MODE:
679        pPowerMgr->powerMngModePriority[theParamP->content.powerMngPowerMode.PowerMngPriority].powerMode
680                        = theParamP->content.powerMngPowerMode.PowerMode;
681        PowerMgr_setPowerMode(thePowerMgrHandle);
682        if (pPowerMgr->betEnable)
683        PowerMgrConfigBetToFw(thePowerMgrHandle, pPowerMgr->betEnable );
684        break;
685
686    case POWER_MGR_DISABLE_PRIORITY:
687        pPowerMgr->powerMngModePriority[theParamP->content.powerMngPriority].priorityEnable = TI_FALSE;
688        PowerMgr_setPowerMode(thePowerMgrHandle);
689        break;
690
691    case POWER_MGR_ENABLE_PRIORITY:
692        pPowerMgr->powerMngModePriority[theParamP->content.powerMngPriority].priorityEnable = TI_TRUE;
693        PowerMgr_setPowerMode(thePowerMgrHandle);
694        break;
695
696    case POWER_MGR_POWER_LEVEL_PS:
697        pPowerMgr->PowerSavePowerLevel = theParamP->content.PowerSavePowerLevel;
698        /* If we are connected, config the new power level (this param is for connected state) */
699		if (pPowerMgr->psEnable)
700        {
701			TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->PowerSavePowerLevel);
702		}
703        break;
704
705    case POWER_MGR_POWER_LEVEL_DEFAULT:
706        pPowerMgr->defaultPowerLevel = theParamP->content.DefaultPowerLevel;
707        /* If we are NOT connected, config the new power level (this param is for disconnected state) */
708		if (!pPowerMgr->psEnable)
709		{
710			TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->defaultPowerLevel);
711		}
712        break;
713
714    case POWER_MGR_POWER_LEVEL_DOZE_MODE:
715        PowerMgr_setDozeModeInAuto(thePowerMgrHandle,theParamP->content.powerMngDozeMode);
716        if (pPowerMgr->betEnable)
717        PowerMgrConfigBetToFw(thePowerMgrHandle, pPowerMgr->betEnable );
718        break;
719
720    case POWER_MGR_KEEP_ALIVE_ENA_DIS:
721    case POWER_MGR_KEEP_ALIVE_ADD_REM:
722        return powerMgrKL_setParam (pPowerMgr->hPowerMgrKeepAlive, theParamP);
723
724    default:
725        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_setParam - ERROR - Param is not supported, %d\n\n", theParamP->paramType);
726
727        return PARAM_NOT_SUPPORTED;
728    }
729
730    return TI_OK;
731}
732
733
734
735TI_STATUS powerMgr_getParam(TI_HANDLE thePowerMgrHandle,
736                            paramInfo_t *theParamP)
737{
738    PowerMgr_t *pPowerMgr = (PowerMgr_t*)thePowerMgrHandle;
739
740    switch ( theParamP->paramType )
741    {
742    case POWER_MGR_POWER_MODE:
743        theParamP->content.PowerMode = PowerMgr_getPowerMode(thePowerMgrHandle);
744        break;
745
746    case POWER_MGR_POWER_LEVEL_PS:
747        theParamP->content.PowerSavePowerLevel = pPowerMgr->PowerSavePowerLevel;
748        break;
749
750    case POWER_MGR_POWER_LEVEL_DEFAULT:
751        theParamP->content.DefaultPowerLevel = pPowerMgr->defaultPowerLevel;
752        break;
753
754    case POWER_MGR_POWER_LEVEL_DOZE_MODE:
755        theParamP->content.powerMngDozeMode = pPowerMgr->autoModeDozeMode;
756        break;
757
758    case POWER_MGR_KEEP_ALIVE_GET_CONFIG:
759        return powerMgrKL_getParam (pPowerMgr->hPowerMgrKeepAlive, theParamP);
760
761    case POWER_MGR_GET_POWER_CONSUMPTION_STATISTICS:
762
763       return cmdBld_ItrPowerConsumptionstat (pPowerMgr->hTWD,
764                             theParamP->content.interogateCmdCBParams.fCb,
765                             theParamP->content.interogateCmdCBParams.hCb,
766                             (void*)theParamP->content.interogateCmdCBParams.pCb);
767
768
769
770
771
772    default:
773        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_getParam - ERROR - Param is not supported, %d\n\n", theParamP->paramType);
774        return PARAM_NOT_SUPPORTED;
775    }
776
777    return TI_OK;
778}
779
780
781/*****************************************************************************
782 **         Private Function prototypes                                     **
783 *****************************************************************************/
784
785
786/****************************************************************************************
787 *                        powerSaveCompleteCB                                                       *
788 ****************************************************************************************
789DESCRIPTION: Callback for the Power server complete - gets the result of the request
790              for PS or exit PS.
791
792INPUT:          - hPowerMgr             - Handle to the Power Manager
793            - PSMode
794            - trasStatus            - result string form the FW.
795OUTPUT:
796RETURN:    void.\n
797****************************************************************************************/
798static void powerSaveCompleteCB(TI_HANDLE hPowerMgr,TI_UINT8 PSMode,TI_UINT8 transStatus)
799{
800    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
801
802    TRACE1( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerSaveCompleteCB, statud = %d\n", transStatus);
803
804    /* Handling the event*/
805    switch ( (EventsPowerSave_e)transStatus )
806    {
807    case ENTER_POWER_SAVE_FAIL:
808    case EXIT_POWER_SAVE_FAIL:
809        pPowerMgr->lastPsTransaction = transStatus;
810        tmr_StartTimer (pPowerMgr->hRetryPsTimer,
811                        powerMgrRetryPsTimeout,
812                        (TI_HANDLE)pPowerMgr,
813                      RE_ENTER_PS_TIMEOUT,
814                      TI_FALSE);
815        break;
816
817    case ENTER_POWER_SAVE_SUCCESS:
818    case EXIT_POWER_SAVE_SUCCESS:
819        break;
820
821    default:
822        TRACE1( pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "powerSaveCompleteCB: invliad status: %d\n", transStatus);
823        break;
824    }
825}
826
827/**
828 * \\n
829 * \date 30-Aug-2006\n
830 * \brief Power manager callback fro TM event notification
831 *
832 * Function Scope \e Public.\n
833 * \param hPowerMgr - handle to the power maanger object.\n
834 * \param cookie - values supplied during event registration (active / doze).\n
835 */
836static void PowerMgrTMThresholdCrossCB( TI_HANDLE hPowerMgr, TI_UINT32 cookie )
837{
838    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
839
840    TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgrTMThresholdCrossCB - TM notified threshold crossed, cookie: %d\n", cookie);
841
842    /* sanity cehcking - TM notifications should only be received when PM is enabled and in auto mode */
843    if ( (pPowerMgr->psEnable == TI_TRUE) && (pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO))
844    {
845        switch ((PowerMgr_PowerMode_e)cookie)
846        {
847        case POWER_MODE_ACTIVE:
848            powerMgrPowerProfileConfiguration( hPowerMgr, POWER_MODE_ACTIVE );
849            break;
850
851        /* threshold crossed down - need to enter configured doze mode */
852        case POWER_MODE_SHORT_DOZE:
853            powerMgrPowerProfileConfiguration( hPowerMgr, pPowerMgr->autoModeDozeMode );
854            break;
855
856        default:
857            TRACE1( pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgrTMThresholdCrossCB: TM notification with invalid cookie: %d!\n", cookie);
858            break;
859        }
860    }
861    else
862    {
863        TRACE2( pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgrTMThresholdCrossCB: TM motification when psEnable is :%d or desired profile is: %d\n", pPowerMgr->psEnable, pPowerMgr->desiredPowerModeProfile);
864    }
865
866}
867
868/****************************************************************************************
869*                        powerMgrDisableThresholdsIndications                                           *
870*****************************************************************************************
871DESCRIPTION: This will send a disable message to the traffic monitor,
872                 to stop sending indications on threshold pass.
873
874
875INPUT:          - hPowerMgr             - Handle to the Power Manager
876OUTPUT:
877RETURN:    void.\n
878****************************************************************************************/
879static void powerMgrDisableThresholdsIndications(TI_HANDLE hPowerMgr)
880{
881    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
882
883    /*
884    auto is not a static/fix state, else its a dynamic state that flows between
885    the 3 static/fix states: active, short-doze and long-doze.
886    */
887    TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
888                                  pPowerMgr->passToActiveTMEvent);
889
890    TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
891                                  pPowerMgr->passToDozeTMEvent);
892
893}
894
895
896/****************************************************************************************
897*                        powerMgrEnableThresholdsIndications                                            *
898*****************************************************************************************
899DESCRIPTION: TThis will send an enable message to the traffic monitor,
900                to start sending indications on threshold pass.
901
902
903INPUT:          - hPowerMgr             - Handle to the Power Manager
904OUTPUT:
905RETURN:    void.\n
906****************************************************************************************/
907static void powerMgrEnableThresholdsIndications(TI_HANDLE hPowerMgr)
908{
909    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
910
911    TRACE0( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerMgrEnableThresholdsIndications called\n");
912    /*
913    auto is not a static/fix state, but rather a dynamic state that flows between
914    the 3 static/fix states: active, short-doze and long-doze.
915    */
916    TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
917                                   pPowerMgr->passToActiveTMEvent);
918
919    TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
920                                   pPowerMgr->passToDozeTMEvent);
921
922}
923
924
925/****************************************************************************************
926*                        powerMgrStartAutoPowerMode                                                 *
927*****************************************************************************************
928DESCRIPTION: configure the power manager to enter into AUTO power mode.
929             The power manager will deside what power level will be applied
930             acording to the traffic monitor.
931
932INPUT:          - hPowerMgr             - Handle to the Power Manager
933OUTPUT:
934RETURN:    void.\n
935****************************************************************************************/
936static void powerMgrStartAutoPowerMode(TI_HANDLE hPowerMgr)
937{
938    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
939    int frameCount;
940
941    frameCount = TrafficMonitor_GetFrameBandwidth(pPowerMgr->hTrafficMonitor);
942
943    TRACE0( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerMgrStartAutoPowerMode: Starting auto power mode,");
944
945    /*Activates the correct profile*/
946    if ( frameCount >= pPowerMgr->autoModeActiveTH )
947    {
948        powerMgrPowerProfileConfiguration(hPowerMgr, POWER_MODE_ACTIVE);
949    }
950    else
951    {
952        powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->autoModeDozeMode);
953
954    }
955    /* Activates the Trafic monitoe Events*/
956    powerMgrEnableThresholdsIndications(hPowerMgr);
957}
958
959/****************************************************************************************
960*                        powerMgrRetryPsTimeout                                                     *
961*****************************************************************************************
962DESCRIPTION: Retry function if a PS/exit PS request failed
963
964INPUT:      hPowerMgr       - Handle to the Power Manager
965            bTwdInitOccured - Indicates if TWDriver recovery occured since timer started
966
967OUTPUT:
968
969RETURN:    void.\n
970****************************************************************************************/
971static void powerMgrRetryPsTimeout(TI_HANDLE hPowerMgr, TI_BOOL bTwdInitOccured)
972{
973    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
974
975    TRACE0( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerMgrRetryPsTimeout: timer expired.\n");
976
977    if ( pPowerMgr->lastPsTransaction == ENTER_POWER_SAVE_FAIL )
978    {
979        TWD_SetPsMode (pPowerMgr->hTWD, POWER_SAVE_ON, TI_TRUE, hPowerMgr,powerSaveCompleteCB, NULL);/*NULL as GWSI callback*/
980    }
981    else
982    {
983        TWD_SetPsMode (pPowerMgr->hTWD, POWER_SAVE_OFF, TI_TRUE, hPowerMgr, powerSaveCompleteCB, NULL);/*NULL as GWSI callback*/
984    }
985	return;
986}
987
988
989/****************************************************************************************
990*                        powerMgrPowerProfileConfiguration                                          *
991*****************************************************************************************
992DESCRIPTION: This function is the " builder " of the Power Save profiles.
993             acording to the desired Power mode.
994
995INPUT:          - hPowerMgr             - Handle to the Power Manager
996OUTPUT:
997RETURN:    void.\n
998****************************************************************************************/
999static void powerMgrPowerProfileConfiguration(TI_HANDLE hPowerMgr, PowerMgr_PowerMode_e desiredPowerMode)
1000{
1001    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1002
1003    tmr_StopTimer (pPowerMgr->hRetryPsTimer);
1004
1005	pPowerMgr->lastPowerModeProfile = desiredPowerMode;
1006
1007    switch ( desiredPowerMode )
1008    {
1009    case POWER_MODE_AUTO:
1010        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==AUTO - This mode should not be sent to the GWSI - we send AUTO instead\n");
1011        break;
1012
1013    case POWER_MODE_ACTIVE:
1014        /* set AWAKE through */
1015        TWD_SetPsMode (pPowerMgr->hTWD,
1016                                          POWER_SAVE_OFF,
1017                                          TI_TRUE,
1018                                          hPowerMgr,
1019                                          powerSaveCompleteCB,
1020                                          NULL);
1021
1022        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==ACTIVE\n");
1023        break;
1024
1025    case POWER_MODE_SHORT_DOZE:
1026        if ( pPowerMgr->beaconListenInterval > 1 )
1027        {
1028            powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);
1029        }
1030        else
1031        {
1032            powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);
1033        }
1034
1035        TWD_SetPsMode (pPowerMgr->hTWD,
1036                                          POWER_SAVE_ON,
1037                                          TI_TRUE,
1038                                          hPowerMgr,
1039                                          powerSaveCompleteCB,
1040                                          NULL);
1041
1042        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==SHORT_DOZE\n");
1043        break;
1044
1045    case POWER_MODE_LONG_DOZE:
1046        if ( pPowerMgr->dtimListenInterval > 1 )
1047        {
1048            powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);
1049        }
1050        else
1051        {
1052            powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);
1053        }
1054        TWD_SetPsMode (pPowerMgr->hTWD,
1055                                          POWER_SAVE_ON,
1056                                          TI_TRUE,
1057                                          hPowerMgr,
1058                                          powerSaveCompleteCB,
1059                                          NULL);
1060
1061        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==LONG_DOZE\n");
1062        break;
1063
1064	case POWER_MODE_PS_ONLY:
1065		/* When in SG PS mode, configure the user desired wake-up condition */
1066		powerMgr_SGSetUserDesiredwakeUpCond(pPowerMgr);
1067
1068        TWD_SetPsMode (pPowerMgr->hTWD,
1069                                          POWER_SAVE_ON,
1070                                          TI_TRUE,
1071                                          hPowerMgr,
1072                                          powerSaveCompleteCB,
1073                                          NULL);
1074
1075        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==PS_ONLY\n");
1076        break;
1077
1078    default:
1079        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_setWakeUpConfiguration - ERROR - PowerMode - unknown parameter: %d\n", desiredPowerMode);
1080        return;
1081    }
1082
1083}
1084
1085
1086/****************************************************************************************
1087*                        powerMgrSendMBXWakeUpConditions                                            *
1088*****************************************************************************************
1089DESCRIPTION: Tsend configuration of the power management option that holds in the command
1090                mailbox inner sturcture.
1091
1092INPUT:          - hPowerMgr             - Handle to the Power Manager
1093OUTPUT:
1094RETURN:    TI_STATUS - TI_OK on success else TI_NOK.\n
1095****************************************************************************************/
1096static TI_STATUS powerMgrSendMBXWakeUpConditions(TI_HANDLE hPowerMgr,
1097                                                 TI_UINT8 listenInterval,
1098                                                 ETnetWakeOn tnetWakeupOn)
1099{
1100    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1101    TPowerMgmtConfig powerMgmtConfig;
1102    TI_STATUS status = TI_OK;
1103
1104    powerMgmtConfig.listenInterval = listenInterval;
1105    powerMgmtConfig.tnetWakeupOn = tnetWakeupOn;
1106
1107    TRACE2(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerMgrSendMBXWakeUpConditions: listenInterval = %d, tnetWakeupOn = %d\n", listenInterval,tnetWakeupOn);
1108
1109    status = TWD_CfgWakeUpCondition (pPowerMgr->hTWD, &powerMgmtConfig);
1110
1111    if ( status != TI_OK )
1112    {
1113        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "powerMgrSendMBXWakeUpConditions - Error in wae up condition IE!\n");
1114    }
1115    return status;
1116}
1117
1118
1119
1120
1121static TI_STATUS powerMgrNullPacketRateConfiguration(TI_HANDLE hPowerMgr)
1122{
1123    paramInfo_t     param;
1124    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1125
1126    param.paramType = SITE_MGR_CURRENT_RATE_PAIR_PARAM;
1127    if ( siteMgr_getParam(pPowerMgr->hSiteMgr, &param) == TI_OK )
1128    {
1129        TWD_SetNullRateModulation (pPowerMgr->hTWD, (TI_UINT16)param.content.siteMgrCurrentRateMask.basicRateMask);
1130    }
1131    else
1132    {
1133        TWD_SetNullRateModulation (pPowerMgr->hTWD, (DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER));
1134        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "powerMgrNullPacketRateConfiguration: error - faild to set rate so default was seted!\n");
1135    }
1136    return TI_OK;
1137
1138}
1139
1140
1141static PowerMgr_PowerMode_e powerMgrGetHighestPriority(TI_HANDLE hPowerMgr)
1142{
1143    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1144    int index;
1145    for ( index = POWER_MANAGER_MAX_PRIORITY-1;index >= 0;index-- )
1146    {
1147        if ( pPowerMgr->powerMngModePriority[index].priorityEnable )
1148        {
1149
1150            return pPowerMgr->powerMngModePriority[index].powerMode;
1151        }
1152
1153    }
1154
1155    TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "powerMgrGetHighestPriority - error - faild to get highest priority! sefault deseired mode was returned !!!\n");
1156    return pPowerMgr->desiredPowerModeProfile;
1157}
1158
1159
1160 /****************************************************************************************
1161 *                        PowerMgr_notifyFWReset															*
1162 ****************************************************************************************
1163DESCRIPTION: Notify the object of the power Manager about FW reset (recovery).
1164			 Calls PowerSrv module to Set Ps Mode
1165
1166INPUT:      - hPowerMgr - Handle to the Power Manager
1167OUTPUT:
1168RETURN:    TI_STATUS - TI_OK on success else TI_NOK.
1169****************************************************************************************/
1170TI_STATUS PowerMgr_notifyFWReset(TI_HANDLE hPowerMgr)
1171{
1172	PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1173
1174    TRACE2(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_notifyFWReset(): psEnable = %d, lastPowerModeProfile = %d\n", pPowerMgr->psEnable, pPowerMgr->lastPowerModeProfile);
1175
1176	if (pPowerMgr->psEnable)
1177	{
1178		powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->lastPowerModeProfile);
1179	}
1180
1181    return TI_OK;
1182}
1183
1184
1185/****************************************************************************************
1186 *                        PowerMgrConfigBetToFw															*
1187 ****************************************************************************************
1188DESCRIPTION: callback from TM event notification.
1189				-	call PowerSrv module to Set Ps Mode
1190
1191INPUT:      	- hPowerMgr - Handle to the Power Manager
1192                - BetEnable - cookie:values supplied during event registration
1193OUTPUT:
1194RETURN:    None.
1195****************************************************************************************/
1196static void PowerMgrConfigBetToFw( TI_HANDLE hPowerMgr, TI_UINT32 BetEnable )
1197{
1198    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1199    TI_UINT8 MaximumConsecutiveET;
1200    TI_UINT32 listenInterval;
1201    paramInfo_t param;
1202    TI_UINT32 beaconInterval;
1203    TI_UINT32 dtimPeriod;
1204    PowerMgr_PowerMode_e powerMode;
1205
1206    param.paramType = SITE_MGR_BEACON_INTERVAL_PARAM;
1207    siteMgr_getParam(pPowerMgr->hSiteMgr, &param);
1208    beaconInterval = param.content.beaconInterval;
1209
1210    param.paramType = SITE_MGR_DTIM_PERIOD_PARAM;
1211    siteMgr_getParam(pPowerMgr->hSiteMgr, &param);
1212    dtimPeriod = param.content.siteMgrDtimPeriod;
1213
1214    /* get actual Power Mode */
1215    if (pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO)
1216    {
1217        powerMode = pPowerMgr->autoModeDozeMode;
1218    }
1219    else
1220    {
1221        powerMode = pPowerMgr->lastPowerModeProfile;
1222    }
1223
1224    /* calc ListenInterval */
1225    if (powerMode == POWER_MODE_SHORT_DOZE)
1226    {
1227        listenInterval = beaconInterval * pPowerMgr->beaconListenInterval;
1228    }
1229    else if (powerMode == POWER_MODE_LONG_DOZE)
1230    {
1231        listenInterval = dtimPeriod * beaconInterval * pPowerMgr->dtimListenInterval;
1232    }
1233    else
1234    {
1235        listenInterval = beaconInterval;
1236    }
1237
1238    if (listenInterval == 0)
1239    {
1240        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, "PowerMgrConfigBetToFw: listenInterval is ZERO\n");
1241        return;
1242    }
1243
1244    /* MaximumConsecutiveET = MaximalFullBeaconReceptionInterval / MAX( BeaconInterval, ListenInterval) */
1245    MaximumConsecutiveET = pPowerMgr->maxFullBeaconInterval / listenInterval;
1246
1247    TRACE5(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgrConfigBetToFw:\n                           Power Mode = %d\n                           beaconInterval = %d\n                           listenInterval = %d\n                           Bet Enable = %d\n                           MaximumConsecutiveET = %d\n", powerMode, beaconInterval, listenInterval, BetEnable, MaximumConsecutiveET);
1248
1249    pPowerMgr->betEnable = BetEnable; /* save BET enable flag for CLI configuration */
1250
1251    TWD_CfgBet(pPowerMgr->hTWD, BetEnable, MaximumConsecutiveET);
1252}
1253
1254/**
1255 * \date 10-April-2007\n
1256 * \brief Returns to the configured wakeup condition, when SG protective mode is done
1257 *
1258 * Function Scope \e Public.\n
1259 * Parameters:\n
1260 * 1) TI_HANDLE - handle to the PowerMgr object.\n
1261 * Return Value: void.\n
1262 */
1263static void powerMgr_SGSetUserDesiredwakeUpCond( TI_HANDLE hPowerMgr )
1264{
1265    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1266
1267   	if (pPowerMgr->psEnable)
1268	{
1269		/* set wakeup condition according to user mode power save profile */
1270		switch ( pPowerMgr->powerMngModePriority[ POWER_MANAGER_USER_PRIORITY ].powerMode )
1271		{
1272		case POWER_MODE_AUTO:
1273			/*set wakeup condition according to doze mode in auto and wakup interval */
1274			if ( pPowerMgr->autoModeDozeMode == POWER_MODE_SHORT_DOZE )
1275			{
1276				/* short doze */
1277				if ( pPowerMgr->beaconListenInterval > 1 )
1278				{
1279					powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);
1280				}
1281				else
1282				{
1283					powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);
1284				}
1285			}
1286			else
1287			{
1288				/* long doze */
1289				if ( pPowerMgr->dtimListenInterval > 1 )
1290				{
1291					powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);
1292				}
1293				else
1294				{
1295					powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);
1296				}
1297			}
1298			break;
1299
1300		case POWER_MODE_ACTIVE:
1301			break;
1302
1303		case POWER_MODE_SHORT_DOZE:
1304			if ( pPowerMgr->beaconListenInterval > 1 )
1305			{
1306				powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);
1307			}
1308			else
1309			{
1310				powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);
1311			}
1312			break;
1313
1314		case POWER_MODE_LONG_DOZE:
1315			if ( pPowerMgr->dtimListenInterval > 1 )
1316			{
1317				powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);
1318			}
1319			else
1320			{
1321				powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);
1322			}
1323			break;
1324
1325		default:
1326TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, ": ERROR - PowerMode for user prioirty is: %d\n", pPowerMgr->powerMngModePriority[ POWER_MANAGER_USER_PRIORITY ].powerMode);
1327		}
1328	}/*end of if (psEnable)*/
1329}
1330
1331
1332
1333/****************************************************************************************
1334*                        PowerMgr_PsPollFailureCB															*
1335****************************************************************************************
1336DESCRIPTION: Work around to solve AP bad behavior.
1337         Some old AP's have trouble with Ps-Poll - The solution will be to exit PS for a
1338         period of time
1339
1340INPUT:      	- hPowerMgr - Handle to the Power Manager
1341OUTPUT:
1342RETURN:
1343****************************************************************************************/
1344static void PowerMgr_PsPollFailureCB( TI_HANDLE hPowerMgr )
1345{
1346    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1347
1348    if ( pPowerMgr->PsPollDeliveryFailureRecoveryPeriod )
1349    {
1350        paramInfo_t param;
1351
1352        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, " Oh boy, AP is not answering Ps-Poll's. enter active PS for %d Ms\n", pPowerMgr->PsPollDeliveryFailureRecoveryPeriod);
1353
1354        /*
1355         * Set the system to Active power save
1356         */
1357        param.paramType = POWER_MGR_POWER_MODE;
1358        param.content.powerMngPowerMode.PowerMode = POWER_MODE_ACTIVE;
1359        param.content.powerMngPowerMode.PowerMngPriority = POWER_MANAGER_PS_POLL_FAILURE_PRIORITY;
1360        powerMgr_setParam(hPowerMgr,&param);
1361
1362        param.paramType = POWER_MGR_ENABLE_PRIORITY;
1363        param.content.powerMngPriority = POWER_MANAGER_PS_POLL_FAILURE_PRIORITY;
1364        powerMgr_setParam(hPowerMgr,&param);
1365
1366        /*
1367         * Set timer to exit the active mode
1368         */
1369        tmr_StartTimer(pPowerMgr->hPsPollFailureTimer,
1370					   powerMgr_PsPollFailureTimeout,
1371					   (TI_HANDLE)pPowerMgr,
1372					   pPowerMgr->PsPollDeliveryFailureRecoveryPeriod,
1373					   TI_FALSE);
1374    }
1375    else    /* Work-around is disabled */
1376    {
1377        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, " Oh boy, AP is not answering Ps-Poll's !!!\n");
1378    }
1379	return;
1380}
1381
1382/****************************************************************************************
1383*                        powerMgr_PsPollFailureTimeout									*
1384****************************************************************************************
1385DESCRIPTION: After the timeout of ps-poll failure - return to normal behavior
1386
1387INPUT:      	- hPowerMgr - Handle to the Power Manager
1388OUTPUT:
1389RETURN:
1390****************************************************************************************/
1391static void powerMgr_PsPollFailureTimeout( TI_HANDLE hPowerMgr, TI_BOOL bTwdInitOccured )
1392{
1393    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1394    paramInfo_t param;
1395
1396    TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, " \n");
1397
1398    /* disable Ps-Poll priority */
1399    param.paramType = POWER_MGR_DISABLE_PRIORITY;
1400    param.content.powerMngPriority = POWER_MANAGER_PS_POLL_FAILURE_PRIORITY;
1401    powerMgr_setParam(hPowerMgr,&param);
1402
1403	return;
1404}
1405
1406TI_BOOL PowerMgr_getReAuthActivePriority(TI_HANDLE thePowerMgrHandle)
1407{
1408    PowerMgr_t *pPowerMgr = (PowerMgr_t*)thePowerMgrHandle;
1409	return pPowerMgr->reAuthActivePriority;
1410}
1411