PageRenderTime 39ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/drivers/net/wireless/tiwlan1251/common/src/core/EvHandler/EvHandler.c

http://github.com/CyanogenMod/cm-kernel
C | 348 lines | 218 code | 85 blank | 45 comment | 46 complexity | 2e44010c04c8a11714dad979fe5eb305 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. #include "IPCKernelApi.h"
  36. #include "EvHandler.h"
  37. #include "osAdapter.h"
  38. /*#include "configMgr.h"*/
  39. #ifdef EV_HANDLER_DEBUG
  40. TI_HANDLE ghEvHandler; /* for debug, remove later*/
  41. #endif
  42. /* ************************** Upper Interface **********************************/
  43. TI_HANDLE EvHandlerInit(TI_HANDLE hOs)
  44. {
  45. EV_HANDLER_STRUCT_T* pEvHandler;
  46. PTIWLN_ADAPTER_T pAdapter = (PTIWLN_ADAPTER_T) hOs;
  47. PRINT(DBG_INIT_LOUD, (" EvHandlerInit\n"));
  48. pEvHandler = os_memoryAlloc(hOs,sizeof(EV_HANDLER_STRUCT_T));
  49. os_memoryZero(hOs,pEvHandler,sizeof(EV_HANDLER_STRUCT_T));
  50. #ifdef EV_HANDLER_DEBUG
  51. ghEvHandler= pEvHandler;
  52. PRINTF(DBG_INIT_VERY_LOUD, ("EvHandlerInit: ghEvHandler set to %08X\n", ghEvHandler));
  53. #endif
  54. pEvHandler->hOs = hOs;
  55. pAdapter->hEvHandler = pEvHandler;
  56. pEvHandler->LastUMEventType = 0xFFFFFFFF;
  57. return (TI_HANDLE) pEvHandler;
  58. }
  59. UINT32 EvHandlerUnload (TI_HANDLE hEvHandler){
  60. EV_HANDLER_STRUCT_T* pEvHandler;
  61. PRINT(DBG_INIT_LOUD, (" ev_handler_unLoad\n"));
  62. pEvHandler = (EV_HANDLER_STRUCT_T *)hEvHandler;
  63. os_memoryFree(pEvHandler->hOs,pEvHandler,sizeof(EV_HANDLER_STRUCT_T));
  64. return OK;
  65. }
  66. UINT32 EvHandlerRegisterEvent(TI_HANDLE hEvHandler, PUCHAR pData, ULONG Length)
  67. {
  68. EV_HANDLER_STRUCT_T* pEvHandler;
  69. IPC_EVENT_PARAMS* pEvParams;
  70. UINT32 ModuleIndex;
  71. if( (hEvHandler==NULL) || (pData == NULL)){
  72. PRINT(DBG_INIT_ERROR, "EvHandler:EvHandlerRegisterEvent Bad Handle passed \n");
  73. return NOK;
  74. }
  75. #ifdef EV_HANDLER_DEBUG
  76. if (ghEvHandler != hEvHandler)
  77. {
  78. return NOK;
  79. }
  80. #endif
  81. pEvHandler = (EV_HANDLER_STRUCT_T*)hEvHandler;
  82. pEvParams = (IPC_EVENT_PARAMS*)pData;
  83. PRINTF(DBG_INIT_LOUD, (" EvHandlerRegisterEvent EventType = %d \n",pEvParams->uEventType));
  84. /* used to be: if ( sizeof(IPC_EVENT_PARAMS) != Length)
  85. relaxed size checking (okay if output buffer is larger) */
  86. if ( sizeof(IPC_EVENT_PARAMS) > Length)
  87. {
  88. PRINTF(DBG_INIT_ERROR, (" EvHandlerRegisterEvent Error sizeof(IPC_EVENT_PARAMS) != Length,"
  89. "%d != %d \n",sizeof(IPC_EVENT_PARAMS), (int)Length));
  90. return (UINT32)STATUS_INVALID_PARAMETER;
  91. }
  92. if( pEvParams->uEventType >= IPC_EVENT_MAX){
  93. PRINTF(DBG_INIT_ERROR, (" EvHandlerRegisterEvent Error - Invalid Event Type = %d \n",
  94. pEvParams->uEventType));
  95. return (UINT32)STATUS_INVALID_PARAMETER;
  96. }
  97. ModuleIndex = 0;
  98. while ( (pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID != NULL )
  99. && ( ModuleIndex < MAX_REGISTERED_MODULES) )
  100. {
  101. ModuleIndex++;
  102. }
  103. if(ModuleIndex == MAX_REGISTERED_MODULES)
  104. {
  105. PRINTF(DBG_INIT_WARNING, (" EvHandlerRegisterEvent %d"
  106. "Registration queue full or event already registered! %x address \n",
  107. pEvParams->uEventType,
  108. (int)(pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID)));
  109. return (UINT32)STATUS_INVALID_PARAMETER;
  110. }
  111. os_memoryCopy(pEvHandler->hOs,(UINT8*)&pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex],
  112. (UINT8*)pEvParams,Length);
  113. pEvParams->uEventID = (TI_HANDLE)&pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex];
  114. pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID = pEvParams->uEventID;
  115. PRINT(DBG_INIT_LOUD, " EvHandlerRegisterEvent Out \n");
  116. return STATUS_SUCCESS;
  117. }
  118. UINT32 EvHandlerUnRegisterEvent(TI_HANDLE hEvHandler, TI_HANDLE uEventID)
  119. {
  120. EV_HANDLER_STRUCT_T* pEvHandler;
  121. IPC_EVENT_PARAMS* pEvParams;
  122. UINT32 ModuleIndex;
  123. #ifdef EV_HANDLER_DEBUG
  124. if (ghEvHandler != hEvHandler )
  125. {
  126. return NOK;
  127. }
  128. #endif
  129. if (uEventID == NULL)
  130. {
  131. return NOK;
  132. }
  133. pEvHandler = (EV_HANDLER_STRUCT_T*)hEvHandler;
  134. pEvParams = (IPC_EVENT_PARAMS*)uEventID;
  135. PRINTF(DBG_INIT_LOUD, (" EvHandlerUnRegisterEvent EventType = %d \n",pEvParams->uEventType));
  136. if( pEvParams->uEventType >= IPC_EVENT_MAX){
  137. PRINTF(DBG_INIT_ERROR, (" EvHandlerRegisterEvent Error Event Type = %d \n",
  138. pEvParams->uEventType));
  139. return (UINT32)STATUS_INVALID_PARAMETER;
  140. }
  141. ModuleIndex = 0;
  142. while ( (pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID != pEvParams->uEventID )
  143. && ( ModuleIndex < MAX_REGISTERED_MODULES) )
  144. {
  145. ModuleIndex++;
  146. }
  147. if(ModuleIndex == MAX_REGISTERED_MODULES)
  148. {
  149. PRINTF(DBG_INIT_ERROR, (" EvHandlerUnRegisterEvent %d"
  150. "Registration queue doesn't hold this event! %x address \n",
  151. pEvParams->uEventType,
  152. (int)(pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID)));
  153. return (UINT32)STATUS_INVALID_PARAMETER;
  154. }
  155. pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID = NULL;
  156. return STATUS_SUCCESS;
  157. }
  158. /* Doesn't support pLength less than expected needed size*/
  159. UINT32 EvHandlerGetEventData(TI_HANDLE hEvHandler, PUCHAR pData, ULONG* pLength)
  160. {
  161. EV_HANDLER_STRUCT_T* pEvHandler;
  162. UINT32 HeadIndex;
  163. IPC_EV_DATA* pNewEvent;
  164. if(pData == NULL){
  165. /*PRINT(DBG_INIT_ERROR, "EvHandler:EvHandlerGetEventData Bad Handle passed \n");*/
  166. return NOK;
  167. }
  168. #ifdef EV_HANDLER_DEBUG
  169. if (ghEvHandler != hEvHandler)
  170. {
  171. return NOK;
  172. }
  173. #endif
  174. pEvHandler = (EV_HANDLER_STRUCT_T*)hEvHandler;
  175. HeadIndex = pEvHandler->SendEventArray.HeadIndex;
  176. pNewEvent = &pEvHandler->SendEventArray.Array[HeadIndex];
  177. PRINTF(DBG_INIT_LOUD, (" IPCGetEventData Getting Event = %d",
  178. pEvHandler->SendEventArray.Array[HeadIndex].EvParams.uEventType));
  179. if (pEvHandler->SendEventArray.Counter == 0)
  180. {
  181. PRINT(DBG_INIT_ERROR, "Attempting to get from empty queue");
  182. return NOK;
  183. }
  184. *pLength = sizeof(IPC_EV_DATA);
  185. os_memoryCopy(pEvHandler->hOs, pData,pNewEvent, sizeof(IPC_EV_DATA));
  186. pEvHandler->SendEventArray.HeadIndex = (HeadIndex+1) % MAX_SEND_EVENTS;
  187. pEvHandler->SendEventArray.Counter--;
  188. HeadIndex = pEvHandler->SendEventArray.HeadIndex;
  189. /* SEND SIGNAL FOR THE NEXT EVENT*/
  190. if (pEvHandler->SendEventArray.Counter != 0)
  191. {
  192. IPC_EventSend (pEvHandler->hOs,NULL,0);
  193. }
  194. PRINTF(DBG_INIT_LOUD, ("EvHandlerGetEventData: Normal Exit\n"));
  195. return STATUS_SUCCESS;
  196. }
  197. /* ************************** Upper Interface End*********************************/
  198. /* ************************** Bottom Interface **********************************/
  199. UINT32 EvHandlerSendEvent(TI_HANDLE hEvHandler, UINT32 EvType, UINT8* pData, UINT32 Length)
  200. {
  201. EV_HANDLER_STRUCT_T* pEvHandler;
  202. IPC_EV_DATA* pNewEvent;
  203. UINT32 TailIndex;
  204. UINT32 ModuleIndex=0;
  205. PRINTF(DBG_INIT_LOUD, (" EvHandlerSendEvent %d \n", EvType));
  206. if(hEvHandler == NULL){
  207. PRINT(DBG_INIT_ERROR, "EvHandlerSendEvent Bad Handle passed \n");
  208. return NOK;
  209. }
  210. #ifdef EV_HANDLER_DEBUG
  211. if (ghEvHandler != hEvHandler)
  212. {
  213. return NOK;
  214. }
  215. #endif
  216. pEvHandler = (EV_HANDLER_STRUCT_T*)hEvHandler;
  217. TailIndex = pEvHandler->SendEventArray.TailIndex;
  218. while ((ModuleIndex < MAX_REGISTERED_MODULES) && (EvType <= IPC_EVENT_MAX))
  219. {
  220. if (pEvHandler->RegistrationArray[EvType][ModuleIndex].uEventID != NULL )
  221. {
  222. if(pEvHandler->SendEventArray.Counter == MAX_SEND_EVENTS){
  223. PRINT(DBG_INIT_ERROR, " EvHandlerSendEvent Array Full u Fool! \n");
  224. return NOK;
  225. }
  226. pNewEvent = &pEvHandler->SendEventArray.Array[TailIndex];
  227. /* copy the event parameters and data to the events queue*/
  228. os_memoryCopy(pEvHandler->hOs,(UINT8*)&pNewEvent->EvParams,
  229. (UINT8*)&pEvHandler->RegistrationArray[EvType][ModuleIndex],
  230. sizeof(IPC_EVENT_PARAMS));
  231. if( Length > MAX_EVENT_DATA_SIZE ) { /* Dm: Security fix */
  232. PRINTF(DBG_INIT_ERROR, ("TI: %s Security Error\n", __FUNCTION__));
  233. return NOK;
  234. }
  235. os_memoryCopy(pEvHandler->hOs,(UINT8*)pNewEvent->uBuffer,
  236. (UINT8*)pData,Length);
  237. pNewEvent->uBufferSize = Length;
  238. if(pNewEvent->EvParams.uDeliveryType == DELIVERY_PUSH)
  239. {
  240. PRINTF(DBG_INIT_LOUD, (" EvHandlerSendEvent %d to OS \n", EvType));
  241. PRINTF(DBG_INIT_LOUD, ("EvHandlerSendEvent Matching OS Registered event found at EvType = %d,"
  242. "ModuleIndex = %d \n", EvType, ModuleIndex));
  243. IPC_EventSend (pEvHandler->hOs,(UINT8*)pNewEvent,sizeof(IPC_EV_DATA));
  244. }
  245. else {
  246. pEvHandler->LastUMEventType = EvType;
  247. pEvHandler->SendEventArray.TailIndex = (TailIndex+1) % MAX_SEND_EVENTS;
  248. pEvHandler->SendEventArray.Counter++;
  249. TailIndex = pEvHandler->SendEventArray.TailIndex;
  250. PRINTF(DBG_INIT_LOUD, (" EvHandlerSendEvent %d to User Mode \n", EvType));
  251. PRINTF(DBG_INIT_LOUD, ("EvHandlerSendEvent Matching User Mode Registered event found at EvType = %d,"
  252. "ModuleIndex = %d \n", EvType, ModuleIndex));
  253. if (pEvHandler->SendEventArray.Counter == 1)
  254. {
  255. IPC_EventSend (pEvHandler->hOs,NULL,0);
  256. }
  257. }
  258. } /* end if*/
  259. ModuleIndex++;
  260. } /* end of while*/
  261. return OK;
  262. }
  263. /* ************************** Bottom Interface End **********************************/