PageRenderTime 58ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/drivers/net/wireless/tiwlan1251/common/src/TNETW_Driver/TNETWIF/TNETWArbiter/TNETWArbSM.c

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