1a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* 2a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * PowerMgrKeepAlive.c 3a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 4a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved. 5a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * All rights reserved. 6a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 7a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Redistribution and use in source and binary forms, with or without 8a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * modification, are permitted provided that the following conditions 9a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * are met: 10a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 11a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * * Redistributions of source code must retain the above copyright 12a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * notice, this list of conditions and the following disclaimer. 13a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * * Redistributions in binary form must reproduce the above copyright 14a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * notice, this list of conditions and the following disclaimer in 15a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * the documentation and/or other materials provided with the 16a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * distribution. 17a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * * Neither the name Texas Instruments nor the names of its 18a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * contributors may be used to endorse or promote products derived 19a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * from this software without specific prior written permission. 20a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 21a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 33a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 34a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 35a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 36a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \file PowerMgrKeepAlive.c 37a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief implement user keep-alive messages 38a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 39a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 40a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#define __FILE_ID__ FILE_ID_73 41a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "osTIType.h" 42a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "TWDriver.h" 43a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "STADExternalIf.h" 44a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "txCtrl_Api.h" 45a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 46a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidttypedef struct 47a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 48a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_HANDLE hTWD; 49a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_HANDLE hReport; 50a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_HANDLE hOs; 51a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_HANDLE hTxCtrl; 52a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TKeepAliveConfig tCurrentConfig; 53a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_BOOL bConnected; 54a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT8 wlanHeader[ WLAN_WITH_SNAP_QOS_HEADER_MAX_SIZE + AES_AFTER_HEADER_FIELD_SIZE ]; 55a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 wlanHeaderLength; 56a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT8 tempBuffer[ KEEP_ALIVE_TEMPLATE_MAX_LENGTH + WLAN_WITH_SNAP_QOS_HEADER_MAX_SIZE + AES_AFTER_HEADER_FIELD_SIZE ]; 57a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} TPowerMgrKL; 58a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 59a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS powerMgrKLConfigureMessage (TI_HANDLE hPowerMgrKL, TI_UINT32 uMessageIndex); 60a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 61a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 62a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn powerMgrKL_create 63a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Creates the power manager keep-alive sub-module 64a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 65a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Allocates memory for the keep-alive object 66a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 67a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hOS - handle to the os object 68a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return A handle to the power manager keep-alive sub-module 69a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa powerMgrKL_destroy, powerMgrKL_init 70a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 71a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_HANDLE powerMgrKL_create (TI_HANDLE hOS) 72a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 73a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TPowerMgrKL *pPowerMgrKL; 74a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 75a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* allocate memory for the power manager keep-alive object */ 76a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL = os_memoryAlloc (hOS, sizeof(TPowerMgrKL)); 77a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if ( NULL == pPowerMgrKL) 78a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 79a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return NULL; 80a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 81a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 82a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* store OS handle */ 83a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->hOs = hOS; 84a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 85a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return (TI_HANDLE)pPowerMgrKL; 86a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 87a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 88a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 89a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn powerMgrKL_destroy 90a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Destroys the power manager keep-alive sub-module 91a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 92a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * De-allocates keep-alive object memory 93a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 94a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hPowerMgrKL - handle to the power-manager keep-alive object 95a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 96a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa powerMgrKL_create, powerMgrKL_init 97a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 98a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid powerMgrKL_destroy (TI_HANDLE hPowerMgrKL) 99a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 100a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TPowerMgrKL *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL; 101a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 102a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryFree (pPowerMgrKL->hOs, hPowerMgrKL, sizeof(TPowerMgrKL)); 103a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 104a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 105a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 106a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn powerMgrKL_init 107a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Initailize the power manager keep-alive sub-module 108a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 109a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Stores handles to other modules 110a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 111a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hPowerMgrKL - handle to the power-manager keep-alive object 112a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hReport - handle to the report object 113a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hTWD - handle to the TWD object 114a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hTxCtrl - handle to the TX control object 115a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 116a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa powerMgrKL_destroy, powerMgrKL_create, powerMgrKL_setDefaults 117a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 118a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid powerMgrKL_init (TI_HANDLE hPowerMgrKL, 119a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TStadHandlesList *pStadHandles) 120a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 121a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TPowerMgrKL *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL; 122a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 123a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* store handles */ 124a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->hTWD = pStadHandles->hTWD; 125a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->hReport = pStadHandles->hReport; 126a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->hTxCtrl = pStadHandles->hTxCtrl; 127a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 128a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 129a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 130a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn powerMgrKL_setDefaults 131a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Set powr-manager keep-aive default initialization values 132a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 133a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Set powr-manager keep-aive default initialization values 134a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 135a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hPowerMgrKL - handle to the power-manager keep-alive object 136a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 137a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa powerMgrKL_init 138a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 139a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid powerMgrKL_setDefaults (TI_HANDLE hPowerMgrKL) 140a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 141a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TPowerMgrKL *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL; 142a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 uIndex; 143a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 144a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* mark the global enable / disable flag as enabled */ 145a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->tCurrentConfig.enaDisFlag = TI_TRUE; 146a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 147a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* mark all messages as disabled */ 148a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt for (uIndex = 0; uIndex < KEEP_ALIVE_MAX_USER_MESSAGES; uIndex++) 149a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 150a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->tCurrentConfig.templates[ uIndex ].keepAliveParams.enaDisFlag = TI_FALSE; 151a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 152a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 153a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* mark STA as disconnected */ 154a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->bConnected = TI_FALSE; 155a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 156a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 157a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 158a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn powerMgrKL_start 159a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Notifies the power-manager keep-alive upon connection to a BSS 160a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 161a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Set all configured templates to the FW 162a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 163a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hPowerMgrKL - handle to the power-manager keep-alive object 164a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK if succesful, TI_NOK otherwise 165a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa powerMgrKL_stop, powerMgrKL_setParam 166a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 167a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS powerMgrKL_start (TI_HANDLE hPowerMgrKL) 168a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 169a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TPowerMgrKL *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL; 170a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 uIndex; 171a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_STATUS status = TI_OK; 172a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 173a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* mark STA as connected */ 174a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->bConnected = TI_TRUE; 175a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 176a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* build WLAN header */ 177a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt status = txCtrlServ_buildWlanHeader (pPowerMgrKL->hTxCtrl, &(pPowerMgrKL->wlanHeader[ 0 ]), &(pPowerMgrKL->wlanHeaderLength)); 178a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 179a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* download all enabled templates to the FW (through TWD)*/ 180a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt for (uIndex = 0; uIndex < KEEP_ALIVE_MAX_USER_MESSAGES; uIndex++) 181a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 182a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 183a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * if the message is enabled (disabled messages shouldn't be configured on connection, 184a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * as they are disabled by default in the FW) */ 185a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 186a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_TRUE == pPowerMgrKL->tCurrentConfig.templates[ uIndex ].keepAliveParams.enaDisFlag) 187a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 188a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* configure keep-alive to the FW (through command builder */ 189a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt status = powerMgrKLConfigureMessage (hPowerMgrKL, uIndex); 190a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 191a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 192a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return status; 193a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 194a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 195a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 196a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn powerMgrKL_stop 197a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Notifies the power-manager keep-alive upon disconnection from a BSS 198a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 199a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Delete all configured templates from the FW and internal storage 200a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 201a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hPowerMgrKL - handle to the power-manager keep-alive object 202a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK if succesful, TI_NOK otherwise 203a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa powerMgrKL_start, powerMgrKL_setParam 204a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 205a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid powerMgrKL_stop (TI_HANDLE hPowerMgrKL, TI_BOOL bDisconnect) 206a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 207a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TPowerMgrKL *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL; 208a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 uIndex; 209a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 210a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* mark STA as disconnected */ 211a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->bConnected = TI_FALSE; 212a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 213a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* if this is a real disconnect */ 214a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_TRUE == bDisconnect) 215a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 216a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* for all congfiured messages */ 217a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt for (uIndex = 0; uIndex < KEEP_ALIVE_MAX_USER_MESSAGES; uIndex++) 218a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 219a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* mark the message as disabled */ 220a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->tCurrentConfig.templates[ uIndex ].keepAliveParams.enaDisFlag = TI_FALSE; 221a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 222a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 223a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* for roaming, don't do anything */ 224a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 225a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 226a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 227a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn powerMgrKL_setParam 228a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Handles a parametr change from user-mode 229a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 230a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Handles addition / removal of a template and global enable / disable flag 231a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 232a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hPowerMgrKL - handle to the power-manager keep-alive object 233a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param pParam - A pointer to the paramter being set 234a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK if succesful, TI_NOK otherwise 235a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa powerMgrKL_start, powerMgrKL_stop 236a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 237a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS powerMgrKL_setParam (TI_HANDLE hPowerMgrKL, paramInfo_t *pParam) 238a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 239a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TPowerMgrKL *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL; 240a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 uIndex; 241a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TKeepAliveTemplate *pNewTmpl; 242a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_STATUS status = TI_OK; 243a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 244a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_INFORMATION , "Keep-alive set param called with param type %d\n", pParam->paramType); 245a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 246a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt switch (pParam->paramType) 247a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 248a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* global keep-alive enable / disable flag */ 249a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt case POWER_MGR_KEEP_ALIVE_ENA_DIS: 250a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 251a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->tCurrentConfig.enaDisFlag = pParam->content.powerMgrKeepAliveEnaDis; 252a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return TWD_CfgKeepAliveEnaDis(pPowerMgrKL->hTWD, 253a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt (TI_UINT8)pParam->content.powerMgrKeepAliveEnaDis); 254a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt break; 255a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 256a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* keep-alive template and parameters configuration */ 257a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt case POWER_MGR_KEEP_ALIVE_ADD_REM: 258a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 259a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pNewTmpl = pParam->content.pPowerMgrKeepAliveTemplate; 260a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt uIndex = pNewTmpl->keepAliveParams.index; 261a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 262a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* if STA is connected */ 263a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_TRUE == pPowerMgrKL->bConnected) 264a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 265a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* if keep-alive is already configured for this index */ 266a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_TRUE == pPowerMgrKL->tCurrentConfig.templates[ uIndex ].keepAliveParams.enaDisFlag) 267a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 268a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* disable previous keep-alive */ 269a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->tCurrentConfig.templates[ uIndex ].keepAliveParams.enaDisFlag = TI_FALSE; 270a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt status = TWD_CfgKeepAlive (pPowerMgrKL->hTWD, &(pPowerMgrKL->tCurrentConfig.templates[ uIndex ].keepAliveParams)); 271a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_OK != status) 272a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 273a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_ERROR , "powerMgrKL_setParam: error trying to clear current template %d\n", status); 274a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return status; 275a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 276a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 277a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 278a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* copy configuration */ 279a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryCopy (pPowerMgrKL->hOs, &(pPowerMgrKL->tCurrentConfig.templates[ uIndex ]), 280a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pNewTmpl, sizeof (TKeepAliveTemplate)); 281a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 282a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* configure keep-alive to the FW (through command builder */ 283a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return powerMgrKLConfigureMessage (hPowerMgrKL, uIndex); 284a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 285a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* STA disconnected */ 286a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 287a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 288a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* copy configuration */ 289a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryCopy (pPowerMgrKL->hOs, &(pPowerMgrKL->tCurrentConfig.templates[ uIndex ]), 290a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pNewTmpl, sizeof (TKeepAliveTemplate)); 291a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 292a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return TI_OK; 293a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt break; 294a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 295a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt default: 296a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_ERROR , "power manager keep-alive: set param with unknown param type %d\n", pParam->paramType); 297a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return PARAM_NOT_SUPPORTED; 298a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt break; 299a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 300a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 301a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 302a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 303a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn powerMgrKL_getParam 304a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Handles a parametr request from user-mode 305a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 306a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Retrieves configuration 307a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 308a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hPowerMgrKL - handle to the power-manager keep-alive object 309a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param pParam - A pointer to the paramter being retrieved 310a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK if succesful, TI_NOK otherwise 311a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa powerMgrKL_start, powerMgrKL_stop 312a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 313a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS powerMgrKL_getParam (TI_HANDLE hPowerMgrKL, paramInfo_t *pParam) 314a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 315a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TPowerMgrKL *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL; 316a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 317a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_INFORMATION , "Keep-alive get param called with param type %d\n", pParam->paramType); 318a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 319a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt switch (pParam->paramType) 320a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 321a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt case POWER_MGR_KEEP_ALIVE_GET_CONFIG: 322a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 323a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->paramLength = sizeof (TKeepAliveConfig); 324a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryCopy (pPowerMgrKL->hOs, (void*)pParam->content.pPowerMgrKeepAliveConfig, 325a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt (void*)&(pPowerMgrKL->tCurrentConfig), sizeof (TKeepAliveConfig)); 326a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 327a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return TI_OK; 328a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt break; 329a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 330a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt default: 331a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_ERROR , "power manager keep-alive: get param with unknown param type %d\n", pParam->paramType); 332a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return PARAM_NOT_SUPPORTED; 333a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt break; 334a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 335a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 336a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 337a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 338a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn powerMgrKLConfigureMessage 339a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Configures keep-alive message (template and parameters) 340a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 341a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Configures a keepa-live message from internal database. 342a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 343a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hPowerMgrKL - handle to the power-manager keep-alive object 344a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param uMessageIndex - index of message to configure (from internal database) 345a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK if succesful, TI_NOK otherwise 346a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa powerMgrKL_start, powerMgrKL_setParam 347a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 348a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS powerMgrKLConfigureMessage (TI_HANDLE hPowerMgrKL, TI_UINT32 uMessageIndex) 349a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 350a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TPowerMgrKL *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL; 351a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_STATUS status = TI_OK; 352a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 353a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* if the keep-alive for this index is enabled */ 354a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_TRUE == pPowerMgrKL->tCurrentConfig.templates[ uMessageIndex ].keepAliveParams.enaDisFlag) 355a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 356a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* configure template - first the template itself */ 357a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSetTemplate tTemplate; 358a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 359a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tTemplate.type = KEEP_ALIVE_TEMPLATE; 360a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tTemplate.index = uMessageIndex; 361a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryCopy (pPowerMgrKL->hOs, &(pPowerMgrKL->tempBuffer), 362a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt &(pPowerMgrKL->wlanHeader), pPowerMgrKL->wlanHeaderLength); /* copy WLAN header - was built on connection */ 363a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryCopy (pPowerMgrKL->hOs, &(pPowerMgrKL->tempBuffer[ pPowerMgrKL->wlanHeaderLength ]), 364a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt &(pPowerMgrKL->tCurrentConfig.templates[ uMessageIndex ].msgBuffer[ 0 ]), 365a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPowerMgrKL->tCurrentConfig.templates[ uMessageIndex ].msgBufferLength); /* copy template data */ 366a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tTemplate.ptr = &(pPowerMgrKL->tempBuffer[ 0 ]); 367a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tTemplate.len = pPowerMgrKL->tCurrentConfig.templates[ uMessageIndex ].msgBufferLength + pPowerMgrKL->wlanHeaderLength; 368a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tTemplate.uRateMask = RATE_MASK_UNSPECIFIED; 369a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt status = TWD_CmdTemplate (pPowerMgrKL->hTWD, &tTemplate, NULL, NULL); 370a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_OK != status) 371a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 372a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_ERROR , "powerMgrKLConfigureMessage: error trying to set new template %d\n", status); 373a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return status; 374a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 375a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 376a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* and than the parameters */ 377a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt status = TWD_CfgKeepAlive (pPowerMgrKL->hTWD, &(pPowerMgrKL->tCurrentConfig.templates[ uMessageIndex ].keepAliveParams)); 378a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_OK != status) 379a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 380a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_ERROR , "powerMgrKLConfigureMessage: error trying to set new keep-alive params %d\n", status); 381a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return status; 382a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 383a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 384a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* keep-alive for this index is disabled - just disable it */ 385a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 386a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 387a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt status = TWD_CfgKeepAlive (pPowerMgrKL->hTWD, &(pPowerMgrKL->tCurrentConfig.templates[ uMessageIndex ].keepAliveParams)); 388a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_OK != status) 389a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 390a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_ERROR , "powerMgrKLConfigureMessage: error trying to set new keep-alive params %d\n", status); 391a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return status; 392a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 393a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 394a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 395a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return status; 396a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 397