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: GWSI_Synchronizer.c
39 * PURPOSE: GWSI Synchronizer used to synchronize between the CMD,INT,TX
40 *
41 ****************************************************************************/
42
43 #include "commonTypes.h"
44 #include "memMngrEx.h" /* MSDU */
45 #include "report.h"
46 #include "nrfsm.h"
47
48
49 /* First the GWSI interface needs the HAL definitions to use them in its API */
50 #include "TNETWIF.h"
51 #include "TNETWArb.h"
52 #include "ElpCtrl.h"
53 #include "whalHwAccess.h"
54
55 #undef BUS_GUARD_SUPPORT
56
57
58 /***********************************************************************************
59 Internal TNWTW Arbiter SM Module Internal function use
60 **************************************************************************************/
61 static TI_STATUS TNETWArbSM_SeizeBusOnStart (TI_HANDLE hTNETWArbSM);
62 static TI_STATUS TNETWArbSM_SeizeBusOnHwAvail (TI_HANDLE hTNETWArbSM);
63 static TI_STATUS TNETWArbSM_SeizeBus (TI_HANDLE hTNETWArbSM, BOOL bHwAvail);
64 static TI_STATUS TNETWArbSM_ReturnPendingOnStart (TI_HANDLE hTNETWArbSM);
65 static TI_STATUS TNETWArbSM_ReturnPendingOnHwAvail (TI_HANDLE hTNETWArbSM);
66 static TI_STATUS TNETWArbSM_WakeHw (TI_HANDLE hTNETWArbSM);
67 static TI_STATUS TNETWArbSM_RunClientCb (TI_HANDLE hTNETWArbSM);
68 static TI_STATUS TNETWArbSM_ReseizeBus (TI_HANDLE hTNETWArbSM);
69 static TI_STATUS TNETWArbSM_PutSleepHw (TI_HANDLE hTNETWArbSM);
70 static TI_STATUS TNETWArbSM_WaitIRQHw (TI_HANDLE hTNETWArbSM);
71 static TI_STATUS TNETWArbSM_ExitWakeUp (TI_HANDLE hTNETWArbSM);
72 static TI_STATUS TNETWArbSM_ReleaseBus (TI_HANDLE hTNETWArbSM);
73 static TI_STATUS TNETWArbSM_DoNothing (TI_HANDLE hTNETWArbSM);
74 static TI_STATUS TNETWArbSM_ActionUnexpected (TI_HANDLE hTNETWArbSM);
75
76 #if defined(BUS_GUARD_SUPPORT)
77 static void TNETWArbSM_BusAvailCB (TI_HANDLE hTNETWArbSM);
78 #endif
79
80
81 /*****************************************************************************
82 ** Public Function prototypes **
83 *****************************************************************************/
84
85 /**
86 * \author Yossi Peery
87 * \date 15-May-2005\n
88 * \brief Creates the object of the PowerSrv.
89 *
90 * Function Scope \e Public.\n
91 * Parameters:\n
92 * 1) TI_HANDLE - handle to the OS.\n
93 * Return Value: TI_HANDLE - handle to the PowerSrv object.\n
94 */
TNETWArbSM_Create(TI_HANDLE hOs)95 TI_HANDLE TNETWArbSM_Create (TI_HANDLE hOs)
96 {
97 TNETWArbSM_t *pTNETWArbSM = NULL;
98 TI_STATUS status;
99
100 pTNETWArbSM = (TNETWArbSM_t*) os_memoryAlloc (hOs, sizeof(TNETWArbSM_t));
101 if (pTNETWArbSM == NULL)
102 {
103 WLAN_OS_REPORT(("%s(%d) - Memory Allocation Error!\n",__FILE__,__LINE__));
104 return NULL;
105 }
106
107 os_memoryZero (hOs, pTNETWArbSM, sizeof(TNETWArbSM_t));
108
109 pTNETWArbSM->hOS = hOs;
110
111 status = nrfsm_Create (hOs, &pTNETWArbSM->hFSM, TNETWARB_SM_STATE_NUM, TNETWARBSM_EVENT_NUM);
112 if (status != OK)
113 {
114 WLAN_OS_REPORT(("%s(%d) - Error in create FSM!\n",__FILE__,__LINE__));
115 TNETWArbSM_Destroy(pTNETWArbSM);
116 return NULL;
117 }
118
119 return pTNETWArbSM;
120 }
121
122
123 /**
124 * \author Yossi Peery
125 * \date 15-May-2005\n
126 * \brief Destroy the object of the PowerSrvSM.
127 *
128 * Function Scope \e Public.\n
129 * Parameters:\n
130 * 1) TI_HANDLE - handle to the PowerSrv object.\n
131 * Return Value: TI_STATUS - OK on success else NOK.\n
132 */
TNETWArbSM_Destroy(TI_HANDLE hTNETWArbSM)133 TI_STATUS TNETWArbSM_Destroy (TI_HANDLE hTNETWArbSM)
134 {
135 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
136 TI_HANDLE hOs = pTNETWArbSM->hOS;
137
138 if (pTNETWArbSM->hFSM != NULL)
139 {
140 nrfsm_Unload (pTNETWArbSM->hFSM);
141 }
142
143 os_memoryFree (hOs, pTNETWArbSM, sizeof(TNETWArbSM_t));
144
145 WLAN_OS_REPORT (("%s(%d) - TNETWArbSM destroyed\n", __FILE__, __LINE__));
146
147 return OK;
148 }
149
150
151 /**
152 * \date 15-May-2005\n
153 * \brief Initialize the PowerSrvSM module.
154 *
155 * Function Scope \e Public.\n
156 * Parameters:\n
157 * 1) TI_HANDLE - handle to the PowerSrvSM object.\n
158 * 2) TI_HANDLE - handle to the Report object.
159 * 3) TI_HANDLE - handle to the whalCtrl object.
160 * 4) TI_HANDLE - handle to the QosMgr object.
161 * 5) TI_HANDLE - handle to the Mlme object.
162 * 6) TI_HANDLE - handle to the SiteMgr object.
163 * 7) PowerSrvInitParams_t - the Power Server initialize parameters.\n
164 * Return Value: TI_STATUS - OK on success else NOK.\n
165 */
TNETWArbSM_Init(TI_HANDLE hTNETWArbSM,TI_HANDLE hReport,TI_HANDLE hTNETWArb,TI_HANDLE hELPCtrl,TI_HANDLE hBusArbiter)166 TI_STATUS TNETWArbSM_Init (TI_HANDLE hTNETWArbSM, TI_HANDLE hReport, TI_HANDLE hTNETWArb, TI_HANDLE hELPCtrl, TI_HANDLE hBusArbiter)
167 {
168 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
169
170 nrfsm_action_cell_t smMatrix[TNETWARB_SM_STATE_NUM][TNETWARBSM_EVENT_NUM] =
171 {
172 /*
173 * State [TNETWARBSM_STATE_IDLE]
174 */
175 {
176 /* {TNETWARBSM_EV_START} -> TNETWARBSM_STATE_WAIT_BUS */
177 {TNETWARBSM_STATE_WAIT_BUS , TNETWArbSM_SeizeBusOnStart},
178
179 /* {TNETWARBSM_EV_BUS_AVAIL} -> TNETWARBSM_STATE_IDLE */
180 {TNETWARBSM_STATE_IDLE , TNETWArbSM_ActionUnexpected},
181
182 /* {TNETWARBSM_EV_HW_AVAIL} -> TNETWARBSM_STATE_IDLE */
183 {TNETWARBSM_STATE_WAIT_BUS , TNETWArbSM_SeizeBusOnHwAvail},
184
185 /* {TNETWARBSM_EV_RESTART} -> TNETWARBSM_STATE_IDLE */
186 {TNETWARBSM_STATE_WAIT_BUS , TNETWArbSM_ReseizeBus},
187
188 /* {TNETWARBSM_EV_FINISH} -> TNETWARBSM_STATE_IDLE */
189 {TNETWARBSM_STATE_IDLE , TNETWArbSM_ActionUnexpected},
190
191 /* {TNETWARBSM_EV_TXN_CMPLT} -> TNETWARBSM_STATE_IDLE */
192 {TNETWARBSM_STATE_IDLE , TNETWArbSM_ActionUnexpected}
193 },
194
195 /*
196 * State [TNETWARBSM_STATE_WAIT_BUS]
197 */
198 {
199 /* {TNETWARBSM_EV_START} -> TNETWARBSM_STATE_WAIT_BUS */
200 {TNETWARBSM_STATE_WAIT_BUS , TNETWArbSM_ReturnPendingOnStart},
201
202 /* {TNETWARBSM_EV_BUS_AVAIL} -> TNETWARBSM_STATE_WAIT_HW */
203 {TNETWARBSM_STATE_WAIT_HW , TNETWArbSM_WakeHw},
204
205 /* {TNETWARBSM_EV_HW_AVAIL} -> TNETWARBSM_STATE_WAIT_BUS */
206 {TNETWARBSM_STATE_WAIT_BUS , TNETWArbSM_ReturnPendingOnHwAvail},
207
208 /* {TNETWARBSM_EV_RESTART} -> TNETWARBSM_STATE_WAIT_BUS */
209 {TNETWARBSM_STATE_WAIT_BUS , TNETWArbSM_ActionUnexpected},
210
211 /* {TNETWARBSM_EV_FINISH} -> TNETWARBSM_STATE_WAIT_BUS */
212 {TNETWARBSM_STATE_WAIT_BUS , TNETWArbSM_ActionUnexpected},
213
214 /* {TNETWARBSM_EV_TXN_CMPLT} -> TNETWARBSM_STATE_WAIT_BUS */
215 {TNETWARBSM_STATE_WAIT_BUS , TNETWArbSM_ActionUnexpected}
216 },
217
218 /*
219 * State [TNETWARBSM_STATE_WAIT_HW]
220 */
221 {
222 /* {TNETWARBSM_EV_START} -> TNETWARBSM_STATE_WAIT_HW */
223 {TNETWARBSM_STATE_WAIT_HW , TNETWArbSM_ReturnPendingOnStart},
224
225 /* {TNETWARBSM_EV_BUS_AVAIL} -> TNETWARBSM_STATE_WAIT_HW */
226 {TNETWARBSM_STATE_WAIT_HW , TNETWArbSM_DoNothing},
227
228 /* {TNETWARBSM_EV_HW_AVAIL} -> TNETWARBSM_STATE_WAIT_TXN1 */
229 {TNETWARBSM_STATE_WAIT_TXN1 , TNETWArbSM_ExitWakeUp},
230
231 /* {TNETWARBSM_EV_RESTART} -> TNETWARBSM_STATE_WAIT_HW */
232 {TNETWARBSM_STATE_WAIT_HW , TNETWArbSM_ActionUnexpected},
233
234 /* {TNETWARBSM_EV_FINISH} -> TNETWARBSM_STATE_WAIT_HW */
235 {TNETWARBSM_STATE_WAIT_HW , TNETWArbSM_ActionUnexpected},
236
237 /* {TNETWARBSM_EV_TXN_CMPLT} -> TNETWARBSM_STATE_WAIT_TXN1 */
238 {TNETWARBSM_STATE_WAIT_TXN1 , TNETWArbSM_WaitIRQHw}
239 },
240
241 /*
242 * State [TNETWARBSM_STATE_WAIT_BUS_AFTER_HW]
243 */
244 {
245 /* {TNETWARBSM_EV_START} -> TNETWARBSM_STATE_WAIT_HW */
246 {TNETWARBSM_STATE_WAIT_BUS_AFTER_HW , TNETWArbSM_ReturnPendingOnStart},
247
248 /* {TNETWARBSM_EV_BUS_AVAIL} -> TNETWARBSM_STATE_WAIT_TXN1 */
249 {TNETWARBSM_STATE_WAIT_TXN1 , TNETWArbSM_WaitIRQHw},
250
251 /* {TNETWARBSM_EV_HW_AVAIL} -> TNETWARBSM_STATE_RUNNING */
252 {TNETWARBSM_STATE_WAIT_BUS_AFTER_HW , TNETWArbSM_ReturnPendingOnHwAvail},
253
254 /* {TNETWARBSM_EV_RESTART} -> TNETWARBSM_STATE_WAIT_HW */
255 {TNETWARBSM_STATE_WAIT_BUS_AFTER_HW , TNETWArbSM_ActionUnexpected},
256
257 /* {TNETWARBSM_EV_FINISH} -> TNETWARBSM_STATE_WAIT_HW */
258 {TNETWARBSM_STATE_WAIT_BUS_AFTER_HW , TNETWArbSM_ActionUnexpected},
259
260 /* {TNETWARBSM_EV_TXN_CMPLT} -> TNETWARBSM_STATE_WAIT_BUS_AFTER_HW */
261 {TNETWARBSM_STATE_WAIT_BUS_AFTER_HW , TNETWArbSM_ActionUnexpected}
262 },
263
264 /*
265 * State [TNETWARBSM_STATE_WAIT_TXN1]
266 */
267 {
268 /* {TNETWARBSM_EV_START} -> TNETWARBSM_STATE_WAIT_TXN1 */
269 {TNETWARBSM_STATE_WAIT_TXN1 , TNETWArbSM_ReturnPendingOnStart},
270
271 /* {TNETWARBSM_EV_BUS_AVAIL} -> TNETWARBSM_STATE_WAIT_TXN1 */
272 {TNETWARBSM_STATE_WAIT_TXN1 , TNETWArbSM_ActionUnexpected},
273
274 /* {TNETWARBSM_EV_HW_AVAIL} -> TNETWARBSM_STATE_RUNNING */
275 {TNETWARBSM_STATE_RUNNING , TNETWArbSM_RunClientCb},
276
277 /* {TNETWARBSM_EV_RESTART} -> TNETWARBSM_STATE_WAIT_TXN1 */
278 {TNETWARBSM_STATE_WAIT_TXN1 , TNETWArbSM_ActionUnexpected},
279
280 /* {TNETWARBSM_EV_FINISH} -> TNETWARBSM_STATE_WAIT_TXN1 */
281 {TNETWARBSM_STATE_WAIT_TXN1 , TNETWArbSM_ActionUnexpected},
282
283 /* {TNETWARBSM_EV_TXN_CMPLT} -> TNETWARBSM_STATE_RUNNING */
284 {TNETWARBSM_STATE_RUNNING , TNETWArbSM_RunClientCb}
285 },
286
287 /*
288 * State [TNETWARBSM_STATE_RUNNING]
289 */
290 {
291 /* {TNETWARBSM_EV_START} -> TNETWARBSM_STATE_RUNNING */
292 {TNETWARBSM_STATE_RUNNING , TNETWArbSM_ReturnPendingOnStart},
293
294 /* {TNETWARBSM_EV_BUS_AVAIL} -> TNETWARBSM_STATE_RUNNING */
295 {TNETWARBSM_STATE_RUNNING , TNETWArbSM_ActionUnexpected},
296
297 /* {TNETWARBSM_EV_HW_AVAIL} -> TNETWARBSM_STATE_RUNNING */
298 {TNETWARBSM_STATE_RUNNING , TNETWArbSM_ReturnPendingOnHwAvail},
299
300 /* {TNETWARBSM_EV_RESTART} -> TNETWARBSM_STATE_WAIT_BUS */
301 {TNETWARBSM_STATE_WAIT_BUS , TNETWArbSM_ReseizeBus},
302
303 /* {TNETWARBSM_EV_FINISH} -> TNETWARBSM_STATE_IDLE */
304 {TNETWARBSM_STATE_WAIT_TXN2 , TNETWArbSM_PutSleepHw},
305
306 /* {TNETWARBSM_EV_TXN_CMPLT} -> TNETWARBSM_STATE_RUNNING */
307 {TNETWARBSM_STATE_RUNNING , TNETWArbSM_ActionUnexpected}
308 },
309
310 /*
311 * State [TNETWARBSM_STATE_WAIT_TXN2]
312 */
313 {
314 /* {TNETWARBSM_EV_START} -> TNETWARBSM_STATE_WAIT_TXN2 */
315 {TNETWARBSM_STATE_WAIT_TXN2 , TNETWArbSM_ReturnPendingOnStart},
316
317 /* {TNETWARBSM_EV_BUS_AVAIL} -> TNETWARBSM_STATE_WAIT_TXN2 */
318 {TNETWARBSM_STATE_WAIT_TXN2 , TNETWArbSM_ActionUnexpected},
319
320 /* {TNETWARBSM_EV_HW_AVAIL} -> TNETWARBSM_STATE_WAIT_TXN2 */
321 {TNETWARBSM_STATE_WAIT_TXN2 , TNETWArbSM_ReturnPendingOnHwAvail},
322
323 /* {TNETWARBSM_EV_RESTART} -> TNETWARBSM_STATE_WAIT_TXN2 */
324 {TNETWARBSM_STATE_WAIT_TXN2 , TNETWArbSM_ActionUnexpected},
325
326 /* {TNETWARBSM_EV_FINISH} -> TNETWARBSM_STATE_WAIT_TXN2 */
327 {TNETWARBSM_STATE_WAIT_TXN2 , TNETWArbSM_ActionUnexpected},
328
329 /* {TNETWARBSM_EV_TXN_CMPLT} -> TNETWARBSM_STATE_IDLE */
330 {TNETWARBSM_STATE_IDLE , TNETWArbSM_ReleaseBus}
331 },
332 };
333
334 nrfsm_Config (pTNETWArbSM->hFSM,
335 (nrfsm_matrix_t)smMatrix,
336 TNETWARB_SM_STATE_NUM,
337 TNETWARBSM_EVENT_NUM);
338
339 pTNETWArbSM->hReport = hReport;
340 pTNETWArbSM->hELPCtrl = hELPCtrl;
341 pTNETWArbSM->hBusArbiter = hBusArbiter;
342 pTNETWArbSM->hTNETWArb = hTNETWArb;
343
344 /* TNETWArbSM start in IDLE State (No one is running in the TNETW Arbiter) */
345 nrfsm_SetState (pTNETWArbSM->hFSM, TNETWARBSM_STATE_IDLE);
346
347 WLAN_REPORT_INIT (pTNETWArbSM->hReport, TNETW_ARBITER_MODULE_LOG, ("TNETWArbSM Initialized\n"));
348
349 return OK;
350 }
351
352 #define TNETWArbSM_SMEvent__(hSm,ev) \
353 (nrfsm_Event (((TNETWArbSM_t*)hSm)->hFSM, ((TNETWArbSM_t*)hSm)->event = ev, hSm) == OK) \
354 ? ((TNETWArbSM_t*)hSm)->SMlastOperationStatus \
355 : TNETWIF_PENDING
356
357
358 /**
359 * \date 26-Oct-2005\n
360 * \brief trigger events from the outside of the module into the state machine.
361 *
362 * Function Scope \e Public.\n
363 * Parameters:\n
364 * 1) TI_HANDLE - handle to the TNETWArbSMf object.\n
365 * 2) TnetwArbSMEvents_e - the input events to the state machine.
366 * Return Value: TI_STATUS - OK on success else NOK.\n
367 * \b Description:\n
368 * this function will trigger the fsm generic state machine function.
369 */
TNETWArbSM_SMEvent(TI_HANDLE hTNETWArbSM,TnetwArbSMEvents_e event)370 TI_STATUS TNETWArbSM_SMEvent (TI_HANDLE hTNETWArbSM, TnetwArbSMEvents_e event)
371 {
372 return TNETWArbSM_SMEvent__ (hTNETWArbSM, event);
373 }
374
375
TNETWArbSM_SeizeBusOnStart(TI_HANDLE hTNETWArbSM)376 static TI_STATUS TNETWArbSM_SeizeBusOnStart (TI_HANDLE hTNETWArbSM)
377 {
378 return TNETWArbSM_SeizeBus (hTNETWArbSM, FALSE);
379 }
380
381
TNETWArbSM_SeizeBusOnHwAvail(TI_HANDLE hTNETWArbSM)382 static TI_STATUS TNETWArbSM_SeizeBusOnHwAvail (TI_HANDLE hTNETWArbSM)
383 {
384 return TNETWArbSM_SeizeBus (hTNETWArbSM, TRUE);
385 }
386
387
388 /**
389 * \date 26-Oct-2005\n
390 * \brief trigger events from the outside of the module into the state machine.
391 *
392 * Function Scope \e Public.\n
393 * Parameters:\n
394 * 1) TI_HANDLE - handle to the TNETWArbSMf object.\n
395 * 2) TnetwArbSMEvents_e - the input events to the state machine.
396 * Return Value: TI_STATUS - OK on success else NOK.\n
397 * \b Description:\n
398 * this function will trigger the fsm generic state machine function.
399 */
TNETWArbSM_SeizeBus(TI_HANDLE hTNETWArbSM,BOOL bHwAvail)400 static TI_STATUS TNETWArbSM_SeizeBus (TI_HANDLE hTNETWArbSM, BOOL bHwAvail)
401 {
402 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
403 TI_STATUS status;
404
405 pTNETWArbSM->bHwAvail = bHwAvail;
406
407 #if defined(BUS_GUARD_SUPPORT)
408 status = BusArb_SeizeReq (pTNETWArbSM->hBusArbiter,
409 TNETWArbSM_BusAvailCB,
410 hTNETWArbSM);
411 #else
412 /* For now assume that we always have the bus */
413 status = TNETWIF_COMPLETE;
414 #endif
415
416 /* In case we took the Bus then generate the BUS_AVAIL Event to the State Machine */
417 if (status == TNETWIF_COMPLETE)
418 {
419 /* Then the status could be TNETWIF_COMPLETE at this end or also can be TNETWIF_PENDING if the HW is not Awake */
420 TNETWArbSM_SMEvent__ (hTNETWArbSM, TNETWARBSM_EV_BUS_AVAIL);
421 }
422 /* Return ERROR or PENDING to Client */
423 else
424 {
425 pTNETWArbSM->SMlastOperationStatus = TNETWIF_PENDING;
426 }
427
428 return OK;
429 }
430
431
432 /**
433 * \date 26-Oct-2005\n
434 * \brief trigger events from the outside of the module into the state machine.
435 *
436 * Function Scope \e Public.\n
437 * Parameters:\n
438 * 1) TI_HANDLE - handle to the TNETWArbSMf object.\n
439 * Return Value: TI_STATUS - OK on success else NOK.\n
440 * \b Description:\n
441 * this function will trigger the fsm generic state machine function.
442 */
443 #if defined(BUS_GUARD_SUPPORT)
TNETWArbSM_BusAvailCB(TI_HANDLE hTNETWArbSM)444 static void TNETWArbSM_BusAvailCB (TI_HANDLE hTNETWArbSM)
445 {
446 TNETWArbSM_SMEvent__ (hTNETWArbSM, TNETWARBSM_EV_BUS_AVAIL);
447 }
448 #endif
449
450
451 /**
452 * \date 26-Oct-2005\n
453 * \brief trigger events from the outside of the module into the state machine.
454 *
455 * Function Scope \e Public.\n
456 * Parameters:\n
457 * 1) TI_HANDLE - handle to the TNETWArbSMf object.\n
458 * 2) TnetwArbSMEvents_e - the input events to the state machine.
459 * Return Value: TI_STATUS - OK on success else NOK.\n
460 * \b Description:\n
461 * this function will trigger the fsm generic state machine function.
462 */
TNETWArbSM_WakeHw(TI_HANDLE hTNETWArbSM)463 static TI_STATUS TNETWArbSM_WakeHw (TI_HANDLE hTNETWArbSM)
464 {
465 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
466
467 /* Call the ELP Controller module to wake the FW */
468 switch (elpCtrl_Wake (pTNETWArbSM->hELPCtrl,pTNETWArbSM->bHwAvail))
469 {
470 case ELPCTRL_AWAKE:
471 case ELPCTRL_WLAN_RDY_COMPLETE:
472
473 TNETWArbSM_SMEvent__ (hTNETWArbSM, TNETWARBSM_EV_TXN_CMPLT);
474 break;
475
476 case ELPCTRL_WLAN_RDY:
477
478 TNETWArbSM_SMEvent__ (hTNETWArbSM, TNETWARBSM_EV_BUS_AVAIL);
479 break;
480
481 case ELPCTRL_ASLEEP:
482 case ELPCTRL_COMPLETE:
483 pTNETWArbSM->SMlastOperationStatus = TNETWIF_PENDING;
484 break;
485
486 default:
487 pTNETWArbSM->SMlastOperationStatus = TNETWIF_ERROR;
488 break;
489 }
490
491 return OK;
492 }
493
494
495 /**
496 * \date 26-Oct-2005\n
497 * \brief trigger events from the outside of the module into the state machine.
498 *
499 * Function Scope \e Public.\n
500 * Parameters:\n
501 * 1) TI_HANDLE - handle to the TNETWArbSMf object.\n
502 * Return Value: TI_STATUS - OK on success else NOK.\n
503 * \b Description:\n
504 * this function will trigger the fsm generic state machine function.
505 */
TNETWArbSM_TxnCb(TI_HANDLE hTNETWArbSM)506 void TNETWArbSM_TxnCb (TI_HANDLE hTNETWArbSM)
507 {
508 TNETWArbSM_SMEvent__ (hTNETWArbSM, TNETWARBSM_EV_TXN_CMPLT);
509 }
510
511
512 /**
513 * \date 26-Oct-2005\n
514 * \brief trigger events from the outside of the module into the state machine.
515 *
516 * Function Scope \e Public.\n
517 * Parameters:\n
518 * 1) TI_HANDLE - handle to the TNETWArbSMf object.\n
519 * 2) TnetwArbSMEvents_e - the input events to the state machine.
520 * Return Value: TI_STATUS - OK on success else NOK.\n
521 * \b Description:\n
522 * this function will do the following:
523 * 1) Dequeue from the TODO Queue the first item or process request to start
524 * 2) Set the Dequeued instance to be the Running instance
525 * 3) Call the Client callback (must be the module start_instance )
526 */
TNETWArbSM_RunClientCb(TI_HANDLE TNETWArbSM)527 static TI_STATUS TNETWArbSM_RunClientCb (TI_HANDLE TNETWArbSM)
528 {
529 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)TNETWArbSM;
530 TNETWArb_t *pTNETWArb = (TNETWArb_t *)pTNETWArbSM->hTNETWArb;
531 TNETWARB_INSTANCE_T *pTNETWARB_Inst;
532
533 /* Mark to ElpCtrl that the IRQ was received and it should get back to AWAKE */
534 elpCtrl_ReceivedIRQ (pTNETWArbSM->hELPCtrl);
535
536 /* First Dequeue the instance from the TODO Queue */
537 pTNETWARB_Inst = (TNETWARB_INSTANCE_T *)TNETWArb_Dequeue
538 (&pTNETWArb->TNETWArbiter_Queues[TODO_LIST_INDEX]);
539
540 WLAN_REPORT_INFORMATION (pTNETWArbSM->hReport,
541 TNETW_ARBITER_MODULE_LOG,
542 ("\n TNETWArbSM_ProcessToDoList: DeQueued pTNETWARB_Inst %x\n",
543 pTNETWARB_Inst));
544
545 /* If the instance is already allocated then return error to Client caller */
546 if (pTNETWARB_Inst == NULL)
547 {
548 WLAN_REPORT_ERROR (pTNETWArbSM->hReport,
549 TNETW_ARBITER_MODULE_LOG,
550 ("\nTNETWArbSM_RunClientCb: NULL instance\n"));
551
552 pTNETWArbSM->SMlastOperationStatus = TNETWIF_ERROR;
553
554 return OK;
555 }
556
557 /* Set it to be the Running instance right now */
558 pTNETWArb->TNETWArb_Running_instance = pTNETWARB_Inst;
559
560 /* Call the Client Callback that must here be the start function of the module */
561 pTNETWArbSM->SMlastOperationStatus = TNETWArb_CallClientCallback (pTNETWArbSM->hTNETWArb);
562
563 return OK;
564 }
565
566
567 /**
568 * \date 26-Oct-2005\n
569 * \brief trigger events from the outside of the module into the state machine.
570 *
571 * Function Scope \e Public.\n
572 * Parameters:\n
573 * 1) TI_HANDLE - handle to the TNETWArbSMf object.\n
574 * 2) TnetwArbSMEvents_e - the input events to the state machine.
575 * Return Value: TI_STATUS - OK on success else NOK.\n
576 * \b Description:\n
577 * this function will trigger the fsm generic state machine function.
578 */
TNETWArbSM_ReseizeBus(TI_HANDLE hTNETWArbSM)579 static TI_STATUS TNETWArbSM_ReseizeBus (TI_HANDLE hTNETWArbSM)
580 {
581 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
582 TI_STATUS status;
583
584 #if defined(BUS_GUARD_SUPPORT)
585 status = BusArb_ReseizeReq (pTNETWArbSM->hBusArbiter,
586 TNETWArbSM_BusAvailCB,
587 hTNETWArbSM);
588
589 #else
590 /* For now assume that we always have the bus */
591 status = TNETWIF_COMPLETE;
592 #endif
593
594 /* In the case we did not get the Bus now for second time then release the HW till we will get the Callback from the Bus ARbiter */
595 if (status == TNETWIF_PENDING)
596 {
597 pTNETWArbSM->SMlastOperationStatus = TNETWIF_PENDING;
598 }
599 /* If we got TNETWIF_COMPLETE then we could get the Bus Semaphore again then send the BUS_AVAIL Event */
600 else if (status == TNETWIF_COMPLETE)
601 {
602 /* Get the status again through sending the BUS_AVAIL Event to the TNETW ARbiter SM */
603 /* Then the status could be TNETWIF_COMPLETE at this end or also can be TNETWIF_PENDING if the HW is not Awake */
604 TNETWArbSM_SMEvent__ (hTNETWArbSM, TNETWARBSM_EV_BUS_AVAIL);
605 }
606 else
607 {
608 pTNETWArbSM->SMlastOperationStatus = TNETWIF_ERROR;
609 }
610
611 return OK;
612 }
613
614
615 /**
616 * \date 26-Oct-2005\n
617 * \brief trigger events from the outside of the module into the state machine.
618 *
619 * Function Scope \e Public.\n
620 * Parameters:\n
621 * 1) TI_HANDLE - handle to the TNETWArbSMf object.\n
622 * 2) TnetwArbSMEvents_e - the input events to the state machine.
623 * Return Value: TI_STATUS - OK on success else NOK.\n
624 * \b Description:\n
625 * this function will trigger the fsm generic state machine function.
626 */
TNETWArbSM_PutSleepHw(TI_HANDLE hTNETWArbSM)627 static TI_STATUS TNETWArbSM_PutSleepHw (TI_HANDLE hTNETWArbSM)
628 {
629 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
630
631 pTNETWArbSM->bHwAvail = FALSE;
632
633 /* The HW is not needed anymore then the FW can go to sleep */
634 if (elpCtrl_Sleep (pTNETWArbSM->hELPCtrl) == TNETWIF_COMPLETE)
635 {
636 return TNETWArbSM_SMEvent__ (hTNETWArbSM, TNETWARBSM_EV_TXN_CMPLT);
637
638 }
639
640 pTNETWArbSM->SMlastOperationStatus = TNETWIF_PENDING;
641
642 return OK;
643 }
644
645
TNETWArbSM_WaitIRQHw(TI_HANDLE hTNETWArbSM)646 static TI_STATUS TNETWArbSM_WaitIRQHw (TI_HANDLE hTNETWArbSM)
647 {
648 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
649
650 /* check whether IRQ is about to happen or not, depending on the ElpCtrl Mux state */
651 if ( elpCtrl_isIRQComing (pTNETWArbSM->hELPCtrl) )
652 {
653 /* Please be patient - IRQ is about to come any minute */
654 pTNETWArbSM->SMlastOperationStatus = TNETWIF_PENDING;
655 }
656 else /* No IRQ is supposed to arrive - roll SM to next position */
657 {
658 TNETWArbSM_SMEvent__ (hTNETWArbSM, TNETWARBSM_EV_HW_AVAIL);
659 }
660
661 return OK;
662 }
663
TNETWArbSM_ExitWakeUp(TI_HANDLE hTNETWArbSM)664 static TI_STATUS TNETWArbSM_ExitWakeUp (TI_HANDLE hTNETWArbSM)
665 {
666 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
667
668 /* Inform ElpCtrl that it should exit the wake up sequence */
669 if ( elpCtrl_exitWakeUpSeq (pTNETWArbSM->hELPCtrl) == ELPCTRL_AWAKE)
670 {
671 /* We are already awake - send TXN_COMPLETE to roll SM forward */
672 TNETWArbSM_SMEvent__ (hTNETWArbSM, TNETWARBSM_EV_TXN_CMPLT);
673 }
674 else /* Wait till we get TXN_COMPLETE event */
675 {
676 pTNETWArbSM->SMlastOperationStatus = TNETWIF_PENDING;
677 }
678
679 return OK;
680 }
681
TNETWArbSM_ReleaseBus(TI_HANDLE hTNETWArbSM)682 static TI_STATUS TNETWArbSM_ReleaseBus (TI_HANDLE hTNETWArbSM)
683 {
684 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
685 TNETWArb_t *pTNETWArb = (TNETWArb_t *)pTNETWArbSM->hTNETWArb;
686
687 if (TNETWArb_getfirst (&pTNETWArb->TNETWArbiter_Queues[TODO_LIST_INDEX]))
688 {
689 TNETWArbSM_SMEvent__ (hTNETWArbSM, TNETWARBSM_EV_RESTART);
690 }
691
692 else
693 {
694 /* The Bus is not needed anymore */
695 #if defined(BUS_GUARD_SUPPORT)
696 return BusArb_ReleaseReq (pTNETWArbSM->hBusArbiter, hTNETWArbSM);
697 #else
698 pTNETWArbSM->SMlastOperationStatus = TNETWIF_COMPLETE;
699 #endif
700 }
701
702 return OK;
703 }
704
705
706
707 /**
708 * \date 26-Oct-2005\n
709 * \brief trigger events from the outside of the module into the state machine.
710 *
711 * Function Scope \e Public.\n
712 * Parameters:\n
713 * 1) TI_HANDLE - handle to the TNETWArbSMf object.\n
714 * Return Value: TI_STATUS - OK on success else NOK.\n
715 * \b Description:\n
716 * this function will trigger the fsm generic state machine function.
717 */
TNETWArbSM_ReturnPendingOnStart(TI_HANDLE hTNETWArbSM)718 static TI_STATUS TNETWArbSM_ReturnPendingOnStart (TI_HANDLE hTNETWArbSM)
719 {
720 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
721
722 /*
723 * In this case return PENDING to the client
724 * meaning that the client will not run immediately.
725 * (Bus Busy/Hw not awake or other client running )
726 */
727 pTNETWArbSM->SMlastOperationStatus = TNETWIF_PENDING;
728
729 return OK;
730 }
731
732
TNETWArbSM_ReturnPendingOnHwAvail(TI_HANDLE hTNETWArbSM)733 static TI_STATUS TNETWArbSM_ReturnPendingOnHwAvail (TI_HANDLE hTNETWArbSM)
734 {
735 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
736
737 pTNETWArbSM->bHwAvail = TRUE;
738
739 pTNETWArbSM->SMlastOperationStatus = TNETWIF_PENDING;
740
741 return OK;
742 }
743
744
TNETWArbSM_DoNothing(TI_HANDLE hTNETWArbSM)745 static TI_STATUS TNETWArbSM_DoNothing (TI_HANDLE hTNETWArbSM)
746 {
747 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
748
749 pTNETWArbSM->SMlastOperationStatus = TNETWIF_PENDING;
750
751 return OK;
752 }
753
754
755 /**
756 * \date 26-Oct-2005\n
757 * \brief The Event received by the TNETW Arbiter Sm at this specific state is not expected.
758 *
759 * Function Scope \e Public.\n
760 * Parameters:\n
761 * 1) TI_HANDLE - handle to the TNETWArbSMf object.\n
762 * Return Value: TI_STATUS - TNETWIF_ERROR
763 * \b Description:\n
764 * This function will only set a Log to indicate that this event is not expected in the SM
765 */
TNETWArbSM_ActionUnexpected(TI_HANDLE hTNETWArbSM)766 TI_STATUS TNETWArbSM_ActionUnexpected (TI_HANDLE hTNETWArbSM)
767 {
768 TNETWArbSM_t *pTNETWArbSM = (TNETWArbSM_t *)hTNETWArbSM;
769 UINT32 state;
770
771 if (nrfsm_GetState (pTNETWArbSM->hFSM, &state) == OK)
772 {
773 WLAN_REPORT_ERROR (pTNETWArbSM->hReport,
774 TNETW_ARBITER_MODULE_LOG,
775 ("\nTNETWArbSM_ActionUnexpected: state=%u, event=%u\n",
776 state,
777 pTNETWArbSM->event));
778 }
779
780 pTNETWArbSM->SMlastOperationStatus = TNETWIF_ERROR;
781
782 return OK;
783 }
784