1 /**************************************************************************** 2 **+-----------------------------------------------------------------------+** 3 **| |** 4 **| Copyright(c) 1998 - 2008 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 ****************************************************************************/ 35 36 /**********************************************************************************/ 37 /* */ 38 /* MODULE: PowerAuthorization.c */ 39 /* PURPOSE: PowerAuthorization implementation module */ 40 /* */ 41 /**********************************************************************************/ 42 #include "whalCtrl_api.h" 43 #include "report.h" 44 #include "MacServices_api.h" 45 #include "MacServices.h" 46 #include "PowerAuthorization.h" 47 #include "PowerAuthorization_internal.h" 48 49 /**************************************************************************** 50 * powerAutho_Create() 51 **************************************************************************** 52 * DESCRIPTION: 53 * 54 * INPUTS: hOs - the handle to the OS layer 55 * hReport - the handle to the report module 56 * hELPCtrl - the handle to the ELPCtrl module 57 * 58 * 59 * OUTPUT: the context of the PowerAuthorization module 60 * 61 * RETURNS: the context of the PowerAuthorization module (NULL if error) 62 ****************************************************************************/ 63 TI_HANDLE powerAutho_Create(TI_HANDLE hOs) 64 { 65 powerAutho_t *pObj; 66 67 pObj = os_memoryAlloc(hOs, sizeof(powerAutho_t)); 68 if (pObj == NULL) 69 { 70 WLAN_OS_REPORT(("FATAL ERROR: powerAutho_Create(): Error allocating context\n")); 71 return NULL; 72 } 73 74 os_memoryZero(hOs, pObj, sizeof(powerAutho_t)); 75 76 pObj->hOs = hOs; 77 pObj->hReport = NULL; 78 pObj->hHalCtrl = NULL; 79 80 /* set as 'before init complete' */ 81 pObj->initComplete = FALSE; 82 83 pObj->m_AwakeRequired = 0; 84 pObj->m_PowerPolicy = POWERAUTHO_POLICY_PD; 85 pObj->m_MinPowerLevel = POWERAUTHO_POLICY_PD; 86 87 return pObj; 88 } 89 90 91 /**************************************************************************** 92 * powerAutho_Destroy() 93 **************************************************************************** 94 * DESCRIPTION: 95 * 96 * INPUTS: hPowerAutho - the handle to the PowerAuthorization module. 97 * 98 * 99 * OUTPUT: 100 * 101 * RETURNS: OK 102 ****************************************************************************/ 103 int powerAutho_Destroy(TI_HANDLE hPowerAutho) 104 { 105 powerAutho_t *pPowerAutho = (powerAutho_t*)hPowerAutho; 106 107 if (pPowerAutho) 108 os_memoryFree(pPowerAutho->hOs, pPowerAutho, sizeof(powerAutho_t)); 109 110 return OK; 111 } 112 113 /**************************************************************************** 114 * powerAutho_Configure() 115 **************************************************************************** 116 * DESCRIPTION: 117 * 118 * INPUTS: hPowerAutho - the handle to the PowerAuthorization module. 119 * aPowerPolicy - the power policy to configure. 120 * 121 * 122 * OUTPUT: 123 * 124 * RETURNS: OK 125 ****************************************************************************/ 126 int powerAutho_Configure(TI_HANDLE hPowerAutho, TI_HANDLE hReport, TI_HANDLE hHalCtrl, powerAutho_PowerPolicy_e aPowerPolicy) 127 { 128 powerAutho_t *pPowerAutho = (powerAutho_t*)hPowerAutho; 129 130 pPowerAutho->m_PowerPolicy = aPowerPolicy; 131 132 pPowerAutho->m_ElpCtrl_Mode_LUT[POWERAUTHO_POLICY_AWAKE] = ELPCTRL_MODE_KEEP_AWAKE; 133 pPowerAutho->m_ElpCtrl_Mode_LUT[POWERAUTHO_POLICY_PD] = ELPCTRL_MODE_KEEP_AWAKE; 134 pPowerAutho->m_ElpCtrl_Mode_LUT[POWERAUTHO_POLICY_ELP] = ELPCTRL_MODE_NORMAL; 135 136 pPowerAutho->hReport = hReport; 137 pPowerAutho->hHalCtrl = hHalCtrl; 138 139 return OK; 140 } 141 142 /**************************************************************************** 143 * powerAutho_PowerPolicyUpdate() 144 **************************************************************************** 145 * DESCRIPTION: updates the PowerPolicy and calcs the new MinPowerPolicy of the sustem 146 * 147 * INPUTS: hMacServices - the handle to the MacServices module. 148 * aPowerPolicy - the new power policy. 149 * 150 * 151 * OUTPUT: none 152 * 153 * RETURNS: OK or NOK 154 ****************************************************************************/ 155 int MacServices_powerAutho_PowerPolicyUpdate(TI_HANDLE hMacServices, powerAutho_PowerPolicy_e aPowerPolicy) 156 { 157 powerAutho_t *pPowerAutho = (powerAutho_t*)(((MacServices_t*)hMacServices)->hPowerAutho); 158 159 WLAN_REPORT_INFORMATION (pPowerAutho->hReport,ELP_MODULE_LOG, 160 ("MacServices_powerAutho_PowerPolicyUpdate: PowerPolicy = %d\n",aPowerPolicy)); 161 162 pPowerAutho->m_PowerPolicy = aPowerPolicy; 163 164 return powerAutho_CalcMinPowerLevel(pPowerAutho); 165 } 166 167 /**************************************************************************** 168 * powerAutho_AwakeRequiredUpdate() 169 **************************************************************************** 170 * DESCRIPTION: updates the AwakeRequired and calcs the new MinPowerPolicy of the sustem 171 * 172 * INPUTS: hMacServices - the handle to the MacServices module. 173 * aAwakeRequired - the awake required parameter, 174 * can be according to the enum required or not_required. 175 * aAwakeReason - the reason that the HW is required 176 * 177 * OUTPUT: none 178 * 179 * RETURNS: OK or NOK 180 ****************************************************************************/ 181 int MacServices_powerAutho_AwakeRequiredUpdate(TI_HANDLE hMacServices, MacServices_powerAutho_AwakeRequired_e aAwakeRequired, MacServices_powerAutho_AwakeReason_e aAwakeReason) 182 { 183 powerAutho_t *pPowerAutho = (powerAutho_t*)(((MacServices_t*)hMacServices)->hPowerAutho); 184 185 if(aAwakeRequired == POWERAUTHO_AWAKE_REQUIRED) 186 { 187 pPowerAutho->m_AwakeRequired |= (1<<aAwakeReason); 188 } 189 else 190 { /* aAwakeRequired == POWERAUTHO_AWAKE_NOT_REQUIRED*/ 191 pPowerAutho->m_AwakeRequired &= ~(1<<aAwakeReason); 192 } 193 194 WLAN_REPORT_INFORMATION (pPowerAutho->hReport,ELP_MODULE_LOG, 195 ("MacServices_powerAutho_AwakeRequiredUpdate: awake required sent %d (reason %d) and the updated is %d\n", aAwakeRequired, aAwakeReason, pPowerAutho->m_AwakeRequired)); 196 197 return powerAutho_CalcMinPowerLevel(pPowerAutho); 198 } 199 200 /**************************************************************************** 201 * powerAutho_CalcMinPowerLevel() 202 **************************************************************************** 203 * DESCRIPTION: calculate the min power level 204 * 205 * INPUTS: hPowerAutho - the handle to the PowerAuthorization module. 206 * 207 * OUTPUT: none 208 * 209 * RETURNS: OK or NOK 210 ****************************************************************************/ 211 int powerAutho_CalcMinPowerLevel(TI_HANDLE hPowerAutho) 212 { 213 powerAutho_t *pPowerAutho = (powerAutho_t*)hPowerAutho; 214 powerAutho_PowerPolicy_e newMinPowerLevel; 215 216 /* calc the new MinPowerLevel */ 217 if(pPowerAutho->m_AwakeRequired > 0) 218 newMinPowerLevel = POWERAUTHO_POLICY_AWAKE; 219 else 220 newMinPowerLevel = pPowerAutho->m_PowerPolicy; 221 222 /* check if the MinPowerLevel changed */ 223 if(pPowerAutho->m_MinPowerLevel != newMinPowerLevel) 224 { 225 WLAN_REPORT_INFORMATION (pPowerAutho->hReport,ELP_MODULE_LOG, 226 ("powerAutho_CalcMinPowerLevel - new MinPowerLevel is = %d\n",newMinPowerLevel)); 227 228 pPowerAutho->m_MinPowerLevel = newMinPowerLevel; 229 230 /* we do the update of the FW only after the init complete*/ 231 if(pPowerAutho->initComplete == TRUE) 232 { 233 /* Update interface mode */ 234 whalCtrl_ElpCtrl_SetMode(pPowerAutho->hHalCtrl, pPowerAutho->m_ElpCtrl_Mode_LUT[newMinPowerLevel]); 235 236 /* Send MIB with PowerPolicy */ 237 whalCtrl_SetMinPowerLevel(pPowerAutho->hHalCtrl, newMinPowerLevel); 238 return OK; 239 } 240 } 241 242 return TNETWIF_COMPLETE; 243 } 244 245 /**************************************************************************** 246 * powerAutho_PowerPolicyUpdate() 247 **************************************************************************** 248 * DESCRIPTION: send the min power level to the FW for the first time 249 * 250 * INPUTS: hMacServices - the handle to the MacServices module. 251 * 252 * 253 * OUTPUT: none 254 * 255 * RETURNS: OK or NOK 256 ****************************************************************************/ 257 int MacServices_powerAutho_ExitFromInit(TI_HANDLE hMacServices) 258 { 259 powerAutho_t *pPowerAutho = (powerAutho_t*)(((MacServices_t*)hMacServices)->hPowerAutho); 260 whalParamInfo_t ParamInfo; 261 262 WLAN_REPORT_INFORMATION (pPowerAutho->hReport,ELP_MODULE_LOG, 263 ("MacServices_powerAutho_ExitFromInit: PowerPolicy = %d\n",pPowerAutho->m_MinPowerLevel )); 264 /* set as 'after init complete' */ 265 pPowerAutho->initComplete = TRUE; 266 267 /* Update interface mode */ 268 whalCtrl_ElpCtrl_SetMode(pPowerAutho->hHalCtrl, pPowerAutho->m_ElpCtrl_Mode_LUT[pPowerAutho->m_MinPowerLevel]); 269 270 /* Send MIB with PowerPolicy */ 271 ParamInfo.paramType = (UINT32)HAL_CTRL_MIN_POWER_LEVEL; 272 ParamInfo.paramLength = sizeof(powerAutho_PowerPolicy_e); 273 ParamInfo.content.minPowerPolicy = pPowerAutho->m_MinPowerLevel; 274 whalCtrl_SetParam(pPowerAutho->hHalCtrl, &ParamInfo); 275 276 return OK; 277 } 278 279 280 /**************************************************************************** 281 * MacServices_powerAutho_Endrecovery() 282 **************************************************************************** 283 * DESCRIPTION: initialize module after recovery 284 * 285 * INPUTS: hMacServices - the handle to the MacServices module. 286 * 287 * 288 * OUTPUT: none 289 * 290 * RETURNS: OK or NOK 291 ****************************************************************************/ 292 int powerAutho_Restart(TI_HANDLE hMacServices) 293 { 294 powerAutho_t *pPowerAutho = (powerAutho_t*)(((MacServices_t*)hMacServices)->hPowerAutho); 295 296 /* set as 'before init complete' */ 297 pPowerAutho->initComplete = FALSE; 298 299 pPowerAutho->m_PowerPolicy = POWERAUTHO_POLICY_AWAKE; 300 pPowerAutho->m_MinPowerLevel = POWERAUTHO_POLICY_AWAKE; 301 302 return pPowerAutho->m_MinPowerLevel; 303 } 304 305 306 /**************************************************************************** 307 * MacServices_powerAutho_Endrecovery() 308 **************************************************************************** 309 * DESCRIPTION: updates the PowerPolicy and calcs the new MinPowerPolicy of the sustem 310 * 311 * INPUTS: hMacServices - the handle to the MacServices module. 312 * 313 * 314 * OUTPUT: none 315 * 316 * RETURNS: OK or NOK 317 ****************************************************************************/ 318 int MacServices_powerAutho_EndRecovery(TI_HANDLE hMacServices) 319 { 320 powerAutho_t *pPowerAutho = (powerAutho_t*)(((MacServices_t*)hMacServices)->hPowerAutho); 321 322 WLAN_REPORT_INFORMATION (pPowerAutho->hReport,ELP_MODULE_LOG, 323 ("MacServices_powerAutho_Endrecovery: PowerPolicy = %d\n",pPowerAutho->m_PowerPolicy)); 324 325 return powerAutho_CalcMinPowerLevel(pPowerAutho); 326 } 327 328 329