• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * PowerMgrKeepAlive.c
3  *
4  * Copyright(c) 1998 - 2009 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  * \file  PowerMgrKeepAlive.c
37  * \brief implement user keep-alive messages
38  */
39 
40 #define __FILE_ID__  FILE_ID_73
41 #include "osTIType.h"
42 #include "TWDriver.h"
43 #include "STADExternalIf.h"
44 #include "txCtrl_Api.h"
45 
46 typedef struct
47 {
48     TI_HANDLE           hTWD;
49     TI_HANDLE           hReport;
50     TI_HANDLE           hOs;
51     TI_HANDLE           hTxCtrl;
52     TKeepAliveConfig    tCurrentConfig;
53     TI_BOOL             bConnected;
54     TI_UINT8            wlanHeader[ WLAN_WITH_SNAP_QOS_HEADER_MAX_SIZE + AES_AFTER_HEADER_FIELD_SIZE ];
55     TI_UINT32           wlanHeaderLength;
56     TI_UINT8            tempBuffer[ KEEP_ALIVE_TEMPLATE_MAX_LENGTH + WLAN_WITH_SNAP_QOS_HEADER_MAX_SIZE + AES_AFTER_HEADER_FIELD_SIZE ];
57 } TPowerMgrKL;
58 
59 TI_STATUS powerMgrKLConfigureMessage (TI_HANDLE hPowerMgrKL, TI_UINT32 uMessageIndex);
60 
61 /**
62  * \fn     powerMgrKL_create
63  * \brief  Creates the power manager keep-alive sub-module
64  *
65  * Allocates memory for the keep-alive object
66  *
67  * \param  hOS - handle to the os object
68  * \return A handle to the power manager keep-alive sub-module
69  * \sa     powerMgrKL_destroy, powerMgrKL_init
70  */
powerMgrKL_create(TI_HANDLE hOS)71 TI_HANDLE powerMgrKL_create (TI_HANDLE hOS)
72 {
73     TPowerMgrKL     *pPowerMgrKL;
74 
75     /* allocate memory for the power manager keep-alive object */
76     pPowerMgrKL = os_memoryAlloc (hOS, sizeof(TPowerMgrKL));
77     if ( NULL == pPowerMgrKL)
78     {
79         return NULL;
80     }
81 
82     /* store OS handle */
83     pPowerMgrKL->hOs = hOS;
84 
85     return (TI_HANDLE)pPowerMgrKL;
86 }
87 
88 /**
89  * \fn     powerMgrKL_destroy
90  * \brief  Destroys the power manager keep-alive sub-module
91  *
92  * De-allocates keep-alive object memory
93  *
94  * \param  hPowerMgrKL - handle to the power-manager keep-alive object
95  * \return None
96  * \sa     powerMgrKL_create, powerMgrKL_init
97  */
powerMgrKL_destroy(TI_HANDLE hPowerMgrKL)98 void powerMgrKL_destroy (TI_HANDLE hPowerMgrKL)
99 {
100     TPowerMgrKL     *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL;
101 
102     os_memoryFree (pPowerMgrKL->hOs, hPowerMgrKL, sizeof(TPowerMgrKL));
103 }
104 
105 /**
106  * \fn     powerMgrKL_init
107  * \brief  Initailize the power manager keep-alive sub-module
108  *
109  * Stores handles to other modules
110  *
111  * \param  hPowerMgrKL - handle to the power-manager keep-alive object
112  * \param  hReport - handle to the report object
113  * \param  hTWD - handle to the TWD object
114  * \param  hTxCtrl - handle to the TX control object
115  * \return None
116  * \sa     powerMgrKL_destroy, powerMgrKL_create, powerMgrKL_setDefaults
117  */
powerMgrKL_init(TI_HANDLE hPowerMgrKL,TStadHandlesList * pStadHandles)118 void powerMgrKL_init (TI_HANDLE hPowerMgrKL,
119                       TStadHandlesList *pStadHandles)
120 {
121     TPowerMgrKL     *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL;
122 
123     /* store handles */
124     pPowerMgrKL->hTWD       = pStadHandles->hTWD;
125     pPowerMgrKL->hReport    = pStadHandles->hReport;
126     pPowerMgrKL->hTxCtrl    = pStadHandles->hTxCtrl;
127 }
128 
129 /**
130  * \fn     powerMgrKL_setDefaults
131  * \brief  Set powr-manager keep-aive default initialization values
132  *
133  * Set powr-manager keep-aive default initialization values
134  *
135  * \param  hPowerMgrKL - handle to the power-manager keep-alive object
136  * \return None
137  * \sa     powerMgrKL_init
138  */
powerMgrKL_setDefaults(TI_HANDLE hPowerMgrKL)139 void powerMgrKL_setDefaults (TI_HANDLE hPowerMgrKL)
140 {
141     TPowerMgrKL     *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL;
142     TI_UINT32       uIndex;
143 
144     /* mark the global enable / disable flag as enabled */
145     pPowerMgrKL->tCurrentConfig.enaDisFlag = TI_TRUE;
146 
147     /* mark all messages as disabled */
148     for (uIndex = 0; uIndex < KEEP_ALIVE_MAX_USER_MESSAGES; uIndex++)
149     {
150         pPowerMgrKL->tCurrentConfig.templates[ uIndex ].keepAliveParams.enaDisFlag = TI_FALSE;
151     }
152 
153     /* mark STA as disconnected */
154     pPowerMgrKL->bConnected = TI_FALSE;
155 }
156 
157 /**
158  * \fn     powerMgrKL_start
159  * \brief  Notifies the power-manager keep-alive upon connection to a BSS
160  *
161  * Set all configured templates to the FW
162  *
163  * \param  hPowerMgrKL - handle to the power-manager keep-alive object
164  * \return TI_OK if succesful, TI_NOK otherwise
165  * \sa     powerMgrKL_stop, powerMgrKL_setParam
166  */
powerMgrKL_start(TI_HANDLE hPowerMgrKL)167 TI_STATUS powerMgrKL_start (TI_HANDLE hPowerMgrKL)
168 {
169     TPowerMgrKL     *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL;
170     TI_UINT32       uIndex;
171     TI_STATUS       status = TI_OK;
172 
173     /* mark STA as connected */
174     pPowerMgrKL->bConnected = TI_TRUE;
175 
176     /* build WLAN header */
177     status = txCtrlServ_buildWlanHeader (pPowerMgrKL->hTxCtrl, &(pPowerMgrKL->wlanHeader[ 0 ]), &(pPowerMgrKL->wlanHeaderLength));
178 
179     /* download all enabled templates to the FW (through TWD)*/
180     for (uIndex = 0; uIndex < KEEP_ALIVE_MAX_USER_MESSAGES; uIndex++)
181     {
182         /*
183          * if the message is enabled (disabled messages shouldn't be configured on connection,
184          * as they are disabled by default in the FW) */
185 
186         if (TI_TRUE == pPowerMgrKL->tCurrentConfig.templates[ uIndex ].keepAliveParams.enaDisFlag)
187         {
188             /* configure keep-alive to the FW (through command builder */
189             status = powerMgrKLConfigureMessage (hPowerMgrKL, uIndex);
190         }
191     }
192     return status;
193 }
194 
195 /**
196  * \fn     powerMgrKL_stop
197  * \brief  Notifies the power-manager keep-alive upon disconnection from a BSS
198  *
199  * Delete all configured templates from the FW and internal storage
200  *
201  * \param  hPowerMgrKL - handle to the power-manager keep-alive object
202  * \return TI_OK if succesful, TI_NOK otherwise
203  * \sa     powerMgrKL_start, powerMgrKL_setParam
204  */
powerMgrKL_stop(TI_HANDLE hPowerMgrKL,TI_BOOL bDisconnect)205 void powerMgrKL_stop (TI_HANDLE hPowerMgrKL, TI_BOOL bDisconnect)
206 {
207     TPowerMgrKL     *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL;
208     TI_UINT32       uIndex;
209 
210     /* mark STA as disconnected */
211     pPowerMgrKL->bConnected = TI_FALSE;
212 
213     /* if this is a real disconnect */
214     if (TI_TRUE == bDisconnect)
215     {
216         /* for all congfiured messages */
217         for (uIndex = 0; uIndex < KEEP_ALIVE_MAX_USER_MESSAGES; uIndex++)
218         {
219             /* mark the message as disabled */
220             pPowerMgrKL->tCurrentConfig.templates[ uIndex ].keepAliveParams.enaDisFlag = TI_FALSE;
221         }
222     }
223     /* for roaming, don't do anything */
224 }
225 
226 /**
227  * \fn     powerMgrKL_setParam
228  * \brief  Handles a parametr change from user-mode
229  *
230  * Handles addition / removal of a template and global enable / disable flag
231  *
232  * \param  hPowerMgrKL - handle to the power-manager keep-alive object
233  * \param  pParam - A pointer to the paramter being set
234  * \return TI_OK if succesful, TI_NOK otherwise
235  * \sa     powerMgrKL_start, powerMgrKL_stop
236  */
powerMgrKL_setParam(TI_HANDLE hPowerMgrKL,paramInfo_t * pParam)237 TI_STATUS powerMgrKL_setParam (TI_HANDLE hPowerMgrKL, paramInfo_t *pParam)
238 {
239     TPowerMgrKL         *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL;
240     TI_UINT32           uIndex;
241     TKeepAliveTemplate  *pNewTmpl;
242     TI_STATUS           status = TI_OK;
243 
244     TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_INFORMATION , "Keep-alive set param called with param type %d\n", pParam->paramType);
245 
246     switch (pParam->paramType)
247     {
248     /* global keep-alive enable / disable flag */
249     case POWER_MGR_KEEP_ALIVE_ENA_DIS:
250 
251         pPowerMgrKL->tCurrentConfig.enaDisFlag = pParam->content.powerMgrKeepAliveEnaDis;
252         return TWD_CfgKeepAliveEnaDis(pPowerMgrKL->hTWD,
253                                       (TI_UINT8)pParam->content.powerMgrKeepAliveEnaDis);
254         break;
255 
256     /* keep-alive template and parameters configuration */
257     case POWER_MGR_KEEP_ALIVE_ADD_REM:
258 
259         pNewTmpl = pParam->content.pPowerMgrKeepAliveTemplate;
260         uIndex = pNewTmpl->keepAliveParams.index;
261 
262         /* if STA is connected */
263         if (TI_TRUE == pPowerMgrKL->bConnected)
264         {
265             /* if keep-alive is already configured for this index */
266             if (TI_TRUE == pPowerMgrKL->tCurrentConfig.templates[ uIndex ].keepAliveParams.enaDisFlag)
267             {
268                 /* disable previous keep-alive */
269                 pPowerMgrKL->tCurrentConfig.templates[ uIndex ].keepAliveParams.enaDisFlag = TI_FALSE;
270                 status = TWD_CfgKeepAlive (pPowerMgrKL->hTWD, &(pPowerMgrKL->tCurrentConfig.templates[ uIndex ].keepAliveParams));
271                 if (TI_OK != status)
272                 {
273                     TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_ERROR , "powerMgrKL_setParam: error trying to clear current template %d\n", status);
274                     return status;
275                 }
276             }
277 
278             /* copy configuration */
279             os_memoryCopy (pPowerMgrKL->hOs, &(pPowerMgrKL->tCurrentConfig.templates[ uIndex ]),
280                            pNewTmpl, sizeof (TKeepAliveTemplate));
281 
282             /* configure keep-alive to the FW (through command builder */
283             return powerMgrKLConfigureMessage (hPowerMgrKL, uIndex);
284         }
285         /* STA disconnected */
286         else
287         {
288             /* copy configuration */
289             os_memoryCopy (pPowerMgrKL->hOs, &(pPowerMgrKL->tCurrentConfig.templates[ uIndex ]),
290                            pNewTmpl, sizeof (TKeepAliveTemplate));
291         }
292         return TI_OK;
293         break;
294 
295     default:
296         TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_ERROR , "power manager keep-alive: set param with unknown param type %d\n", pParam->paramType);
297         return PARAM_NOT_SUPPORTED;
298         break;
299     }
300 }
301 
302 /**
303  * \fn     powerMgrKL_getParam
304  * \brief  Handles a parametr request from user-mode
305  *
306  * Retrieves configuration
307  *
308  * \param  hPowerMgrKL - handle to the power-manager keep-alive object
309  * \param  pParam - A pointer to the paramter being retrieved
310  * \return TI_OK if succesful, TI_NOK otherwise
311  * \sa     powerMgrKL_start, powerMgrKL_stop
312  */
powerMgrKL_getParam(TI_HANDLE hPowerMgrKL,paramInfo_t * pParam)313 TI_STATUS powerMgrKL_getParam (TI_HANDLE hPowerMgrKL, paramInfo_t *pParam)
314 {
315     TPowerMgrKL     *pPowerMgrKL = (TPowerMgrKL*)hPowerMgrKL;
316 
317     TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_INFORMATION , "Keep-alive get param called with param type %d\n", pParam->paramType);
318 
319     switch (pParam->paramType)
320     {
321     case POWER_MGR_KEEP_ALIVE_GET_CONFIG:
322 
323         pParam->paramLength = sizeof (TKeepAliveConfig);
324         os_memoryCopy (pPowerMgrKL->hOs, (void*)pParam->content.pPowerMgrKeepAliveConfig,
325                        (void*)&(pPowerMgrKL->tCurrentConfig), sizeof (TKeepAliveConfig));
326 
327         return TI_OK;
328         break;
329 
330     default:
331         TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_ERROR , "power manager keep-alive: get param with unknown param type %d\n", pParam->paramType);
332         return PARAM_NOT_SUPPORTED;
333         break;
334     }
335 }
336 
337 /**
338  * \fn     powerMgrKLConfigureMessage
339  * \brief  Configures keep-alive message (template and parameters)
340  *
341  * Configures a keepa-live message from internal database.
342  *
343  * \param  hPowerMgrKL - handle to the power-manager keep-alive object
344  * \param  uMessageIndex - index of message to configure (from internal database)
345  * \return TI_OK if succesful, TI_NOK otherwise
346  * \sa     powerMgrKL_start, powerMgrKL_setParam
347  */
powerMgrKLConfigureMessage(TI_HANDLE hPowerMgrKL,TI_UINT32 uMessageIndex)348 TI_STATUS powerMgrKLConfigureMessage (TI_HANDLE hPowerMgrKL, TI_UINT32 uMessageIndex)
349 {
350     TPowerMgrKL     *pPowerMgrKL    = (TPowerMgrKL*)hPowerMgrKL;
351     TI_STATUS       status          = TI_OK;
352 
353     /* if the keep-alive for this index is enabled */
354     if (TI_TRUE == pPowerMgrKL->tCurrentConfig.templates[ uMessageIndex ].keepAliveParams.enaDisFlag)
355     {
356         /* configure template - first the template itself */
357         TSetTemplate    tTemplate;
358 
359         tTemplate.type = KEEP_ALIVE_TEMPLATE;
360         tTemplate.index = uMessageIndex;
361         os_memoryCopy (pPowerMgrKL->hOs, &(pPowerMgrKL->tempBuffer),
362                        &(pPowerMgrKL->wlanHeader), pPowerMgrKL->wlanHeaderLength); /* copy WLAN header - was built on connection */
363         os_memoryCopy (pPowerMgrKL->hOs, &(pPowerMgrKL->tempBuffer[ pPowerMgrKL->wlanHeaderLength ]),
364                        &(pPowerMgrKL->tCurrentConfig.templates[ uMessageIndex ].msgBuffer[ 0 ]),
365                        pPowerMgrKL->tCurrentConfig.templates[ uMessageIndex ].msgBufferLength); /* copy template data */
366         tTemplate.ptr = &(pPowerMgrKL->tempBuffer[ 0 ]);
367         tTemplate.len = pPowerMgrKL->tCurrentConfig.templates[ uMessageIndex ].msgBufferLength + pPowerMgrKL->wlanHeaderLength;
368         tTemplate.uRateMask = RATE_MASK_UNSPECIFIED;
369         status = TWD_CmdTemplate (pPowerMgrKL->hTWD, &tTemplate, NULL, NULL);
370         if (TI_OK != status)
371         {
372             TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_ERROR , "powerMgrKLConfigureMessage: error trying to set new template %d\n", status);
373             return status;
374         }
375 
376         /* and than the parameters */
377         status = TWD_CfgKeepAlive (pPowerMgrKL->hTWD, &(pPowerMgrKL->tCurrentConfig.templates[ uMessageIndex ].keepAliveParams));
378         if (TI_OK != status)
379         {
380             TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_ERROR , "powerMgrKLConfigureMessage: error trying to set new keep-alive params %d\n", status);
381             return status;
382         }
383     }
384     /* keep-alive for this index is disabled - just disable it */
385     else
386     {
387         status = TWD_CfgKeepAlive (pPowerMgrKL->hTWD, &(pPowerMgrKL->tCurrentConfig.templates[ uMessageIndex ].keepAliveParams));
388         if (TI_OK != status)
389         {
390             TRACE1(pPowerMgrKL->hReport, REPORT_SEVERITY_ERROR , "powerMgrKLConfigureMessage: error trying to set new keep-alive params %d\n", status);
391             return status;
392         }
393     }
394 
395     return status;
396 }
397