Home | History | Annotate | Download | only in TNETWArbiter
      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  */
     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  */
    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  */
    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  */
    370 TI_STATUS TNETWArbSM_SMEvent (TI_HANDLE hTNETWArbSM, TnetwArbSMEvents_e event)
    371 {
    372     return TNETWArbSM_SMEvent__ (hTNETWArbSM, event);
    373 }
    374 
    375 
    376 static TI_STATUS TNETWArbSM_SeizeBusOnStart (TI_HANDLE hTNETWArbSM)
    377 {
    378     return TNETWArbSM_SeizeBus (hTNETWArbSM, FALSE);
    379 }
    380 
    381 
    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  */
    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)
    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  */
    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  */
    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  */
    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  */
    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  */
    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 
    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 
    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 
    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  */
    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 
    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 
    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  */
    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