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 47 48 /* First the TNETW Arbiter interface needs the HAL definitions to use them in its API */ 49 #include "TNETWArb.h" 50 #include "TNETWIF.h" 51 52 /* Those are functions that he client can send to the GWSI Synchronizer */ 53 /* The client wants to start its process */ 54 55 /*********************************************************************************** 56 Internal Synchronizer function use 57 **************************************************************************************/ 58 59 /**************************************************************************** 60 * TNETWArb_Init() 61 **************************************************************************** 62 * DESCRIPTION: Initialize the synchronizer database. 63 * 64 * INPUTS: TI_HANDLE hOs 65 * 66 * OUTPUT: 67 * 68 * RETURNS: TI_HANDLE hTNETWArb - Handle of the TNETW Arbiter module 69 ****************************************************************************/ 70 TI_HANDLE TNETWArb_Init (TI_HANDLE hOs) 71 { 72 /* Handle to TNETW Arbiter struct */ 73 TNETWArb_t *pTNETWArb; 74 75 pTNETWArb = (TNETWArb_t *)os_memoryAlloc (hOs, sizeof(TNETWArb_t)); 76 if (pTNETWArb == NULL) 77 return NULL; 78 79 os_memoryZero (hOs, pTNETWArb, sizeof(TNETWArb_t)); 80 81 pTNETWArb->hOs = hOs; 82 83 84 85 /* Get the TNETW Arbiter SM handle */ 86 pTNETWArb->hTNETWArbSM = TNETWArbSM_Create(hOs); 87 88 return (TI_HANDLE)pTNETWArb; 89 } 90 91 92 /**************************************************************************** 93 * TNETWArb_Config() 94 **************************************************************************** 95 * DESCRIPTION: Configure the TNETWIF module 96 * 97 * INPUTS: TI_HANDLE hTNETWArb 98 * TI_HANDLE hReport 99 * TI_HANDLE hELPCtrl 100 * 101 * OUTPUT: void 102 * 103 * RETURNS: void 104 ****************************************************************************/ 105 106 void TNETWArb_Config (TI_HANDLE hTNETWArb,TI_HANDLE hReport,TI_HANDLE hELPCtrl) 107 { 108 109 /* Handle to TNETW Arbiter struct */ 110 TNETWArb_t *pTNETWArb = (TNETWArb_t *)hTNETWArb; 111 UINT8 index; 112 113 pTNETWArb->hReport = hReport; 114 115 /* Init buffer Q lists */ 116 for(index = 0 ; index < NUM_OF_TNETWARB_QUEUES ; index++) 117 { 118 TNETWArb_init_q (&(pTNETWArb->TNETWArbiter_Queues[index])); 119 } 120 121 /* CAll the TNETW Arbiter Initializeto set the buffer free and their next buffer to NULL */ 122 TNETWArb_buffer_init(&(pTNETWArb->TNETWArb_Client_Instance_Array[0][0])); 123 124 125 /* Clear the Event to dispatch bit */ 126 pTNETWArb->event_to_dispatch&=~TNETWARB_IS_EVENT_PENDING; 127 128 /* For now the Handle to theBus Arbiter is NULL */ 129 TNETWArbSM_Init(pTNETWArb->hTNETWArbSM,pTNETWArb->hReport,hTNETWArb,hELPCtrl,NULL); 130 } 131 132 133 /****************************************************************************/ 134 /* TNETWIF_Destroy() 135 **************************************************************************** 136 * DESCRIPTION: Destroy The TNETWIF Module 137 * 138 * INPUTS: 139 * 140 * OUTPUT: String the name of the Queue 141 * 142 * RETURNS: 143 ****************************************************************************/ 144 TI_STATUS TNETWArb_Destroy (TI_HANDLE hTNETWArb) 145 { 146 147 /* Handle to TNETW Arbiter struct */ 148 TNETWArb_t *pTNETWArb = (TNETWArb_t *)hTNETWArb; 149 150 151 /* Call the TNETWArb SM Destruction function */ 152 if (pTNETWArb->hTNETWArbSM) 153 TNETWArbSM_Destroy (pTNETWArb->hTNETWArbSM); 154 155 /* Free the TNETW Arbiter memory */ 156 if (pTNETWArb) 157 os_memoryFree(pTNETWArb->hOs, pTNETWArb, sizeof(TNETWArb_t)); 158 159 return OK; 160 161 } 162 163 /**************************************************************************** 164 * TNETWArb_register_handler() 165 **************************************************************************** 166 * DESCRIPTION: Register the Client Callback function to the TNETW Arbiter 167 * This function will be called in case of DMA Done i.e BusTXn Complete 168 * 169 * INPUTS: TI_HANDLE hTNETWArb 170 * UINT8 module_id 171 * TNETWIF_callback_t module_CB_Func 172 * TI_HANDLE module_handle 173 * 174 * OUTPUT: void 175 * 176 * RETURNS: void 177 ****************************************************************************/ 178 void TNETWArb_register_handler(TI_HANDLE hTNETWArb,UINT8 module_id,TNETWIF_callback_t module_CB_Func,TI_HANDLE module_handle) 179 { 180 /* Handle to TNETW Arbiter struct */ 181 TNETWArb_t *pTNETWArb = (TNETWArb_t *)hTNETWArb; 182 TNETWARB_INSTANCE_T *pTNETWARB_Inst; 183 184 /* Get the pointer to the TNETWARB_INSTANCE struct */ 185 pTNETWARB_Inst = (TNETWARB_INSTANCE_T *) (&(pTNETWArb->TNETWArb_Client_Instance_Array[module_id][BUFFER_HDR_SIZE])); 186 187 pTNETWARB_Inst->module_id = module_id; 188 pTNETWARB_Inst->instance_callback = module_CB_Func; 189 pTNETWARB_Inst->instance_handle = module_handle; 190 191 if (module_id == DEFAULT_MODULE_ID) 192 pTNETWArb->pDefInst = pTNETWARB_Inst; 193 } 194 195 196 /**************************************************************************** 197 * TNETWArb_Start() 198 **************************************************************************** 199 * DESCRIPTION: Client registration to the TNETW Arbiter whishing to have ** 200 ** access to the Bus 201 * 202 * INPUTS: TI_HANDLE hTNETWArb 203 * UINT8 module_id 204 * TI_HANDLE ClientCallBack_Handle 205 * TNETWIF_callback_t module_CB_Func 206 * 207 * OUTPUT: void 208 * 209 * RETURNS: TI_STATUS - TNETWIF_ERROR - In case that the Client is already registered to the TNETWIF 210 * TNETWIF_COMPLETE - In case that the Client callback has been immediately called 211 * TNETWIF_PENDING - In case that the Client will be called later 212 ****************************************************************************/ 213 TI_STATUS TNETWArb_Start (TI_HANDLE hTNETWArb, UINT8 module_id, TI_HANDLE ClientCallBack_Handle, TNETWIF_callback_t ClientCallBack_Func) 214 { 215 /* Handle to TNETW Arbiter struct */ 216 TNETWArb_t *pTNETWArb = (TNETWArb_t *)hTNETWArb; 217 TNETWARB_INSTANCE_T *pTNETWARB_Inst; 218 TI_STATUS ret; 219 220 WLAN_REPORT_INFORMATION (pTNETWArb->hReport, TNETW_ARBITER_MODULE_LOG, 221 ("\n TNETWArb_Start: Register START to Synchronizer from module_id %x \n",module_id)); 222 223 #ifdef TI_DBG 224 pTNETWArb->stat.uStart ++; 225 #endif 226 227 /* Get the instance buffer matching to the module_id */ 228 pTNETWARB_Inst = (TNETWARB_INSTANCE_T *) TNETWArb_getpoolbuf(hTNETWArb,module_id); 229 230 /* If the instance is already allocated then return error to Client caller */ 231 if(pTNETWARB_Inst == NULL) 232 { 233 WLAN_REPORT_ERROR(pTNETWArb->hReport,TNETW_ARBITER_MODULE_LOG,("\n TNETWArb_Start Module %s Already requested TNETWIF!!!! \n", TNETWIF_ModuleIdToString(module_id))); 234 TNETWIF_printErrorLog(); 235 return TNETWIF_ERROR; 236 } 237 238 TNETWArb_Enqueue (&(pTNETWArb->TNETWArbiter_Queues[TODO_LIST_INDEX]), (void*)pTNETWARB_Inst); 239 240 WLAN_REPORT_INFORMATION(pTNETWArb->hReport,TNETW_ARBITER_MODULE_LOG,("TNETWArb_Start: Enqueue in TODO: module %s, pTNETWARB_Inst %x instance_handle: %X\n", TNETWIF_ModuleIdToString(module_id), pTNETWARB_Inst,ClientCallBack_Handle)); 241 242 /* Fill the Client instance with the callback handle and function passed in the call */ 243 pTNETWARB_Inst->module_id = module_id; 244 pTNETWARB_Inst->instance_callback = ClientCallBack_Func; 245 pTNETWARB_Inst->instance_handle = ClientCallBack_Handle; 246 247 WLAN_REPORT_INFORMATION (pTNETWArb->hReport, TNETW_ARBITER_MODULE_LOG, 248 ("\n TNETWArb_Start: Call TNETWArbSM_SMEvent with TNETWARBSM_EV_START for module %s \n",TNETWIF_ModuleIdToString(module_id))); 249 250 /* Send the event EV_REG to the TNETW Arbiter for handling and take appropriate actions */ 251 ret = TNETWArbSM_SMEvent (pTNETWArb->hTNETWArbSM, 252 (module_id == FW_EVENT_MODULE_ID) ? TNETWARBSM_EV_HW_AVAIL : TNETWARBSM_EV_START); 253 254 return ret; 255 } 256 257 258 259 /********************************************************************************************************* 260 ** ** 261 ** Function Name: TNETWArb_Restart ** 262 ** ** 263 ** Description: Client Re-registration to the TNETW Arbiter whishing to ** 264 ** regain access to the Bus ** 265 ** This will do the following: ** 266 ** 1) Remove the instance from the Running Instance ** 267 ** 2) Add it to the TODO Queue ** 268 ** 3) Will set the Current event to be dispatched later on ** 269 ** from where the Restart was called inside the TNETW Arbiter ** 270 ** This is done to prevent nesting operations from within the Client context ** 271 ** ** 272 **********************************************************************************************************/ 273 TI_STATUS TNETWArb_Restart (TI_HANDLE hTNETWArb,UINT8 module_id,TI_HANDLE ClientCallBack_Handle,TNETWIF_callback_t ClientCallBack_Func) 274 { 275 /* Handle to TNETW Arbiter struct */ 276 TNETWArb_t *pTNETWArb = (TNETWArb_t *)hTNETWArb; 277 TNETWARB_INSTANCE_T *pTNETWARB_Inst; 278 279 #ifdef TNETWARB_DEBUG 280 /* For debug, verify that the running instance is not NULL. */ 281 if(pTNETWArb->TNETWArb_Running_instance == NULL ) 282 { 283 WLAN_REPORT_ERROR(pTNETWArb->hReport,TNETW_ARBITER_MODULE_LOG, 284 ("TNETWArb_Restart: There is no module running, requested by module %d\n", module_id)); 285 return TNETWIF_ERROR; 286 } 287 288 /* For debug check that the instance requesting restart is really the running instance */ 289 if(pTNETWArb->TNETWArb_Running_instance->module_id != module_id ) 290 { 291 /* In this case return to caller ERROR */ 292 return TNETWIF_ERROR; 293 } 294 #endif 295 296 #ifdef TI_DBG 297 pTNETWArb->stat.uRestart ++; 298 #endif 299 300 /* Take the Running instance control block */ 301 pTNETWARB_Inst = pTNETWArb->TNETWArb_Running_instance ; 302 303 /* First indicate that there is not any handle in the Running instance */ 304 pTNETWArb->TNETWArb_Running_instance = NULL; 305 306 /* Enqueue the client request or i.e its instance in the TODO List */ 307 TNETWArb_Enqueue(&(pTNETWArb->TNETWArbiter_Queues[TODO_LIST_INDEX]), (void*)pTNETWARB_Inst); 308 309 WLAN_REPORT_INFORMATION(pTNETWArb->hReport,TNETW_ARBITER_MODULE_LOG,("TNETWArb_Restart: Enqueue in TODO: module %s, instance_handle: %X\n", TNETWIF_ModuleIdToString(module_id), ClientCallBack_Handle)); 310 311 /* Fill the Client instance with the callback handle and function given by the call */ 312 pTNETWARB_Inst->module_id = module_id; 313 pTNETWARB_Inst->instance_callback = ClientCallBack_Func; 314 pTNETWARB_Inst->instance_handle = ClientCallBack_Handle; 315 316 317 /* Set the event to dispatch so that when this function will return back then the context will return to the TNETW Arbiter */ 318 /* Then the TNETW Arbiter will dispatch the event to the STate Machine within its context and not within the Client context 319 to prevent nesting of many calls and prevent to increse the stack */ 320 pTNETWArb->event_to_dispatch = TNETWARBSM_EV_RESTART; 321 pTNETWArb->event_to_dispatch|=TNETWARB_IS_EVENT_PENDING; 322 323 /* Return Pending since the Restart will be handled in a later context */ 324 return TNETWIF_PENDING; 325 326 } 327 328 /********************************************************************************************************* 329 ** ** 330 ** Function Name: TNETWArb_Finish ** 331 ** ** 332 ** Description: Client De-registration to the TNETW Arbiter whishing to ** 333 ** release access to the Bus ** 334 ** This will do the following: ** 335 ** 1) Remove the instance from the Running Instance ** 336 ** 3) Will set the Current event to be dispatched later on ** 337 ** from where the Finish was called inside the TNETW Arbiter ** 338 ** This is done to prevent nesting operations from within the Client context ** 339 ** ** 340 **********************************************************************************************************/ 341 TI_STATUS TNETWArb_Finish (TI_HANDLE hTNETWArb,UINT8 module_id,TI_HANDLE ClientCallBack_Handle,TNETWIF_callback_t ClientCallBack_Func) 342 { 343 /* Handle to TNETW Arbiter struct */ 344 TNETWArb_t *pTNETWArb = (TNETWArb_t *)hTNETWArb; 345 TNETWARB_INSTANCE_T *pTNETWARB_Inst; 346 347 #ifdef TNETWARB_DEBUG 348 /* For debug, verify that the running instance is not NULL. */ 349 if(pTNETWArb->TNETWArb_Running_instance == NULL ) 350 { 351 WLAN_REPORT_ERROR(pTNETWArb->hReport,TNETW_ARBITER_MODULE_LOG, 352 ("TNETWArb_Finish: There is no module running, requested by module %d\n", module_id)); 353 return TNETWIF_ERROR; 354 } 355 356 /* For debug check that the instance requesting restart is really the running instance */ 357 if(pTNETWArb->TNETWArb_Running_instance->module_id != module_id ) 358 { 359 WLAN_REPORT_ERROR(pTNETWArb->hReport,TNETW_ARBITER_MODULE_LOG, 360 ("TNETWArb_Finish: Module %s is not Running module %s is Running \n", 361 TNETWIF_ModuleIdToString(module_id), 362 TNETWIF_ModuleIdToString(pTNETWArb->TNETWArb_Running_instance->module_id))); 363 /* In this case return to caller ERROR */ 364 return TNETWIF_ERROR; 365 } 366 367 #endif 368 369 #ifdef TI_DBG 370 pTNETWArb->stat.uFinish ++; 371 #endif 372 373 /* Take the Running instance control block */ 374 pTNETWARB_Inst = pTNETWArb->TNETWArb_Running_instance ; 375 376 WLAN_REPORT_INFORMATION(pTNETWArb->hReport,TNETW_ARBITER_MODULE_LOG, 377 ("TNETWArb_Finish: module %s, instance_handle: %X\n", 378 TNETWIF_ModuleIdToString(module_id), 379 pTNETWARB_Inst->instance_handle)); 380 381 /* Free the buffer instance */ 382 TNETWArb_freebuf((void *)pTNETWARB_Inst); 383 384 /* Indicate that there is not any handle in the Running instance */ 385 pTNETWArb->TNETWArb_Running_instance = NULL; 386 387 /* Fill the Client instance with NULL callback to ease debugging */ 388 pTNETWARB_Inst->module_id = module_id; 389 pTNETWARB_Inst->instance_callback = NULL; 390 pTNETWARB_Inst->instance_handle = NULL; 391 392 393 /* Now check the Event to send to the TNETW Arbiter State Machine */ 394 /* If there are more reequest in the TODO Queue then Send PROCESS_NEXT_EV else send FINISH event to TNETW Arbiter */ 395 if(TNETWArb_getfirst(&(pTNETWArb->TNETWArbiter_Queues[TODO_LIST_INDEX]))) 396 { 397 /* Set the event to dispatch so that when this function will return back then the context will return to the TNETW Arbiter */ 398 /* Then the TNETW Arbiter will dispatch the event to the STate Machine within its context and not within the Client context 399 to prevent nesting of many calls and prevent to increse the stack */ 400 pTNETWArb->event_to_dispatch = TNETWARBSM_EV_RESTART; 401 WLAN_REPORT_INFORMATION(pTNETWArb->hReport,TNETW_ARBITER_MODULE_LOG , 402 ("TNETWArb_Finish: module %s, instance_handle: %x Send TNETWARBSM_EV_RESTART \n", 403 TNETWIF_ModuleIdToString(module_id), 404 pTNETWARB_Inst->instance_handle)); 405 406 } 407 else 408 { 409 /* Set the event to dispatch so that when this function will return back then the context will return to the TNETW Arbiter */ 410 /* Then the TNETW Arbiter will dispatch the event to the STate Machine within its context and not within the Client context 411 to prevent nesting of many calls and prevent to increse the stack */ 412 pTNETWArb->event_to_dispatch = TNETWARBSM_EV_FINISH; 413 WLAN_REPORT_INFORMATION(pTNETWArb->hReport,TNETW_ARBITER_MODULE_LOG, 414 ("TNETWArb_Finish: module %s, TNETWARBSM_EV_FINISH \n", 415 TNETWIF_ModuleIdToString(module_id), 416 pTNETWARB_Inst->instance_handle)); 417 418 } 419 420 421 pTNETWArb->event_to_dispatch|=TNETWARB_IS_EVENT_PENDING; 422 423 /* Return Pending since the Process_Next/Finish Event will be handled in a later context */ 424 return TNETWIF_COMPLETE; 425 426 } 427 428 429 /**************************************************************************** 430 * TNETWArb_CallTxnCb() 431 **************************************************************************** 432 * DESCRIPTION: This function is used to call the client callback function that was previously 433 * supplied to the TNETWIF via 2 ways: 434 * 1) When the Client requested with TNETWIF_Start to access the Bus 435 * 2) When the Client call the TNETWIF with Async or Optimzed mode. 436 * In this case the callback will be called when the DMA will finish. 437 * 438 * Note :The Client can request FINISHor RESTART bu the TNETW Arbiter state machine will 439 * be sent the event only after that the client function callback returns. 440 * This is done to prevent a deep nesting in case of RESTART. 441 * 442 * INPUTS: TI_HANDLE hTNETWArb 443 * 444 * OUTPUT: void 445 * 446 * RETURNS: void 447 ****************************************************************************/ 448 TI_STATUS TNETWArb_CallTxnCb (TI_HANDLE hTNETWArb) 449 { 450 TNETWArb_t *pTNETWArb = (TNETWArb_t *)hTNETWArb; 451 TNETWARB_INSTANCE_T *pTNETWArbInst; 452 453 /* 454 * If the pDefInst is not NULL it is a special arbiter client (ELP control). 455 * Call the ELP control callback. 456 */ 457 if (pTNETWArb->pDefInst != NULL) 458 { 459 pTNETWArbInst = pTNETWArb->pDefInst; 460 pTNETWArb->pDefInst = NULL; 461 462 if (pTNETWArbInst->instance_callback != NULL) 463 ((TNETWIF_callback_t)(pTNETWArbInst->instance_callback)) 464 (pTNETWArbInst->instance_handle, pTNETWArbInst->module_id, OK); 465 466 return TNETWIF_COMPLETE; 467 } 468 469 /* Otherwise, call a regular arbiter client callback */ 470 else 471 { 472 return TNETWArb_CallClientCallback (hTNETWArb); 473 } 474 } 475 476 477 478 /**************************************************************************** 479 * TNETWArb_CallClientCallback() 480 **************************************************************************** 481 * DESCRIPTION: This function is used to call the client callback function that was previously 482 * supplied to the TNETWIF via 2 ways: 483 * 1) When the Client requested with TNETWIF_Start to access the Bus 484 * 2) When the Client call the TNETWIF with Async or Optimzed mode. 485 * In this case the callback will be called when the DMA will finish. 486 * 487 * Note :The Client can request FINISHor RESTART bu the TNETW Arbiter state machine will 488 * be sent the event only after that the client function callback returns. 489 * This is done to prevent a deep nesting in case of RESTART. 490 * 491 * INPUTS: TI_HANDLE hTNETWArb 492 * 493 * OUTPUT: void 494 * 495 * RETURNS: void 496 ****************************************************************************/ 497 TI_STATUS TNETWArb_CallClientCallback (TI_HANDLE hTNETWArb) 498 { 499 /* Handle to TNETW Arbiter struct */ 500 TNETWArb_t *pTNETWArb = (TNETWArb_t *)hTNETWArb; 501 TNETWARB_INSTANCE_T *pTNETWARB_Inst; 502 503 /* Take the Running instance control block */ 504 if (pTNETWArb->TNETWArb_Running_instance != NULL) 505 { 506 pTNETWARB_Inst = pTNETWArb->TNETWArb_Running_instance; 507 } 508 else 509 { 510 WLAN_REPORT_ERROR (pTNETWArb->hReport, TNETW_ARBITER_MODULE_LOG, 511 ("TNETWArb_CallClientCallback: no running instance\n")); 512 TNETWIF_printErrorLog(); 513 514 return TNETWIF_ERROR; 515 } 516 517 /* Call the client callback */ 518 if (pTNETWARB_Inst->instance_callback != NULL) 519 ((TNETWIF_callback_t)(pTNETWARB_Inst->instance_callback)) 520 (pTNETWARB_Inst->instance_handle, pTNETWARB_Inst->module_id, OK); 521 522 /* Check if there is an event to be dispatch */ 523 if (pTNETWArb->event_to_dispatch & TNETWARB_IS_EVENT_PENDING) 524 { 525 TI_STATUS status; 526 527 pTNETWArb->event_to_dispatch &= ~TNETWARB_IS_EVENT_PENDING; 528 529 530 /* Now check the Event to send to the TNETW Arbiter State Machine */ 531 /* If there are more request in the TODO Queue then Send PROCESS_NEXT_EV else send FINISH event to TNETW Arbiter */ 532 if (TNETWArb_getfirst (&pTNETWArb->TNETWArbiter_Queues[TODO_LIST_INDEX])) 533 { 534 /* Set the event to dispatch so that when this function will return back then the context will return to the TNETW Arbiter */ 535 /* Then the TNETW Arbiter will dispatch the event to the STate Machine within its context and not within the Client context 536 to prevent nesting of many calls and prevent to increase the stack */ 537 pTNETWArb->event_to_dispatch = TNETWARBSM_EV_RESTART; 538 status = TNETWIF_PENDING; 539 WLAN_REPORT_INFORMATION (pTNETWArb->hReport,TNETW_ARBITER_MODULE_LOG ,("TNETWArb_CallClientCallback: module %s, instance_handle: %x Send TNETWARBSM_EV_RESTART \n", TNETWIF_ModuleIdToString(pTNETWARB_Inst->module_id), pTNETWARB_Inst->instance_handle)); 540 } 541 else 542 { 543 /* Set the event to dispatch so that when this function will return back then the context will return to the TNETW Arbiter */ 544 /* Then the TNETW Arbiter will dispatch the event to the STate Machine within its context and not within the Client context 545 to prevent nesting of many calls and prevent to increase the stack */ 546 pTNETWArb->event_to_dispatch = TNETWARBSM_EV_FINISH; 547 status = TNETWIF_COMPLETE; 548 WLAN_REPORT_INFORMATION (pTNETWArb->hReport,TNETW_ARBITER_MODULE_LOG,("TNETWArb_CallClientCallback: module %s, TNETWARBSM_EV_FINISH \n", TNETWIF_ModuleIdToString(pTNETWARB_Inst->module_id), pTNETWARB_Inst->instance_handle)); 549 } 550 551 WLAN_REPORT_INFORMATION (pTNETWArb->hReport, TNETW_ARBITER_MODULE_LOG, ("TNETWArb_CallClientCallback: module %s, instance_handle: %x Send pTNETWArb->event_to_dispatch %d \n", TNETWIF_ModuleIdToString(pTNETWARB_Inst->module_id), pTNETWARB_Inst->instance_handle, pTNETWArb->event_to_dispatch)); 552 553 TNETWArbSM_SMEvent (pTNETWArb->hTNETWArbSM, pTNETWArb->event_to_dispatch); 554 555 return status; 556 } 557 558 return TNETWIF_PENDING; 559 } 560 561 562 /**************************************************************************** 563 * TNETWArb_TxnCb() 564 **************************************************************************** 565 * DESCRIPTION: ELP Controller Callabck - Indicate to the TNETWArb that the HW is now Available 566 * The FW has waken up. 567 * 568 * INPUTS: hTNETWArb - the handle to the TNETW Arbiter 569 * 570 * OUTPUT: 571 * 572 * RETURNS: OK 573 ****************************************************************************/ 574 void TNETWArb_TxnCb (TI_HANDLE hTNETWArb, UINT8 module_id, TI_STATUS status) 575 { 576 TNETWArb_t *pTNETWArb = (TNETWArb_t *)hTNETWArb; 577 578 TNETWArbSM_TxnCb (pTNETWArb->hTNETWArbSM); 579 } 580 581 582 #ifdef TI_DBG 583 void TNETWArb_PrintStat (TI_HANDLE hTNETWArb) 584 { 585 TNETWArb_t *pTNETWArb = (TNETWArb_t *)hTNETWArb; 586 587 WLAN_OS_REPORT (("Num of start = %u\n", pTNETWArb->stat.uStart)); 588 WLAN_OS_REPORT (("Num of restart = %u\n", pTNETWArb->stat.uRestart)); 589 WLAN_OS_REPORT (("Num of finish = %u\n", pTNETWArb->stat.uFinish)); 590 591 TNETWIF_printErrorLog(); 592 } 593 #endif 594 595 596 /**************************************************************************** 597 * BusArbiter_Recovery() 598 **************************************************************************** 599 * DESCRIPTION: handles the recovery 600 * 601 * INPUTS: TI_HANDLE hBusArbiter 602 * 603 * OUTPUT: void 604 * 605 * RETURNS: void 606 ****************************************************************************/ 607 TI_STATUS TNETWArb_Recovery(TI_HANDLE hTNETWArb, TI_HANDLE hELPCtrl) 608 { 609 TNETWArb_t *pTNETWArb = (TNETWArb_t *)hTNETWArb; 610 611 /* should be updated - see CE20 */ 612 TNETWArb_Config (hTNETWArb, pTNETWArb->hReport, hELPCtrl); 613 return OK; 614 615 } 616 617