2 * \brief This is the PowerMgr module implementation.
6 /****************************************************************************
7 **+-----------------------------------------------------------------------+**
9 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
10 **| All rights reserved. |**
12 **| Redistribution and use in source and binary forms, with or without |**
13 **| modification, are permitted provided that the following conditions |**
16 **| * Redistributions of source code must retain the above copyright |**
17 **| notice, this list of conditions and the following disclaimer. |**
18 **| * Redistributions in binary form must reproduce the above copyright |**
19 **| notice, this list of conditions and the following disclaimer in |**
20 **| the documentation and/or other materials provided with the |**
22 **| * Neither the name Texas Instruments nor the names of its |**
23 **| contributors may be used to endorse or promote products derived |**
24 **| from this software without specific prior written permission. |**
26 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |**
27 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |**
28 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
29 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |**
30 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
31 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |**
32 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
33 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
34 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |**
35 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
36 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |**
38 **+-----------------------------------------------------------------------+**
39 ****************************************************************************/
41 /****************************************************************************
44 * PURPOSE: PowerMgr Module implementation. *
46 ****************************************************************************/
53 #include "PowerMgr_API.h"
54 #include "TrafficMonitorAPI.h"
55 #include "qosMngr_API.h"
56 #include "siteMgrApi.h"
57 #include "SoftGeminiApi.h"
59 /*****************************************************************************
61 *****************************************************************************/
62 #define DEFAULT_LISTEN_INTERVAL (1)
67 /*****************************************************************************
68 ** Private Function prototypes **
69 *****************************************************************************/
71 static void powerSaveCompleteCB(TI_HANDLE hPowerMgr,UINT8 PSMode,UINT8 transStatus);
72 static void PowerMgrTMThresholdCrossCB( TI_HANDLE hPowerMgr, UINT32 cookie );
73 static void powerMgrDisableThresholdsIndications(TI_HANDLE hPowerMgr);
74 static void powerMgrEnableThresholdsIndications(TI_HANDLE hPowerMgr);
75 static void powerMgrStartAutoPowerMode(TI_HANDLE hPowerMgr);
76 static void powerMgrRetryPsTimeout(TI_HANDLE hPowerMgr);
77 static void powerMgrPowerProfileConfiguration(TI_HANDLE hPowerMgr, PowerMgr_PowerMode_e desiredPowerMode);
78 static TI_STATUS powerMgrSendMBXWakeUpConditions(TI_HANDLE hPowerMgr,UINT8 listenInterval, PowerMgr_TnetWakeOn_e tnetWakeupOn);
79 static TI_STATUS powerMgrNullPacketRateConfiguration(TI_HANDLE hPowerMgr);
80 static PowerMgr_PowerMode_e powerMgrGetHighestPriority(TI_HANDLE hPowerMgr);
81 static void PowerMgr_setDozeModeInAuto(TI_HANDLE hPowerMgr,PowerMgr_PowerMode_e dozeMode);
82 static void PowerMgrConfigBetToFw( TI_HANDLE hPowerMgr, UINT32 cookie );
83 static void PowerMgr_PsPollFailureCB( TI_HANDLE hPowerMgr );
84 static void powerMgr_PsPollFailureTimeout(TI_HANDLE hPowerMgr);
86 static void powerMgr_CpuLoadTimeout(TI_HANDLE hPowerMgr);
88 static void powerMgr_SGSetUserDesiredwakeUpCond( TI_HANDLE hPowerMgr );
91 /*****************************************************************************
92 ** Public Function prototypes **
93 *****************************************************************************/
96 /****************************************************************************************
98 ****************************************************************************************
99 DESCRIPTION: Creates the object of the power Manager.
100 performs the following:
101 - Allocate the Power Manager handle
102 - Creates the retry timer
104 INPUT: - hOs - Handle to OS
106 RETURN: Handle to the Power Manager module on success, NULL otherwise
107 ****************************************************************************************/
108 TI_HANDLE PowerMgr_create(TI_HANDLE hOs)
111 PowerMgr_t * pPowerMgr = NULL;
112 pPowerMgr = (PowerMgr_t*) os_memoryAlloc (hOs, sizeof(PowerMgr_t));
113 if ( pPowerMgr == NULL )
115 WLAN_OS_REPORT(("PowerMgr_create - Memory Allocation Error!\n"));
119 os_memoryZero (hOs, pPowerMgr, sizeof(PowerMgr_t));
121 pPowerMgr->hOS = hOs;
123 /*create the timers */
124 pPowerMgr->hRetryPsTimer = os_timerCreate(pPowerMgr->hOS,
125 powerMgrRetryPsTimeout,
128 pPowerMgr->hPsPollFailureTimer = os_timerCreate(pPowerMgr->hOS,
129 powerMgr_PsPollFailureTimeout,
133 pPowerMgr->hCpuLoadTimer = os_timerCreate(pPowerMgr->hOS,
134 powerMgr_CpuLoadTimeout,
139 if ( (pPowerMgr->hPsPollFailureTimer == NULL) || (pPowerMgr->hRetryPsTimer == NULL) )
141 WLAN_OS_REPORT(("PowerMgr_create - Error in creating timer!\n"));
142 PowerMgr_destroy(pPowerMgr);
151 /****************************************************************************************
153 ****************************************************************************************
154 DESCRIPTION: Destroy the object of the power Manager.
155 - delete Power Manager alocation
156 - call the destroy function of the timer
158 INPUT: - hPowerMgr - Handle to the Power Manager
160 RETURN: TI_STATUS - OK on success else NOK.
161 ****************************************************************************************/
162 TI_STATUS PowerMgr_destroy(TI_HANDLE hPowerMgr)
164 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
166 if ( pPowerMgr->hRetryPsTimer != NULL )
168 os_timerDestroy(pPowerMgr->hOS,
169 pPowerMgr->hRetryPsTimer);
172 if ( pPowerMgr->hPsPollFailureTimer != NULL )
174 os_timerDestroy(pPowerMgr->hOS,
175 pPowerMgr->hPsPollFailureTimer);
177 os_memoryFree(pPowerMgr->hOS , pPowerMgr , sizeof(PowerMgr_t));
183 /****************************************************************************************
185 ****************************************************************************************
186 DESCRIPTION: Power Manager init function, called in configure phase.
188 INPUT: - hPowerMgr - Handle to the Power Manager
189 - hReport - Handle to report.
190 - hSiteMgr - Handle to site manager
191 - trafficMonitor - Handle to Trrafic monitor
192 - pPowerMgrInitParams - initi parameters
196 RETURN: TI_STATUS - OK on success else NOK.
197 ****************************************************************************************/
198 TI_STATUS PowerMgr_init( TI_HANDLE hPowerMgr,
199 TI_HANDLE hMacServices,
203 TI_HANDLE hTrafficMonitor,
204 TI_HANDLE hSoftGemini,
205 PowerMgrInitParams_t * pPowerMgrInitParams)
207 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
209 /* used to initialize the Traffic Monitor for Auto Ps events */
210 TrafficAlertRegParm_t tmRegParam;
213 pPowerMgr->hReport = hReport;
214 pPowerMgr->hTrafficMonitor = hTrafficMonitor;
215 pPowerMgr->hSiteMgr = hSiteMgr;
216 pPowerMgr->hWhalCtrl = hWhalCtrl;
217 pPowerMgr->hMacServices= hMacServices;
218 pPowerMgr->hSoftGemini = hSoftGemini;
219 pPowerMgr->psEnable = FALSE;
221 /* init power management options */
222 pPowerMgr->beaconListenInterval = pPowerMgrInitParams->beaconListenInterval;
223 pPowerMgr->dtimListenInterval = pPowerMgrInitParams->dtimListenInterval;
224 pPowerMgr->defaultPowerLevel = pPowerMgrInitParams->defaultPowerLevel;
225 pPowerMgr->PowerSavePowerLevel = pPowerMgrInitParams->PowerSavePowerLevel;
226 pPowerMgr->powerMngPriority = POWER_MANAGER_USER_PRIORITY;
227 pPowerMgr->maxFullBeaconInterval = pPowerMgrInitParams->MaximalFullBeaconReceptionInterval;
228 pPowerMgr->PsPollDeliveryFailureRecoveryPeriod = pPowerMgrInitParams->PsPollDeliveryFailureRecoveryPeriod;
231 set AUTO PS parameters
233 pPowerMgr->autoModeInterval = pPowerMgrInitParams->autoModeInterval;
234 pPowerMgr->autoModeActiveTH = pPowerMgrInitParams->autoModeActiveTH;
235 pPowerMgr->autoModeDozeTH = pPowerMgrInitParams->autoModeDozeTH;
236 pPowerMgr->autoModeDozeMode = pPowerMgrInitParams->autoModeDozeMode;
239 register threshold in the traffic monitor.
242 pPowerMgr->betEnable = pPowerMgrInitParams->BetEnable; /* save BET enable flag for CLI configuration */
243 pPowerMgr->betTrafficEnable = FALSE; /* starting without BET */
246 /* general parameters */
247 tmRegParam.Context = pPowerMgr;
248 tmRegParam.TimeIntervalMs = BET_INTERVAL_VALUE;
249 tmRegParam.Trigger = TRAFF_EDGE;
250 tmRegParam.MonitorType = TX_RX_ALL_802_11_DATA_FRAMES;
251 tmRegParam.CallBack = PowerMgrConfigBetToFw;
253 /* BET enable event */
254 tmRegParam.Direction = TRAFF_DOWN;
255 tmRegParam.Threshold = pPowerMgrInitParams->BetEnableThreshold;
256 pPowerMgr->BetEnableThreshold = pPowerMgrInitParams->BetEnableThreshold;
257 tmRegParam.Cookie = (UINT32)BET_ENABLE;
258 pPowerMgr->betEnableTMEvent = TrafficMonitor_RegEvent(hTrafficMonitor,
261 /* BET disable event */
262 tmRegParam.Direction = TRAFF_UP;
263 tmRegParam.Threshold = pPowerMgrInitParams->BetDisableThreshold;
264 pPowerMgr->BetDisableThreshold = pPowerMgrInitParams->BetDisableThreshold;
265 tmRegParam.Cookie = (UINT32)BET_DISABLE;
266 pPowerMgr->betDisableTMEvent = TrafficMonitor_RegEvent(hTrafficMonitor,
270 if ( (pPowerMgr->betDisableTMEvent == NULL) ||
271 (pPowerMgr->betEnableTMEvent == NULL) )
273 WLAN_REPORT_INIT(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
274 ("PowerMgr_init - TM - ERROR registering BET events - ABROTING init!\n"));
278 set the events as resets for one another
280 status = TrafficMonitor_SetRstCondition(hTrafficMonitor,
281 pPowerMgr->betDisableTMEvent,
282 pPowerMgr->betEnableTMEvent,
286 WLAN_REPORT_INIT(pPowerMgr->hReport,
287 POWER_MANAGER_MODULE_LOG,
288 ("PowerMgr_init - PowerMgr_init - ERROR binding BET events - ABROTING init!\n"));
292 /* general parameters */
293 tmRegParam.Context = pPowerMgr;
294 tmRegParam.Cookie = (UINT32)POWER_MODE_ACTIVE;
295 tmRegParam.TimeIntervalMs = pPowerMgr->autoModeInterval;
296 tmRegParam.Trigger = TRAFF_EDGE;
297 tmRegParam.MonitorType = TX_RX_ALL_802_11_DATA_FRAMES;
299 /* Active threshold */
300 tmRegParam.CallBack = PowerMgrTMThresholdCrossCB;
301 tmRegParam.Direction = TRAFF_UP;
302 tmRegParam.Threshold = pPowerMgr->autoModeActiveTH;
303 pPowerMgr->passToActiveTMEvent = TrafficMonitor_RegEvent(hTrafficMonitor,
307 tmRegParam.Direction = TRAFF_DOWN;
308 tmRegParam.Threshold = pPowerMgr->autoModeDozeTH;
309 tmRegParam.Cookie = (UINT32)POWER_MODE_SHORT_DOZE; /* diffrentiation between long / short doze is done at the
310 CB, according to configuration at time of CB invokation */
311 pPowerMgr->passToDozeTMEvent = TrafficMonitor_RegEvent(hTrafficMonitor,
315 if ( (pPowerMgr->passToActiveTMEvent == NULL) ||
316 (pPowerMgr->passToDozeTMEvent == NULL) )
318 WLAN_REPORT_INIT(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
319 ("PowerMgr_init - PowerMgr_init - ERROR registering Auto mode events - ABROTING init!\n"));
324 set the events as resets for one another
326 status = TrafficMonitor_SetRstCondition(hTrafficMonitor,
327 pPowerMgr->passToActiveTMEvent,
328 pPowerMgr->passToDozeTMEvent,
332 WLAN_REPORT_INIT(pPowerMgr->hReport,
333 POWER_MANAGER_MODULE_LOG,
334 ("PowerMgr_init - PowerMgr_init - ERROR binding Auto mode events - ABROTING init!\n"));
339 configure the initialize power mode
341 pPowerMgr->desiredPowerModeProfile = pPowerMgrInitParams->powerMode;
342 for ( index = 0;index < POWER_MANAGER_MAX_PRIORITY;index++ )
344 pPowerMgr->powerMngModePriority[index].powerMode = pPowerMgr->desiredPowerModeProfile;
345 pPowerMgr->powerMngModePriority[index].priorityEnable = FALSE;
347 pPowerMgr->powerMngModePriority[POWER_MANAGER_USER_PRIORITY].priorityEnable = TRUE;
348 /* set the defualt power policy */
349 MacServices_powerAutho_PowerPolicyUpdate(pPowerMgr->hMacServices, pPowerMgr->defaultPowerLevel);
351 /* Register and Enable the PsPoll failure */
352 whalCtrl_EventMbox_RegisterForEvent( pPowerMgr->hWhalCtrl,
353 HAL_EVENT_PSPOLL_DELIVERY_FAILURE,
354 (void *)PowerMgr_PsPollFailureCB,
356 whalCtrl_EventMbox_Enable( pPowerMgr->hWhalCtrl, HAL_EVENT_PSPOLL_DELIVERY_FAILURE );
359 WLAN_REPORT_INIT(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
360 ("PowerMgr_init - PowerMgr Initialized\n"));
365 /****************************************************************************************
367 ****************************************************************************************
368 DESCRIPTION: Start the power save algorithm of the driver and also the 802.11 PS.
370 INPUT: - hPowerMgr - Handle to the Power Manager
373 RETURN: TI_STATUS - OK or PENDING on success else NOK.\n
374 ****************************************************************************************/
375 TI_STATUS PowerMgr_startPS(TI_HANDLE hPowerMgr)
377 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
380 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
381 ("PowerMgr_startPS - called\n"));
384 if ( pPowerMgr->psEnable == TRUE )
386 WLAN_REPORT_ERROR(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
387 ("PowerMgr_startPS - PS mechanism is already Enable! Aborting psEnable=%d !\n",
388 pPowerMgr->psEnable));
390 this is a FATAL ERROR of the power manager!
391 already enable power-save! thus return OK, but there is an error in the upper
392 layer that call tp PowerMgr_startPS() twice - should know that power-save
393 is already enable therefor print the Error message.
395 the state machine while NOT in PS can be only in ACTIVE state and in some cases in
396 PS_PENDING state. therefore the state machine is out of sync from it logic!
401 pPowerMgr->psEnable = TRUE;
402 /*set the correct rate after connection*/
403 powerMgrNullPacketRateConfiguration(hPowerMgr);
405 if in auto mode then need to refer to the threshold cross indication from the traffic monitor,
406 else it need to refer to the configured power mode profile from the user.
409 pPowerMgr->desiredPowerModeProfile = powerMgrGetHighestPriority(hPowerMgr);
411 if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
413 powerMgrStartAutoPowerMode(hPowerMgr);
415 else /*not auto mode - according to the current profle*/
417 powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->desiredPowerModeProfile);
421 if (pPowerMgr->betEnable)
423 TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
424 pPowerMgr->betEnableTMEvent);
426 TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
427 pPowerMgr->betDisableTMEvent);
430 frameCount = TrafficMonitor_GetFrameBandwidth(pPowerMgr->hTrafficMonitor);
432 if (frameCount < pPowerMgr->BetEnableThreshold)
434 pPowerMgr->betTrafficEnable = TRUE;
436 else if (frameCount > pPowerMgr->BetDisableThreshold)
438 pPowerMgr->betTrafficEnable = FALSE;
441 PowerMgrConfigBetToFw(hPowerMgr,pPowerMgr->betTrafficEnable);
448 /****************************************************************************************
450 ****************************************************************************************
451 DESCRIPTION: Stop the power save algorithm of the driver and also the 802.11 PS.
453 INPUT: - hPowerMgr - Handle to the Power Manager
456 RETURN: TI_STATUS - OK or PENDING on success else NOK.\n
457 ****************************************************************************************/
458 TI_STATUS PowerMgr_stopPS(TI_HANDLE hPowerMgr)
460 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
461 /*TI_STATUS status;*/
463 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
464 ("PowerMgr_stopPS - called\n"));
466 if ( pPowerMgr->psEnable == FALSE )
468 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
469 ("PowerMgr_stopPS - PS is already Disable! Aborting!\n"));
471 Print Info message incase callng PowerMgr_stopPS() more than once in a row, without
472 calling to PowerMgr_startPS() in the middle.
473 this will return with OK and not doing the Stop action!
478 pPowerMgr->psEnable = FALSE;
479 os_timerStop(pPowerMgr->hOS, pPowerMgr->hRetryPsTimer);
481 /* Check if PsPoll work-around is currently enabled */
482 if ( pPowerMgr->powerMngModePriority[POWER_MANAGER_PS_POLL_FAILURE_PRIORITY].priorityEnable == TRUE)
484 os_timerStop(pPowerMgr->hOS, pPowerMgr->hPsPollFailureTimer);
485 /* Exit the PsPoll work-around */
486 powerMgr_PsPollFailureTimeout( hPowerMgr );
489 if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
491 powerMgrDisableThresholdsIndications(hPowerMgr);
494 MacServices_powerSrv_SetPsMode(pPowerMgr->hMacServices, POWER_SAVE_OFF, FALSE,NULL, NULL, NULL);
496 /* set the power policy of the system */
497 MacServices_powerAutho_PowerPolicyUpdate(pPowerMgr->hMacServices, pPowerMgr->defaultPowerLevel);
499 if (pPowerMgr->betEnable)
501 TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
502 pPowerMgr->betEnableTMEvent);
504 TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
505 pPowerMgr->betDisableTMEvent);
512 /****************************************************************************************
513 * PowerMgr_getPsStatus *
514 ****************************************************************************************
515 DESCRIPTION: returns the 802.11 power save status (enable / disable).
517 INPUT: - hPowerMgr - Handle to the Power Manager
520 RETURN: BOOLEAN - TRUE if enable else FALSE.\n
521 ****************************************************************************************/
522 BOOLEAN PowerMgr_getPsStatus(TI_HANDLE hPowerMgr)
524 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
525 return MacServices_powerSrv_getPsStatus(pPowerMgr->hMacServices);
530 /****************************************************************************************
531 * PowerMgr_setPowerMode *
532 ****************************************************************************************
533 DESCRIPTION: Configure of the PowerMode profile (auto / active / short doze / long doze).
535 INPUT: - hPowerMgr - Handle to the Power Manager
536 - thePowerMode - the requested power mode (auto / active / short doze / long doze).
538 RETURN: TI_STATUS - OK on success else NOK.\n
539 ****************************************************************************************/
540 TI_STATUS PowerMgr_setPowerMode(TI_HANDLE hPowerMgr)
542 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
543 PowerMgr_PowerMode_e powerMode;
545 /*in this way we will run with the highest priority that is enabled*/
546 powerMode = powerMgrGetHighestPriority(hPowerMgr);
548 /* sanity checking */
549 if ( powerMode >= POWER_MODE_MAX)
551 WLAN_REPORT_ERROR(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
552 ("PowerMgr_setPowerMode - unknown parameter: %d\n", powerMode));
556 WLAN_REPORT_INFORMATION( pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
557 ("PowerMgr_setPowerMode, power mode = %d\n", powerMode) );
559 if ( pPowerMgr->desiredPowerModeProfile != powerMode )
561 PowerMgr_PowerMode_e previousPowerModeProfile;
562 previousPowerModeProfile = pPowerMgr->desiredPowerModeProfile;
563 pPowerMgr->desiredPowerModeProfile = powerMode;
565 if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
567 if ( pPowerMgr->psEnable == TRUE )
569 powerMgrStartAutoPowerMode(hPowerMgr);
573 the transitions of state will be done according to the events from the
574 traffic monitor - therefor abort and wait event from the traffic monitor.
578 else if ( previousPowerModeProfile == POWER_MODE_AUTO )
581 if the old power mode is AUTO and the new power mode is NOT then need
582 to disable the thresholds indications from the traffic monitor.
584 powerMgrDisableThresholdsIndications(hPowerMgr);
586 if ( pPowerMgr->psEnable == TRUE )
588 powerMgrPowerProfileConfiguration(hPowerMgr, powerMode);
594 the power mode is already configure to the module - don't need to do anything!
596 WLAN_REPORT_WARNING(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
597 ("PowerMgr_setPowerMode - desiredPowerModeProfile == thePowerMode (=%d), ABORTING!\n",
605 /****************************************************************************************
606 * PowerMgr_reloadPowerMode *
607 ****************************************************************************************
608 DESCRIPTION: Sends the current power mode configuration to the firmware.
609 INPUT: - hPowerMgr - Handle to the Power Manager
612 ****************************************************************************************/
613 void PowerMgr_reloadPowerMode(TI_HANDLE hPowerMgr)
615 PowerMgr_t * pPowerMgr = (PowerMgr_t *) hPowerMgr;
617 pPowerMgr->desiredPowerModeProfile = powerMgrGetHighestPriority(hPowerMgr);
619 if (pPowerMgr->psEnable == TRUE)
621 if (pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO)
623 powerMgrStartAutoPowerMode(hPowerMgr);
627 powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->desiredPowerModeProfile);
633 /****************************************************************************************
634 * PowerMgr_setDozeModeInAuto *
635 ****************************************************************************************
636 DESCRIPTION: Configure the doze mode (short-doze / long-doze) that auto mode will toggle between doze vs active.
637 INPUT: - hPowerMgr - Handle to the Power Manager
638 - dozeMode - the requested doze mode when Mgr is in Auto mode (short-doze / long-doze)
641 ****************************************************************************************/
642 void PowerMgr_setDozeModeInAuto(TI_HANDLE hPowerMgr, PowerMgr_PowerMode_e dozeMode)
644 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
645 PowerMgr_PowerMode_e powerMode = powerMgrGetHighestPriority(hPowerMgr);
647 /* check if we are trying to configure the same Doze mode */
648 if ( dozeMode != pPowerMgr->autoModeDozeMode )
650 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
651 ("PowerMgr_setDozeModeInAuto - autoModeDozeMode == %d \n",
654 pPowerMgr->autoModeDozeMode = dozeMode;
656 /* in case we are already in Auto mode, we have to set the wake up condition MIB */
657 if ( powerMode == POWER_MODE_AUTO )
659 if ( dozeMode == POWER_MODE_SHORT_DOZE )
661 if ( pPowerMgr->beaconListenInterval > 1 )
663 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);
667 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);
670 else /* POWER_MODE_LONG_DOZE */
672 if ( pPowerMgr->dtimListenInterval > 1 )
674 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);
678 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);
682 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
683 ("PowerMgr_setDozeModeInAuto - already in Auto\n"));
688 WLAN_REPORT_WARNING(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
689 ("PowerMgr_setDozeModeInAuto - autoModeDozeMode == %d (same same ...)\n",
694 /****************************************************************************************
695 * PowerMgr_getPowerMode *
696 ****************************************************************************************
697 DESCRIPTION: Get the current PowerMode of the PowerMgr module.
699 INPUT: - hPowerMgr - Handle to the Power Manager
701 RETURN: PowerMgr_PowerMode_e - (auto / active / short doze / long doze).\n
702 ****************************************************************************************/
703 PowerMgr_PowerMode_e PowerMgr_getPowerMode(TI_HANDLE hPowerMgr)
705 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
707 return pPowerMgr->desiredPowerModeProfile;
712 * \author Yossi Peery
713 * \date 2-August-2004\n
714 * \brief reset the power manager module due to recovry event.
716 * Function Scope \e Public.\n
718 * 1) TI_HANDLE - handle to the PowerMgr object.\n
719 * Return Value: TI_STATUS - OK on success else NOK.\n
721 * simulate the stop power save function without writing to the HW. just doing the
722 * logic parts of stop power save from the power manager to it state machine.
723 * the power controller and it state machine are reset in the whalCtrl recovry proccess.
725 TI_STATUS PowerMgr_swReset(TI_HANDLE hPowerMgr)
727 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
729 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
730 ("PowerMgr_swReset() called\n"));
733 pPowerMgr->psEnable = FALSE;
735 if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
737 powerMgrDisableThresholdsIndications(hPowerMgr);
739 os_timerStop(pPowerMgr->hOS, pPowerMgr->hRetryPsTimer);
743 TI_STATUS powerMgr_setParam(TI_HANDLE thePowerMgrHandle,
744 paramInfo_t *theParamP)
746 PowerMgr_t *pPowerMgr = (PowerMgr_t*)thePowerMgrHandle;
748 switch ( theParamP->paramType )
750 case POWER_MGR_POWER_MODE:
751 pPowerMgr->powerMngModePriority[theParamP->content.powerMngPowerMode.powerMngPriority].powerMode
752 = theParamP->content.powerMngPowerMode.PowerMode;
753 PowerMgr_setPowerMode(thePowerMgrHandle);
754 if (pPowerMgr->betEnable)
756 PowerMgrConfigBetToFw(thePowerMgrHandle, pPowerMgr->betTrafficEnable );
760 case POWER_MGR_DISABLE_PRIORITY:
761 pPowerMgr->powerMngModePriority[theParamP->content.powerMngPriority].priorityEnable = FALSE;
762 PowerMgr_setPowerMode(thePowerMgrHandle);
765 case POWER_MGR_ENABLE_PRIORITY:
766 pPowerMgr->powerMngModePriority[theParamP->content.powerMngPriority].priorityEnable = TRUE;
767 PowerMgr_setPowerMode(thePowerMgrHandle);
770 case POWER_MGR_POWER_LEVEL_PS:
771 pPowerMgr->PowerSavePowerLevel = theParamP->content.PowerSavePowerLevel;
772 /* set the power policy of the system */
773 if (pPowerMgr->psEnable && (pPowerMgr->desiredPowerModeProfile!=POWER_MODE_AUTO))
774 { /* If Connected and not in AUTO mode */
775 MacServices_powerAutho_PowerPolicyUpdate(pPowerMgr->hMacServices, pPowerMgr->PowerSavePowerLevel);
779 case POWER_MGR_POWER_LEVEL_DEFAULT:
780 pPowerMgr->defaultPowerLevel = theParamP->content.DefaultPowerLevel;
781 /* set the power policy of the system */
782 if (!pPowerMgr->psEnable)
783 { /* If not Connected */
784 MacServices_powerAutho_PowerPolicyUpdate(pPowerMgr->hMacServices, pPowerMgr->defaultPowerLevel);
788 case POWER_MGR_POWER_LEVEL_DOZE_MODE:
789 PowerMgr_setDozeModeInAuto(thePowerMgrHandle,theParamP->content.powerMngDozeMode);
790 if (pPowerMgr->betEnable)
792 PowerMgrConfigBetToFw(thePowerMgrHandle, pPowerMgr->betTrafficEnable );
797 WLAN_REPORT_ERROR(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
798 ("PowerMgr_setParam - ERROR - Param is not supported, %d\n\n",
799 theParamP->paramType));
801 return PARAM_NOT_SUPPORTED;
809 TI_STATUS powerMgr_getParam(TI_HANDLE thePowerMgrHandle,
810 paramInfo_t *theParamP)
812 PowerMgr_t *pPowerMgr = (PowerMgr_t*)thePowerMgrHandle;
814 switch ( theParamP->paramType )
816 case POWER_MGR_POWER_MODE:
817 theParamP->content.PowerMode = PowerMgr_getPowerMode(thePowerMgrHandle);
820 case POWER_MGR_POWER_LEVEL_PS:
821 theParamP->content.PowerSavePowerLevel = pPowerMgr->PowerSavePowerLevel;
824 case POWER_MGR_POWER_LEVEL_DEFAULT:
825 theParamP->content.DefaultPowerLevel = pPowerMgr->defaultPowerLevel;
828 case POWER_MGR_POWER_LEVEL_DOZE_MODE:
829 theParamP->content.powerMngDozeMode = pPowerMgr->autoModeDozeMode;
833 WLAN_REPORT_ERROR(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
834 ("PowerMgr_getParam - ERROR - Param is not supported, %d\n\n",
835 theParamP->paramType));
836 return PARAM_NOT_SUPPORTED;
843 /*****************************************************************************
844 ** Private Function prototypes **
845 *****************************************************************************/
848 /****************************************************************************************
849 * powerSaveCompleteCB *
850 ****************************************************************************************
851 DESCRIPTION: Callback for the Power server complete - gets the result of the request
854 INPUT: - hPowerMgr - Handle to the Power Manager
856 - trasStatus - result string form the FW.
859 ****************************************************************************************/
860 static void powerSaveCompleteCB(TI_HANDLE hPowerMgr,UINT8 PSMode,UINT8 transStatus)
862 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
864 WLAN_REPORT_INFORMATION( pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
865 ("powerSaveCompleteCB, statud = %d\n", transStatus) );
867 /* Handling the event*/
868 switch ( (EventsPowerSave_e)transStatus )
870 case ENTER_POWER_SAVE_FAIL:
871 case EXIT_POWER_SAVE_FAIL:
872 pPowerMgr->lastPsTransaction = transStatus;
873 os_timerStart(pPowerMgr->hOS,
874 pPowerMgr->hRetryPsTimer,
879 case ENTER_POWER_SAVE_SUCCESS:
880 if ( (pPowerMgr->lastPowerModeProfile == POWER_MODE_SHORT_DOZE) ||
881 (pPowerMgr->lastPowerModeProfile == POWER_MODE_LONG_DOZE) ||
882 (pPowerMgr->lastPowerModeProfile == POWER_MODE_PS_ONLY))
884 MacServices_powerAutho_PowerPolicyUpdate(pPowerMgr->hMacServices, pPowerMgr->PowerSavePowerLevel);
887 case EXIT_POWER_SAVE_SUCCESS:
891 WLAN_REPORT_ERROR( pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
892 ("powerSaveCompleteCB: invliad status: %d\n", transStatus) );
898 * \author Ronen Kalish\n
899 * \date 30-Aug-2006\n
900 * \brief Power manager callback fro TM event notification
902 * Function Scope \e Public.\n
903 * \param hPowerMgr - handle to the power maanger object.\n
904 * \param cookie - values supplied during event registration (active / doze).\n
906 static void PowerMgrTMThresholdCrossCB( TI_HANDLE hPowerMgr, UINT32 cookie )
908 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
910 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
911 ("PowerMgrTMThresholdCrossCB - TM notified threshold crossed, cookie: %d\n",
914 /* sanity cehcking - TM notifications should only be received when PM is enabled and in auto mode */
915 if ( (pPowerMgr->psEnable == TRUE) && (pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO) )
917 switch ((PowerMgr_PowerMode_e)cookie)
919 case POWER_MODE_ACTIVE:
920 powerMgrPowerProfileConfiguration( hPowerMgr, POWER_MODE_ACTIVE );
923 /* threshold crossed down - need to enter configured doze mode */
924 case POWER_MODE_SHORT_DOZE:
925 powerMgrPowerProfileConfiguration( hPowerMgr, pPowerMgr->autoModeDozeMode );
929 WLAN_REPORT_ERROR( pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
930 ("PowerMgrTMThresholdCrossCB: TM notification with invalid cookie: %d!\n",
937 WLAN_REPORT_ERROR( pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
938 ("PowerMgrTMThresholdCrossCB: TM motification when psEnable is :%d or desired profile is: %d\n",
939 pPowerMgr->psEnable, pPowerMgr->desiredPowerModeProfile) );
944 /****************************************************************************************
945 * powerMgrDisableThresholdsIndications *
946 *****************************************************************************************
947 DESCRIPTION: This will send a disable message to the traffic monitor,
948 to stop sending indications on threshold pass.
951 INPUT: - hPowerMgr - Handle to the Power Manager
954 ****************************************************************************************/
955 static void powerMgrDisableThresholdsIndications(TI_HANDLE hPowerMgr)
957 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
960 auto is not a static/fix state, else its a dynamic state that flows between
961 the 3 static/fix states: active, short-doze and long-doze.
963 TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
964 pPowerMgr->passToActiveTMEvent);
966 TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
967 pPowerMgr->passToDozeTMEvent);
972 /****************************************************************************************
973 * powerMgrEnableThresholdsIndications *
974 *****************************************************************************************
975 DESCRIPTION: TThis will send an enable message to the traffic monitor,
976 to start sending indications on threshold pass.
979 INPUT: - hPowerMgr - Handle to the Power Manager
982 ****************************************************************************************/
983 static void powerMgrEnableThresholdsIndications(TI_HANDLE hPowerMgr)
985 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
987 WLAN_REPORT_INFORMATION( pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
988 ("powerMgrEnableThresholdsIndications called\n") );
990 auto is not a static/fix state, but rather a dynamic state that flows between
991 the 3 static/fix states: active, short-doze and long-doze.
993 TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
994 pPowerMgr->passToActiveTMEvent);
996 TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
997 pPowerMgr->passToDozeTMEvent);
1002 /****************************************************************************************
1003 * powerMgrStartAutoPowerMode *
1004 *****************************************************************************************
1005 DESCRIPTION: configure the power manager to enter into AUTO power mode.
1006 The power manager will deside what power level will be applied
1007 acording to the traffic monitor.
1009 INPUT: - hPowerMgr - Handle to the Power Manager
1012 ****************************************************************************************/
1013 static void powerMgrStartAutoPowerMode(TI_HANDLE hPowerMgr)
1015 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1018 frameCount = TrafficMonitor_GetFrameBandwidth(pPowerMgr->hTrafficMonitor);
1020 WLAN_REPORT_INFORMATION( pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1021 ("powerMgrStartAutoPowerMode: Starting auto power mode,"
1022 "frame count=%d, TH=%d\n", frameCount, pPowerMgr->autoModeActiveTH) );
1024 /*Activates the correct profile*/
1025 if ( frameCount >= pPowerMgr->autoModeActiveTH )
1027 powerMgrPowerProfileConfiguration(hPowerMgr, POWER_MODE_ACTIVE);
1031 powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->autoModeDozeMode);
1034 /* Activates the Trafic monitoe Events*/
1035 powerMgrEnableThresholdsIndications(hPowerMgr);
1038 /****************************************************************************************
1039 * powerMgrRetryPsTimeout *
1040 *****************************************************************************************
1041 DESCRIPTION: Retry function if a PS/exit PS request failed
1043 INPUT: - hPowerMgr - Handle to the Power Manager
1046 ****************************************************************************************/
1047 static void powerMgrRetryPsTimeout(TI_HANDLE hPowerMgr)
1049 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1050 TI_STATUS powerStatus;
1052 WLAN_REPORT_INFORMATION( pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1053 ("powerMgrRetryPsTimeout: timer expired.\n") );
1055 if ( pPowerMgr->lastPsTransaction == ENTER_POWER_SAVE_FAIL )
1057 powerStatus = MacServices_powerSrv_SetPsMode(pPowerMgr->hMacServices, POWER_SAVE_ON, TRUE , hPowerMgr,powerSaveCompleteCB,NULL);/*NULL as GWSI callback*/
1058 if ( powerStatus == POWER_SAVE_802_11_IS_CURRENT )
1060 if ( (pPowerMgr->lastPowerModeProfile == POWER_MODE_SHORT_DOZE) ||
1061 (pPowerMgr->lastPowerModeProfile == POWER_MODE_LONG_DOZE) ||
1062 (pPowerMgr->lastPowerModeProfile == POWER_MODE_PS_ONLY))
1064 MacServices_powerAutho_PowerPolicyUpdate(pPowerMgr->hMacServices, pPowerMgr->PowerSavePowerLevel);
1070 powerStatus = MacServices_powerSrv_SetPsMode(pPowerMgr->hMacServices, POWER_SAVE_OFF, TRUE , hPowerMgr,powerSaveCompleteCB,NULL);/*NULL as GWSI callback*/
1076 /****************************************************************************************
1077 * powerMgrPowerProfileConfiguration *
1078 *****************************************************************************************
1079 DESCRIPTION: This function is the " builder " of the Power Save profiles.
1080 acording to the desired Power mode.
1082 INPUT: - hPowerMgr - Handle to the Power Manager
1085 ****************************************************************************************/
1086 static void powerMgrPowerProfileConfiguration(TI_HANDLE hPowerMgr, PowerMgr_PowerMode_e desiredPowerMode)
1088 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1089 TI_STATUS powerStatus;
1091 os_timerStop(pPowerMgr->hOS, pPowerMgr->hRetryPsTimer);
1093 pPowerMgr->lastPowerModeProfile = desiredPowerMode;
1095 switch ( desiredPowerMode )
1097 case POWER_MODE_AUTO:
1098 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1099 ("PowerMode==AUTO - This mode should not be sent to the GWSI - we send AUTO instead\n"));
1102 case POWER_MODE_ACTIVE:
1103 /* set AWAKE through */
1104 MacServices_powerAutho_PowerPolicyUpdate(pPowerMgr->hMacServices, POWERAUTHO_POLICY_AWAKE);
1105 powerStatus = MacServices_powerSrv_SetPsMode(pPowerMgr->hMacServices,
1109 powerSaveCompleteCB,
1111 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1112 ("PowerMode==ACTIVE\n"));
1115 case POWER_MODE_SHORT_DOZE:
1116 if ( pPowerMgr->beaconListenInterval > 1 )
1118 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);
1122 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);
1125 powerStatus = MacServices_powerSrv_SetPsMode(pPowerMgr->hMacServices,
1129 powerSaveCompleteCB,
1131 if ( powerStatus == POWER_SAVE_802_11_IS_CURRENT )
1133 MacServices_powerAutho_PowerPolicyUpdate(pPowerMgr->hMacServices, pPowerMgr->PowerSavePowerLevel);
1135 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1136 ("PowerMode==SHORT_DOZE\n"));
1139 case POWER_MODE_LONG_DOZE:
1140 if ( pPowerMgr->dtimListenInterval > 1 )
1142 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);
1146 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);
1148 powerStatus = MacServices_powerSrv_SetPsMode(pPowerMgr->hMacServices,
1152 powerSaveCompleteCB,
1154 if ( powerStatus == POWER_SAVE_802_11_IS_CURRENT )
1156 MacServices_powerAutho_PowerPolicyUpdate(pPowerMgr->hMacServices, pPowerMgr->PowerSavePowerLevel);
1159 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1160 ("PowerMode==LONG_DOZE\n"));
1163 case POWER_MODE_PS_ONLY:
1164 /* When in SG PS mode, configure the user desired wake-up condition */
1165 powerMgr_SGSetUserDesiredwakeUpCond(hPowerMgr);
1166 powerStatus = MacServices_powerSrv_SetPsMode(pPowerMgr->hMacServices,
1170 powerSaveCompleteCB,
1173 /* In PS_ONLY we will use the last powerAutho policy of SHORT or LONG DOZE or ACTIVE */
1174 if ( powerStatus == POWER_SAVE_802_11_IS_CURRENT )
1176 MacServices_powerAutho_PowerPolicyUpdate(pPowerMgr->hMacServices, pPowerMgr->PowerSavePowerLevel);
1179 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1180 ("PowerMode==PS_ONLY\n"));
1184 WLAN_REPORT_ERROR(pPowerMgr->hReport,
1185 POWER_MANAGER_MODULE_LOG,
1186 ("PowerMgr_setWakeUpConfiguration - ERROR - PowerMode - unknown parameter: %d\n",
1194 /****************************************************************************************
1195 * powerMgrSendMBXWakeUpConditions *
1196 *****************************************************************************************
1197 DESCRIPTION: Tsend configuration of the power management option that holds in the command
1198 mailbox inner sturcture.
1200 INPUT: - hPowerMgr - Handle to the Power Manager
1202 RETURN: TI_STATUS - OK on success else NOK.\n
1203 ****************************************************************************************/
1204 static TI_STATUS powerMgrSendMBXWakeUpConditions(TI_HANDLE hPowerMgr,
1205 UINT8 listenInterval,
1206 PowerMgr_TnetWakeOn_e tnetWakeupOn)
1208 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1209 whalCtrl_powerMgmtConfig_t powerMgmtConfig;
1210 TI_STATUS status = OK;
1212 powerMgmtConfig.listenInterval = listenInterval;
1213 powerMgmtConfig.tnetWakeupOn = tnetWakeupOn;
1215 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1216 ("powerMgrSendMBXWakeUpConditions: listenInterval = %d, tnetWakeupOn = %d\n",
1217 listenInterval,tnetWakeupOn));
1219 status = whalCtrl_wakeUpCondition(pPowerMgr->hWhalCtrl,
1223 WLAN_REPORT_ERROR(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1224 ("powerMgrSendMBXWakeUpConditions - Error in wae up condition IE!\n"));
1232 static TI_STATUS powerMgrNullPacketRateConfiguration(TI_HANDLE hPowerMgr)
1235 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1237 param.paramType = SITE_MGR_CURRENT_RATE_PAIR_PARAM;
1238 if ( siteMgr_getParam(pPowerMgr->hSiteMgr, ¶m) == OK )
1240 MacServices_powerSrv_SetRateModulation(pPowerMgr->hMacServices, (UINT16)param.content.siteMgrCurrentRateMask.basicRateMask);
1244 MacServices_powerSrv_SetRateModulation(pPowerMgr->hMacServices, (DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER));
1245 WLAN_REPORT_ERROR(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1246 ("powerMgrNullPacketRateConfiguration: error - faild to set rate so default was seted!\n"));
1253 static PowerMgr_PowerMode_e powerMgrGetHighestPriority(TI_HANDLE hPowerMgr)
1255 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1257 for ( index = POWER_MANAGER_MAX_PRIORITY-1;index >= 0;index-- )
1259 if ( pPowerMgr->powerMngModePriority[index].priorityEnable )
1262 return pPowerMgr->powerMngModePriority[index].powerMode;
1267 WLAN_REPORT_ERROR(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1268 ("powerMgrGetHighestPriority - error - faild to get highest priority! sefault deseired mode was returned !!!\n"));
1269 return pPowerMgr->desiredPowerModeProfile;
1272 /****************************************************************************************
1273 * PowerMgr_notifyFWReset *
1274 ****************************************************************************************
1275 DESCRIPTION: Notify the object of the power Manager about FW reset (recovery).
1276 - call PowerSrv module to Set Ps Mode
1277 - call PowerAutho Power Policy Update
1279 INPUT: - hPowerMgr - Handle to the Power Manager
1281 RETURN: TI_STATUS - OK on success else NOK.
1282 ****************************************************************************************/
1283 TI_STATUS PowerMgr_notifyFWReset(TI_HANDLE hPowerMgr)
1285 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1287 if (pPowerMgr->psEnable)
1289 if (pPowerMgr->lastPowerModeProfile == POWER_MODE_SHORT_DOZE ||
1290 pPowerMgr->lastPowerModeProfile == POWER_MODE_LONG_DOZE)
1292 powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->lastPowerModeProfile);
1299 /****************************************************************************************
1300 * PowerMgrConfigBetToFw *
1301 ****************************************************************************************
1302 DESCRIPTION: callback from TM event notification.
1303 - call PowerSrv module to Set Ps Mode
1304 - call PowerAutho Power Policy Update
1306 INPUT: - hPowerMgr - Handle to the Power Manager
1307 - BetEnable - cookie:values supplied during event registration
1310 ****************************************************************************************/
1311 static void PowerMgrConfigBetToFw( TI_HANDLE hPowerMgr, UINT32 BetEnable )
1313 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1314 UINT8 MaximumConsecutiveET;
1315 UINT32 listenInterval;
1317 UINT32 beaconInterval;
1319 PowerMgr_PowerMode_e powerMode;
1321 param.paramType = SITE_MGR_BEACON_INTERVAL_PARAM;
1322 siteMgr_getParam(pPowerMgr->hSiteMgr, ¶m);
1323 beaconInterval = param.content.beaconInterval;
1325 param.paramType = SITE_MGR_DTIM_PERIOD_PARAM;
1326 siteMgr_getParam(pPowerMgr->hSiteMgr, ¶m);
1327 dtimPeriod = param.content.siteMgrDtimPeriod;
1329 /* get actual Power Mode */
1330 if (pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO)
1332 powerMode = pPowerMgr->autoModeDozeMode;
1336 powerMode = pPowerMgr->lastPowerModeProfile;
1339 /* calc ListenInterval */
1340 if (powerMode == POWER_MODE_SHORT_DOZE)
1342 listenInterval = beaconInterval * pPowerMgr->beaconListenInterval;
1344 else if (powerMode == POWER_MODE_LONG_DOZE)
1346 listenInterval = dtimPeriod * beaconInterval * pPowerMgr->dtimListenInterval;
1350 listenInterval = beaconInterval;
1353 if (listenInterval == 0)
1355 WLAN_REPORT_WARNING(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1356 ("PowerMgrConfigBetToFw: listenInterval is ZERO\n"));
1360 /* MaximumConsecutiveET = MaximalFullBeaconReceptionInterval / MAX( BeaconInterval, ListenInterval) */
1361 MaximumConsecutiveET = pPowerMgr->maxFullBeaconInterval / listenInterval;
1363 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1364 ("PowerMgrConfigBetToFw:\n \
1366 beaconInterval = %d\n \
1367 listenInterval = %d\n \
1369 MaximumConsecutiveET = %d\n",
1374 MaximumConsecutiveET));
1376 pPowerMgr->betTrafficEnable = BetEnable; /* save BET enable flag for CLI configuration */
1378 whalCtrl_setBetParams (pPowerMgr->hWhalCtrl, BetEnable, MaximumConsecutiveET);
1384 * \date 10-April-2007\n
1385 * \brief Returns to the configured wakeup condition, when SG protective mode is done
1387 * Function Scope \e Public.\n
1389 * 1) TI_HANDLE - handle to the PowerMgr object.\n
1390 * Return Value: void.\n
1392 static void powerMgr_SGSetUserDesiredwakeUpCond( TI_HANDLE hPowerMgr )
1394 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1397 if (pPowerMgr->psEnable)
1399 /* set wakeup condition according to user mode power save profile */
1400 switch ( pPowerMgr->powerMngModePriority[ POWER_MANAGER_USER_PRIORITY ].powerMode )
1402 case POWER_MODE_AUTO:
1403 /*set wakeup condition according to doze mode in auto and wakup interval */
1404 if ( pPowerMgr->autoModeDozeMode == POWER_MODE_SHORT_DOZE )
1407 if ( pPowerMgr->beaconListenInterval > 1 )
1409 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);
1413 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);
1419 if ( pPowerMgr->dtimListenInterval > 1 )
1421 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);
1425 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);
1430 case POWER_MODE_ACTIVE:
1433 case POWER_MODE_SHORT_DOZE:
1434 if ( pPowerMgr->beaconListenInterval > 1 )
1436 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);
1440 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);
1444 case POWER_MODE_LONG_DOZE:
1445 if ( pPowerMgr->dtimListenInterval > 1 )
1447 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);
1451 powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);
1456 WLAN_REPORT_ERROR(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1457 ("powerMgr_SGExitShortDoze - ERROR - PowerMode for user prioirty is: %d\n",
1458 pPowerMgr->powerMngModePriority[ POWER_MANAGER_USER_PRIORITY ].powerMode));
1460 }/*end of if (psEnable)*/
1465 /****************************************************************************************
1466 * PowerMgr_PsPollFailureCB *
1467 ****************************************************************************************
1468 DESCRIPTION: Work around to solve AP bad behavior.
1469 Some old AP's have trouble with Ps-Poll - The solution will be to exit PS for a
1472 INPUT: - hPowerMgr - Handle to the Power Manager
1475 ****************************************************************************************/
1476 static void PowerMgr_PsPollFailureCB( TI_HANDLE hPowerMgr )
1478 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1480 if ( pPowerMgr->PsPollDeliveryFailureRecoveryPeriod )
1484 WLAN_REPORT_WARNING(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1485 ("%s Oh boy, AP is not answering Ps-Poll's. enter active PS for %d Ms\n",
1486 __FUNCTION__, pPowerMgr->PsPollDeliveryFailureRecoveryPeriod));
1488 /* Disable Soft Gemini */
1489 SoftGemini_startPsPollFailure(pPowerMgr->hSoftGemini);
1492 * Set the system to Active power save
1494 param.paramType = POWER_MGR_POWER_MODE;
1495 param.content.powerMngPowerMode.PowerMode = POWER_MODE_ACTIVE;
1496 param.content.powerMngPowerMode.powerMngPriority = POWER_MANAGER_PS_POLL_FAILURE_PRIORITY;
1497 powerMgr_setParam(hPowerMgr,¶m);
1499 param.paramType = POWER_MGR_ENABLE_PRIORITY;
1500 param.content.powerMngPriority = POWER_MANAGER_PS_POLL_FAILURE_PRIORITY;
1501 powerMgr_setParam(hPowerMgr,¶m);
1504 * Set timer to exit the active mode
1506 os_timerStart(pPowerMgr->hOS,
1507 pPowerMgr->hPsPollFailureTimer,
1508 pPowerMgr->PsPollDeliveryFailureRecoveryPeriod,
1511 else /* Work-around is disabled */
1513 WLAN_REPORT_WARNING(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1514 ("%s Oh boy, AP is not answering Ps-Poll's !!!\n",__FUNCTION__));
1519 /****************************************************************************************
1520 * powerMgr_PsPollFailureTimeout *
1521 ****************************************************************************************
1522 DESCRIPTION: After the timeout of ps-poll failure - return to normal behavior
1524 INPUT: - hPowerMgr - Handle to the Power Manager
1527 ****************************************************************************************/
1528 static void powerMgr_PsPollFailureTimeout(TI_HANDLE hPowerMgr)
1530 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1533 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1534 ("%s \n",__FUNCTION__));
1536 /* disable Ps-Poll priority */
1537 param.paramType = POWER_MGR_DISABLE_PRIORITY;
1538 param.content.powerMngPriority = POWER_MANAGER_PS_POLL_FAILURE_PRIORITY;
1539 powerMgr_setParam(hPowerMgr,¶m);
1541 /* return to normal Soft Gemini */
1542 SoftGemini_endPsPollFailure(pPowerMgr->hSoftGemini);
1545 void powerMgr_setCpuLoad(TI_HANDLE hPowerMgr, UINT32 uCpuLoad)
1549 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1551 pPowerMgr->uCpuLoad = uCpuLoad;
1552 WLAN_OS_REPORT(("\n PowerMgr_setCpuLoad - Cpu Load = %d \n",
1553 pPowerMgr->uCpuLoad));
1555 if (pPowerMgr->uCpuLoad > 0)
1557 os_timerStart(pPowerMgr->hOS,
1558 pPowerMgr->hCpuLoadTimer,
1559 RE_ENTER_CPU_LOAD_TIMEOUT,
1564 os_timerStop(pPowerMgr->hOS, pPowerMgr->hCpuLoadTimer);
1570 /****************************************************************************************
1571 * powerMgr_CpuLoadTimeout *
1572 ****************************************************************************************
1573 DESCRIPTION: After the timeout of cpu load - run in idle loop to simulate cpu load
1575 INPUT: - hPowerMgr - Handle to the Power Manager
1578 ****************************************************************************************/
1579 static void powerMgr_CpuLoadTimeout(TI_HANDLE hPowerMgr)
1581 PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
1582 UINT32 uStallTime=0;
1584 WLAN_REPORT_INFORMATION(pPowerMgr->hReport, POWER_MANAGER_MODULE_LOG,
1585 ("CpuLoadTimeout : cpu= %d\n", pPowerMgr->uCpuLoad));
1589 while(uStallTime < (pPowerMgr->uCpuLoad * CPU_LOAD_MUL))