Home | History | Annotate | Download | only in MacServices
      1 /*
      2  * MeasurementSrvSM.c
      3  *
      4  * Copyright(c) 1998 - 2009 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 /** \file measurementSrv.c
     35  *  \brief This file include the measurement SRV state machine implementation.
     36  *  \author Ronen Kalish
     37  *  \date 13-November-2005
     38  */
     39 
     40 #define __FILE_ID__  FILE_ID_112
     41 #include "osApi.h"
     42 #include "report.h"
     43 #include "MeasurementSrvSM.h"
     44 #include "MeasurementSrv.h"
     45 #include "PowerSrv_API.h"
     46 #include "timer.h"
     47 #include "fsm.h"
     48 #include "TWDriverInternal.h"
     49 #include "CmdBld.h"
     50 
     51 
     52 TI_STATUS actionUnexpected( TI_HANDLE hMeasurementSrv );
     53 TI_STATUS actionNop( TI_HANDLE hMeasurementSrv );
     54 static void measurementSRVSM_requestMeasureStartResponseCB(TI_HANDLE hMeasurementSRV, TI_UINT32 uMboxStatus);
     55 
     56 
     57 /**
     58  * \author Ronen Kalish\n
     59  * \date 08-November-2005\n
     60  * \brief Initialize the measurement SRV SM.\n
     61  *
     62  * Function Scope \e Public.\n
     63  * \param hMeasurementSrv - handle to the Measurement SRV object.\n
     64  * \return TI_OK if successful, TI_NOK otherwise.\n
     65  */
     66 TI_STATUS measurementSRVSM_init( TI_HANDLE hMeasurementSRV )
     67 {
     68    measurementSRV_t* pMeasurementSRV = (measurementSRV_t*)hMeasurementSRV;
     69 
     70     fsm_actionCell_t    smMatrix[ MSR_SRV_NUM_OF_STATES ][ MSR_SRV_NUM_OF_EVENTS ] =
     71     {
     72         /* next state and actions for IDLE state */
     73         {
     74             {MSR_SRV_STATE_WAIT_FOR_DRIVER_MODE, measurementSRVSM_requestDriverMode},     /*"MESSURE_START_REQUEST"*/
     75             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"DRIVER_MODE_SUCCESS"*/
     76             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"DRIVER_MODE_FAILURE"*/
     77             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"START_SUCCESS"*/
     78             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"START_FAILURE"*/
     79             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"ALL_TYPES_COMPLETE"*/
     80             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"STOP_COMPLETE"*/
     81             {MSR_SRV_STATE_IDLE, measurementSRVSRVSM_dummyStop}                           /*"MEASURE_STOP_REQUEST"*/
     82         },
     83 
     84 
     85         /* next state and actions for WAIT_FOR_DRIVER_MODE state */
     86         {
     87             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"MESSURE_START_REQUEST"*/
     88             {MSR_SRV_STATE_WAIT_FOR_MEASURE_START, measurementSRVSM_requestMeasureStart}, /*"DRIVER_MODE_SUCCESS"*/
     89             {MSR_SRV_STATE_IDLE, measurementSRVSM_DriverModeFailure},                     /*"DRIVER_MODE_FAILURE"*/
     90             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"START_SUCCESS"*/
     91             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"START_FAILURE"*/
     92             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"ALL_TYPES_COMPLETE"*/
     93             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"STOP_COMPLETE"*/
     94             {MSR_SRV_STATE_IDLE, measurementSRVSM_stopFromWaitForDriverMode}              /*"MEASURE_STOP_REQUEST"*/
     95         },
     96 
     97         /* next state and actions for WAIT_FOR_MEASURE_START state */
     98         {
     99             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"MESSURE_START_REQUEST"*/
    100             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"DRIVER_MODE_SUCCESS"*/
    101             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"DRIVER_MODE_FAILURE"*/
    102             {MSR_SRV_STATE_MEASURE_IN_PROGRESS, measurementSRVSM_startMeasureTypes},      /*"START_SUCCESS"*/
    103             {MSR_SRV_STATE_IDLE, measurementSRVSM_measureStartFailure},                   /*"START_FAILURE"*/
    104             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"ALL_TYPES_COMPLETE"*/
    105             {MSR_SRV_STATE_IDLE, measurementSRVSM_completeMeasure},                       /*"STOP_COMPLETE"*/
    106             {MSR_SRV_STATE_WAIT_FOR_MEASURE_STOP, measurementSRVSM_stopFromWaitForMeasureStart}
    107                                                                                           /*"MEASURE_STOP_REQUEST"*/
    108         },
    109 
    110         /* next state and actions for MEASURE_IN_PROGRESS state */
    111         {
    112             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"MESSURE_START_REQUEST"*/
    113             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"DRIVER_MODE_SUCCESS"*/
    114             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"DRIVER_MODE_FAILURE"*/
    115             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"START_SUCCESS"*/
    116             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"START_FAILURE"*/
    117             {MSR_SRV_STATE_WAIT_FOR_MEASURE_STOP, measurementSRVSM_requestMeasureStop},   /*"ALL_TYPES_COMPLETE"*/
    118             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"STOP_COMPLETE"*/
    119             {MSR_SRV_STATE_WAIT_FOR_MEASURE_STOP, measurementSRVSM_stopFromMeasureInProgress}
    120                                                                                           /*"MEASURE_STOP_REQUEST"*/
    121         },
    122 
    123         /* next state and actions for WAIT_FOR_MEASURE_STOP state */
    124         {
    125             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"MESSURE_START_REQUEST"*/
    126             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"DRIVER_MODE_SUCCESS"*/
    127             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"DRIVER_MODE_FAILURE"*/
    128             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"START_SUCCESS"*/
    129             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"START_FAILURE"*/
    130             {MSR_SRV_STATE_IDLE, actionUnexpected},                                       /*"ALL_TYPES_COMPLETE"*/
    131             {MSR_SRV_STATE_IDLE, measurementSRVSM_completeMeasure},                       /*"STOP_COMPLETE"*/
    132             {MSR_SRV_STATE_WAIT_FOR_MEASURE_STOP, measurementSRVSRVSM_dummyStop}          /*"MEASURE_STOP_REQUEST"*/
    133         }
    134     };
    135 
    136     /* initialize current state */
    137     pMeasurementSRV->SMState = MSR_SRV_STATE_IDLE;
    138 
    139     /* configure the state machine */
    140     return fsm_Config( pMeasurementSRV->SM, (fsm_Matrix_t)smMatrix,
    141                        (TI_UINT8)MSR_SRV_NUM_OF_STATES, (TI_UINT8)MSR_SRV_NUM_OF_EVENTS,
    142                        (fsm_eventActivation_t)measurementSRVSM_SMEvent, pMeasurementSRV->hOS );
    143 }
    144 
    145 /**
    146  * \author Ronen Kalish\n
    147  * \date 08-November-2005\n
    148  * \brief Processes an event.\n
    149  *
    150  * Function Scope \e Public.\n
    151  * \param hMeasurementSrv - handle to the measurement SRV object.\n
    152  * \param currentState - the current scan SRV SM state.\n
    153  * \param event - the event to handle.\n
    154  * \return TI_OK if successful, TI_NOK otherwise.\n
    155  */
    156 TI_STATUS measurementSRVSM_SMEvent( TI_HANDLE hMeasurementSrv, measurements_SRVSMStates_e* currentState,
    157                                     measurement_SRVSMEvents_e event )
    158 {
    159     measurementSRV_t *pMeasurementSRV = (measurementSRV_t *)hMeasurementSrv;
    160     TI_STATUS status = TI_OK;
    161     TI_UINT8 nextState;
    162 
    163     /* obtain the next state */
    164     status = fsm_GetNextState( pMeasurementSRV->SM, (TI_UINT8)*currentState, (TI_UINT8)event, &nextState );
    165     if ( status != TI_OK )
    166     {
    167         TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, "measurementSRVSM_SMEvent: State machine error, failed getting next state\n");
    168         return TI_NOK;
    169     }
    170 
    171     /* report the move */
    172 	TRACE3( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, "measurementSRVSM_SMEvent: <currentState = %d, event = %d> --> nextState = %d\n", currentState, event, nextState);
    173 
    174     /* move */
    175     return fsm_Event( pMeasurementSRV->SM, (TI_UINT8*)currentState, (TI_UINT8)event, hMeasurementSrv );
    176 }
    177 
    178 /**
    179  * \author Ronen Kalish\n
    180  * \date 08-November-2005\n
    181  * \brief Handle a MEASURE_START_REQUEST event by requesting driver mode.\n
    182  *
    183  * Function Scope \e Public.\n
    184  * \param hMeasurementSrv - handle to the Measurement SRV object.\n
    185  * \return always TI_OK.\n
    186  */
    187 TI_STATUS measurementSRVSM_requestDriverMode( TI_HANDLE hMeasurementSRV )
    188 {
    189     measurementSRV_t    *pMeasurementSRV  = (measurementSRV_t*)hMeasurementSRV;
    190     TI_STATUS           PSStatus;
    191     TTwdParamInfo       paramInfo;
    192 
    193     /* get the current channel */
    194     paramInfo.paramType = TWD_CURRENT_CHANNEL_PARAM_ID;
    195     cmdBld_GetParam (pMeasurementSRV->hCmdBld, &paramInfo);
    196 
    197     /* check if the request is on the serving channel */
    198     if ( paramInfo.content.halCtrlCurrentChannel == pMeasurementSRV->msrRequest.channel )
    199     {
    200         /* Switch Power Save SRV to driver mode w/o changing power save mode*/
    201         PSStatus = powerSrv_ReservePS( pMeasurementSRV->hPowerSaveSRV, POWER_SAVE_KEEP_CURRENT,
    202                                        TI_TRUE, hMeasurementSRV, MacServices_measurementSRV_powerSaveCB );
    203     }
    204     else
    205     {
    206         /* Switch Power Save SRV to driver mode with PS mode */
    207         PSStatus = powerSrv_ReservePS( pMeasurementSRV->hPowerSaveSRV, POWER_SAVE_ON,
    208                                        TI_TRUE, hMeasurementSRV, MacServices_measurementSRV_powerSaveCB );
    209     }
    210 
    211     switch (PSStatus)
    212     {
    213         case POWER_SAVE_802_11_IS_CURRENT:
    214             TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ": Driver mode entered successfully\n");
    215             /* send a power save success event */
    216             return measurementSRVSM_SMEvent( hMeasurementSRV, &(pMeasurementSRV->SMState),
    217                                              MSR_SRV_EVENT_DRIVER_MODE_SUCCESS );
    218 
    219         case POWER_SAVE_802_11_PENDING:
    220         case TI_OK:
    221             TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ": Driver mode pending\n");
    222             break;
    223 
    224         default: /* Error */
    225             TRACE1( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": Error %d when requesting driver mode\n",PSStatus);
    226 
    227             /* Set the return status to TI_NOK */
    228             pMeasurementSRV->returnStatus = PSStatus;
    229 
    230             /* send a power save failure event */
    231             measurementSRVSM_SMEvent( hMeasurementSRV, &(pMeasurementSRV->SMState),
    232                                       MSR_SRV_EVENT_DRIVER_MODE_FAILURE );
    233             break;
    234     }
    235 
    236     return TI_OK;
    237 }
    238 
    239 /**
    240  * \author Ronen Kalish\n
    241  * \date 08-November-2005\n
    242  * \brief Handle a DRIVER_MODE_SUCCESS event by sending start measure command to the FW.\n
    243  *
    244  * Function Scope \e Public.\n
    245  * \param hMeasurementSrv - handle to the Measurement SRV object.\n
    246  * \return always TI_OK.\n
    247  */
    248 TI_STATUS measurementSRVSM_requestMeasureStart( TI_HANDLE hMeasurementSRV )
    249 {
    250     measurementSRV_t     *pMeasurementSRV = (measurementSRV_t*)hMeasurementSRV;
    251     TMeasurementParams    pMeasurementCmd;
    252     TI_STATUS             status;
    253     TI_UINT32                currentTime = os_timeStampMs( pMeasurementSRV->hOS );
    254 
    255     /* check if request time has expired (note: timer wrap-around is also handled)*/
    256     if ( (pMeasurementSRV->requestRecptionTimeStampMs + pMeasurementSRV->timeToRequestExpiryMs)
    257                     < currentTime )
    258     {
    259         TI_INT32 i;
    260 
    261         TRACE2( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": request time has expired, request expiry time:%d, current time:%d\n", pMeasurementSRV->requestRecptionTimeStampMs + pMeasurementSRV->timeToRequestExpiryMs, currentTime);
    262 
    263         /* mark that all measurement types has failed */
    264         for ( i = 0; i < pMeasurementSRV->msrRequest.numberOfTypes; i++ )
    265         {
    266             pMeasurementSRV->msrReply.msrTypes[ i ].status = TI_NOK;
    267         }
    268 
    269         /* send a measurement complete event */
    270         measurementSRVSM_SMEvent( hMeasurementSRV, &(pMeasurementSRV->SMState),
    271                                   MSR_SRV_EVENT_STOP_COMPLETE );
    272 
    273         return TI_OK;
    274     }
    275 
    276     pMeasurementCmd.channel = pMeasurementSRV->msrRequest.channel;
    277     pMeasurementCmd.band = pMeasurementSRV->msrRequest.band;
    278     pMeasurementCmd.duration = 0; /* Infinite */
    279     pMeasurementCmd.eTag = pMeasurementSRV->msrRequest.eTag;
    280 
    281     if ( measurementSRVIsBeaconMeasureIncluded( hMeasurementSRV ))
    282     {  /* Beacon Measurement is one of the types */
    283 
    284 		/* get the current channel */
    285 		TTwdParamInfo	paramInfo;
    286 
    287 		paramInfo.paramType = TWD_CURRENT_CHANNEL_PARAM_ID;
    288 		cmdBld_GetParam (pMeasurementSRV->hCmdBld, &paramInfo);
    289 
    290 		pMeasurementCmd.ConfigOptions = RX_CONFIG_OPTION_FOR_MEASUREMENT;
    291 
    292 		/* check if the request is on the serving channel */
    293 		if ( paramInfo.content.halCtrlCurrentChannel == pMeasurementSRV->msrRequest.channel )
    294 		{
    295 			/* Set the RX Filter to the join one, so that any packets will
    296             be received on the serving channel - beacons and probe requests for
    297 			the measurmenet, and also data (for normal operation) */
    298             pMeasurementCmd.FilterOptions = RX_FILTER_OPTION_JOIN;
    299 		}
    300 		else
    301 		{
    302 			/* not on the serving channle - only beacons and rpobe responses are required */
    303 			pMeasurementCmd.FilterOptions = RX_FILTER_OPTION_DEF_PRSP_BCN;
    304 		}
    305     }
    306     else
    307     {  /* No beacon measurement - use the current RX Filter */
    308         pMeasurementCmd.ConfigOptions = 0xffffffff;
    309         pMeasurementCmd.FilterOptions = 0xffffffff;
    310     }
    311 
    312     /* Send start measurement command */
    313     status = cmdBld_CmdMeasurement (pMeasurementSRV->hCmdBld,
    314                                     &pMeasurementCmd,
    315                                     (void *)measurementSRVSM_requestMeasureStartResponseCB,
    316                                     pMeasurementSRV);
    317 
    318     if ( TI_OK != status )
    319     {
    320         TRACE1( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": Failed to send measurement start command, statud=%d,\n", status);
    321 
    322         /* keep the faulty return status */
    323         pMeasurementSRV->returnStatus = status;
    324 
    325         /* send a measurement start fail event */
    326         return measurementSRVSM_SMEvent( hMeasurementSRV, &(pMeasurementSRV->SMState),
    327                                          MSR_SRV_EVENT_START_FAILURE );
    328     }
    329 
    330     TRACE6( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ": measure start command sent. Params:\n channel=%d, band=%d, duration=%d, \n configOptions=0x%x, filterOptions=0x%x, status=%d, \n", pMeasurementCmd.channel, pMeasurementCmd.band, pMeasurementCmd.duration, pMeasurementCmd.ConfigOptions, pMeasurementCmd.FilterOptions, status);
    331 
    332     /* start the FW guard timer */
    333     pMeasurementSRV->bStartStopTimerRunning = TI_TRUE;
    334     tmr_StartTimer (pMeasurementSRV->hStartStopTimer,
    335                     MacServices_measurementSRV_startStopTimerExpired,
    336                     (TI_HANDLE)pMeasurementSRV,
    337                     MSR_FW_GUARD_TIME,
    338                     TI_FALSE);
    339 
    340     return TI_OK;
    341 }
    342 
    343 /**
    344  * \author Ronen Kalish\n
    345  * \date 08-November-2005\n
    346  * \brief Handle a START_SUCCESS event by starting different measure types and setting timers.\n
    347  *
    348  * Function Scope \e Public.\n
    349  * \param hMeasurementSrv - handle to the Measurement SRV object.\n
    350  * \return always TI_OK.\n
    351  */
    352 TI_STATUS measurementSRVSM_startMeasureTypes( TI_HANDLE hMeasurementSRV )
    353 {
    354     measurementSRV_t      *pMeasurementSRV = (measurementSRV_t*)hMeasurementSRV;
    355     TI_UINT8                 requestIndex, rangeIndex;
    356     TI_INT8                  rangeUpperBound;
    357     TTwdParamInfo         tTwdParam;
    358     TI_STATUS             status;
    359     TNoiseHistogram       pNoiseHistParams;
    360     TApDiscoveryParams    pApDiscoveryParams;
    361     TI_UINT32                currentTime = os_timeStampMs( pMeasurementSRV->hOS );
    362 
    363     /* check if request time has expired (note: timer wrap-around is also handled)*/
    364     if ( (pMeasurementSRV->requestRecptionTimeStampMs + pMeasurementSRV->timeToRequestExpiryMs)
    365                     < currentTime )
    366     {
    367         TI_INT32 i;
    368 
    369         TRACE2( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": request time has expired, request expiry time:%d, current time:%d\n", pMeasurementSRV->requestRecptionTimeStampMs + pMeasurementSRV->timeToRequestExpiryMs, currentTime);
    370 
    371         /* mark that all measurement types has failed */
    372         for ( i = 0; i < pMeasurementSRV->msrRequest.numberOfTypes; i++ )
    373         {
    374             pMeasurementSRV->msrReply.msrTypes[ i ].status = MSR_REJECT_MAX_DELAY_PASSED;
    375         }
    376 
    377         /* send a measurement complete event */
    378         measurementSRVSM_SMEvent( hMeasurementSRV, &(pMeasurementSRV->SMState),
    379                                   MSR_SRV_EVENT_ALL_TYPES_COMPLETE );
    380 
    381         return TI_OK;
    382     }
    383 
    384     /* Going over all request types that should be executed in parallel
    385     to start their timers and execute the measurement */
    386     for ( requestIndex = 0; requestIndex < pMeasurementSRV->msrRequest.numberOfTypes ; requestIndex++ )
    387     {
    388         switch (pMeasurementSRV->msrRequest.msrTypes[ requestIndex ].msrType)
    389         {
    390         case MSR_TYPE_CCA_LOAD_MEASUREMENT:
    391             /* Clearing the Medium Occupancy Register */
    392             tTwdParam.paramType = TWD_MEDIUM_OCCUPANCY_PARAM_ID;
    393             tTwdParam.content.interogateCmdCBParams.fCb = (void *)MacServices_measurementSRV_dummyChannelLoadParamCB;
    394             tTwdParam.content.interogateCmdCBParams.hCb = hMeasurementSRV;
    395             tTwdParam.content.interogateCmdCBParams.pCb =
    396                     (TI_UINT8*)&pMeasurementSRV->mediumOccupancyResults;
    397             status = cmdBld_GetParam (pMeasurementSRV->hCmdBld, &tTwdParam);
    398             if( TI_OK == status  )
    399             {
    400                 TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ": Medium Usage has been nullified, starting timer.\n");
    401 
    402                 /* Start Timer */
    403                 tmr_StartTimer (pMeasurementSRV->hRequestTimer[requestIndex],
    404                                 MacServices_measurementSRV_requestTimerExpired,
    405                                 (TI_HANDLE)pMeasurementSRV,
    406                                 pMeasurementSRV->msrRequest.msrTypes[requestIndex].duration,
    407                                 TI_FALSE);
    408                 pMeasurementSRV->bRequestTimerRunning[requestIndex] = TI_TRUE;
    409             }
    410             else
    411             {
    412                 TRACE1( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": TWD_GetParam (for channel load) returned status %d\n", status);
    413             }
    414 
    415             break;
    416 
    417         case MSR_TYPE_NOISE_HISTOGRAM_MEASUREMENT:
    418             /* Set Noise Histogram Cmd Params */
    419             pNoiseHistParams.cmd = START_NOISE_HIST;
    420             pNoiseHistParams.sampleInterval = DEF_SAMPLE_INTERVAL;
    421             os_memoryZero( pMeasurementSRV->hOS, &(pNoiseHistParams.ranges[0]), MEASUREMENT_NOISE_HISTOGRAM_NUM_OF_RANGES );
    422 
    423             /* Set Ranges */
    424             /* (-87) - First Range's Upper Bound */
    425             rangeUpperBound = -87;
    426 
    427             /* Previously we converted from RxLevel to dBm - now this isn't necessary */
    428             /* rangeUpperBound = TWD_convertRSSIToRxLevel( pMeasurementSRV->hTWD, -87); */
    429 
    430             for(rangeIndex = 0; rangeIndex < MEASUREMENT_NOISE_HISTOGRAM_NUM_OF_RANGES -1; rangeIndex++)
    431             {
    432                 if(rangeUpperBound > 0)
    433                 {
    434                     pNoiseHistParams.ranges[rangeIndex] = 0;
    435                 }
    436                 else
    437                 {
    438                     pNoiseHistParams.ranges[rangeIndex] = rangeUpperBound;
    439                 }
    440                 rangeUpperBound += 5;
    441             }
    442             pNoiseHistParams.ranges[rangeIndex] = 0xFE;
    443 
    444             /* Print for Debug */
    445             TRACE8(pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ":Noise histogram Measurement Ranges:\n%d %d %d %d %d %d %d %d\n", (TI_INT8) pNoiseHistParams.ranges[0], (TI_INT8) pNoiseHistParams.ranges[1], (TI_INT8) pNoiseHistParams.ranges[2], (TI_INT8) pNoiseHistParams.ranges[3], (TI_INT8) pNoiseHistParams.ranges[4], (TI_INT8) pNoiseHistParams.ranges[5], (TI_INT8) pNoiseHistParams.ranges[6], (TI_INT8) pNoiseHistParams.ranges[7]);
    446 
    447             /* Send a Start command to the FW */
    448             status = cmdBld_CmdNoiseHistogram (pMeasurementSRV->hCmdBld, &pNoiseHistParams, NULL, NULL);
    449 
    450             if ( TI_OK == status )
    451             {
    452                 /* Print for Debug */
    453                 TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ": Sent noise histogram command. Starting timer\n");
    454 
    455                 /* Start Timer */
    456                 tmr_StartTimer (pMeasurementSRV->hRequestTimer[requestIndex],
    457                                 MacServices_measurementSRV_requestTimerExpired,
    458                                 (TI_HANDLE)pMeasurementSRV,
    459                                 pMeasurementSRV->msrRequest.msrTypes[requestIndex].duration,
    460                                 TI_FALSE);
    461                 pMeasurementSRV->bRequestTimerRunning[requestIndex] = TI_TRUE;
    462             }
    463             else
    464             {
    465                 TRACE1( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": TWD_NoiseHistogramCmd returned status %d\n", status);
    466             }
    467             break;
    468 
    469         case MSR_TYPE_BEACON_MEASUREMENT:
    470             /* set all parameters in the AP discovery command */
    471             pApDiscoveryParams.scanDuration = pMeasurementSRV->msrRequest.msrTypes[ requestIndex ].duration * 1000; /* TODO change this to an infinite value (was 0) */
    472             pApDiscoveryParams.numOfProbRqst = 1;
    473             pApDiscoveryParams.txdRateSet = HW_BIT_RATE_1MBPS;
    474             pApDiscoveryParams.ConfigOptions = RX_CONFIG_OPTION_FOR_MEASUREMENT;
    475             pApDiscoveryParams.FilterOptions = RX_FILTER_OPTION_DEF_PRSP_BCN;
    476             pApDiscoveryParams.txPowerDbm = pMeasurementSRV->msrRequest.txPowerDbm;
    477             pApDiscoveryParams.scanOptions = SCAN_ACTIVE; /* both scan type and band are 0 for active and */
    478                                                           /* 2.4 GHz, respectively, but 2.4 is not defined */
    479 
    480             /* band determined at the initiate measurement command not at that structure */
    481 
    482             /* scan mode go into the scan option field */
    483             if ( MSR_SCAN_MODE_PASSIVE == pMeasurementSRV->msrRequest.msrTypes[ requestIndex ].scanMode )
    484             {
    485                 pApDiscoveryParams.scanOptions |= SCAN_PASSIVE;
    486             }
    487 
    488             /* Send AP Discovery command */
    489             status = cmdBld_CmdApDiscovery (pMeasurementSRV->hCmdBld, &pApDiscoveryParams, NULL, NULL);
    490 
    491             if ( TI_OK == status )
    492             {
    493                 TRACE7( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ": AP discovery command sent. Params:\n scanDuration=%d, scanOptions=%d, numOfProbRqst=%d, txdRateSet=%d, txPowerDbm=%d, configOptions=%d, filterOptions=%d\n Starting timer...\n", pApDiscoveryParams.scanDuration, pApDiscoveryParams.scanOptions, pApDiscoveryParams.numOfProbRqst, pApDiscoveryParams.txdRateSet, pApDiscoveryParams.txPowerDbm, pApDiscoveryParams.ConfigOptions, pApDiscoveryParams.FilterOptions);
    494 
    495                 /* Start Timer */
    496                 tmr_StartTimer (pMeasurementSRV->hRequestTimer[requestIndex],
    497                                 MacServices_measurementSRV_requestTimerExpired,
    498                                 (TI_HANDLE)pMeasurementSRV,
    499                                 pMeasurementSRV->msrRequest.msrTypes[requestIndex].duration,
    500                                 TI_FALSE);
    501                 pMeasurementSRV->bRequestTimerRunning[ requestIndex ] = TI_TRUE;
    502             }
    503             else
    504             {
    505                 TRACE1( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": TWD_ApDiscoveryCmd returned status %d\n", status);
    506             }
    507             break;
    508 
    509         case MSR_TYPE_BASIC_MEASUREMENT: /* not supported in current implemntation */
    510         case MSR_TYPE_FRAME_MEASUREMENT: /* not supported in current implemntation */
    511         default:
    512             TRACE1( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": Measurement type %d is not supported\n", pMeasurementSRV->msrRequest.msrTypes[ requestIndex ].msrType);
    513             break;
    514         }
    515     }
    516 
    517     /* if no measurement types are running, sen al types complete event.
    518        This can happen if all types failed to start */
    519     if ( TI_TRUE == measurementSRVIsMeasurementComplete( hMeasurementSRV ))
    520     {
    521         /* send the event */
    522         measurementSRVSM_SMEvent( hMeasurementSRV, &(pMeasurementSRV->SMState),
    523                                   MSR_SRV_EVENT_ALL_TYPES_COMPLETE );
    524     }
    525 
    526     return TI_OK;
    527 }
    528 
    529 /**
    530  * \author Ronen Kalish\n
    531  * \date 08-November-2005\n
    532  * \brief Handle an ALL_TYPE_COMPLETE event by sending a stop measure command to the FW.\n
    533  *
    534  * Function Scope \e Public.\n
    535  * \param hMeasurementSrv - handle to the Measurement SRV object.\n
    536  * \return always TI_OK.\n
    537  */
    538 TI_STATUS measurementSRVSM_requestMeasureStop( TI_HANDLE hMeasurementSRV )
    539 {
    540     measurementSRV_t* pMeasurementSRV = (measurementSRV_t*)hMeasurementSRV;
    541     TI_STATUS status;
    542 
    543     /* since this function may also be called when stop is requested and start complete event
    544        has not yet been received from the FW, we may need to stop the FW guard timer */
    545     if (pMeasurementSRV->bStartStopTimerRunning)
    546     {
    547 		tmr_StopTimer (pMeasurementSRV->hStartStopTimer);
    548         pMeasurementSRV->bStartStopTimerRunning = TI_FALSE;
    549     }
    550 
    551     /* Send Measurement Stop command to the FW */
    552     status = cmdBld_CmdMeasurementStop (pMeasurementSRV->hCmdBld,
    553                                         (void *)pMeasurementSRV->commandResponseCBFunc,
    554                                         pMeasurementSRV->commandResponseCBObj);
    555 
    556     pMeasurementSRV->commandResponseCBFunc = NULL;
    557     pMeasurementSRV->commandResponseCBObj = NULL;
    558 
    559     if ( TI_OK != status )
    560     {
    561         TRACE1( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": Failed to send measurement stop command, statud=%d,\n", status);
    562 
    563         /* send a measurement complete event - since it can't be stopped */
    564         measurementSRVSM_SMEvent( hMeasurementSRV, &(pMeasurementSRV->SMState), MSR_SRV_EVENT_STOP_COMPLETE );
    565         return TI_OK;
    566     }
    567 
    568     TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ": measure stop command sent.\n");
    569 
    570     /* start the FW guard timer */
    571     pMeasurementSRV->bStartStopTimerRunning = TI_TRUE;
    572     tmr_StartTimer (pMeasurementSRV->hStartStopTimer,
    573                     MacServices_measurementSRV_startStopTimerExpired,
    574                     (TI_HANDLE)pMeasurementSRV,
    575                     MSR_FW_GUARD_TIME,
    576                     TI_FALSE);
    577 
    578     return TI_OK;
    579 }
    580 
    581 /**
    582  * \author Ronen Kalish\n
    583  * \date 08-November-2005\n
    584  * \brief Handle a STOP_COMPLETE event by exiting driver mode and calling the complete CB.\n
    585  *
    586  * Function Scope \e Public.\n
    587  * \param hMeasurementSrv - handle to the Measurement SRV object.\n
    588  * \return always TI_OK.\n
    589  */
    590 TI_STATUS measurementSRVSM_completeMeasure( TI_HANDLE hMeasurementSRV )
    591 {
    592     measurementSRV_t *pMeasurementSRV = (measurementSRV_t *)hMeasurementSRV;
    593 
    594     /* Switch Power Save SRV back to user mode */
    595     powerSrv_ReleasePS( pMeasurementSRV->hPowerSaveSRV, pMeasurementSRV->bSendNullDataWhenExitPs, NULL, NULL );
    596 
    597     /* if the response CB is still pending, call it (when requestExpiryTimeStamp was reached) */
    598     if ( NULL != pMeasurementSRV->commandResponseCBFunc )
    599     {
    600         pMeasurementSRV->commandResponseCBFunc( pMeasurementSRV->commandResponseCBObj, TI_OK );
    601     }
    602 
    603     /* call the complete CB */
    604     if ( NULL != pMeasurementSRV->measurmentCompleteCBFunc )
    605     {
    606         pMeasurementSRV->measurmentCompleteCBFunc( pMeasurementSRV->measurementCompleteCBObj,
    607                                                    &(pMeasurementSRV->msrReply));
    608     }
    609 
    610     return TI_OK;
    611 }
    612 
    613 /**
    614  * \author Ronen Kalish\n
    615  * \date 08-November-2005\n
    616  * \brief Handle a STOP_REQUEST event when in WAIT_FOR_DRIVER_MODE state by exiting driver mode.
    617  *
    618  * Function Scope \e Public.\n
    619  * \param hMeasurementSrv - handle to the Measurement SRV object.\n
    620  * \return always TI_OK.\n
    621  */
    622 TI_STATUS measurementSRVSM_stopFromWaitForDriverMode( TI_HANDLE hMeasurementSRV )
    623 {
    624     measurementSRV_t* pMeasurementSRV = (measurementSRV_t*)hMeasurementSRV;
    625 
    626     /* Switch Power Save SRV back to user mode */
    627     powerSrv_ReleasePS( pMeasurementSRV->hPowerSaveSRV, pMeasurementSRV->bSendNullDataWhenExitPs, NULL, NULL );
    628 
    629     /* if we are not running within a stop request context (shouldn't happen), call the CBs */
    630     if ( TI_FALSE == pMeasurementSRV->bInRequest )
    631     {
    632         TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": stop from wait for driver mode: not within a request context?!? \n");
    633 
    634         /* call the response CB - this shouldn't happen, as only GWSI has response CB, and it shouldn't call
    635            stop before driver */
    636         if ( NULL != pMeasurementSRV->commandResponseCBFunc )
    637         {
    638             TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": stop from wait for driver mode: command response CB is not NULL?!? \n");
    639             pMeasurementSRV->commandResponseCBFunc( pMeasurementSRV->commandResponseCBObj, TI_OK );
    640 
    641             pMeasurementSRV->commandResponseCBFunc = NULL;
    642             pMeasurementSRV->commandResponseCBObj = NULL;
    643         }
    644         /* call the complete CB */
    645         if ( NULL != pMeasurementSRV->measurmentCompleteCBFunc )
    646         {
    647             /* mark that all types has failed */
    648             TI_INT32 i;
    649             for ( i = 0; i < MAX_NUM_OF_MSR_TYPES_IN_PARALLEL; i++ )
    650             {
    651                 pMeasurementSRV->msrReply.msrTypes[ i ].status = TI_NOK;
    652             }
    653             /* call the complete CB */
    654             pMeasurementSRV->measurmentCompleteCBFunc( pMeasurementSRV->measurementCompleteCBObj,
    655                                                        &(pMeasurementSRV->msrReply));
    656         }
    657         else
    658         {
    659             TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": stop from wait for driver mode and response CB is NULL!!!\n");
    660         }
    661     }
    662     /* we are within a stop request context */
    663     else
    664     {
    665         /* if the command response Cb is valid, send a measure stop command to the FW -
    666            although it is not necessary, we need it to get a different context for the command response.
    667            This shouldn't happen, as only GWSI has command response, and it shouldn't call stop measure
    668            before it got the commadn response for start measure */
    669         if ( NULL != pMeasurementSRV->commandResponseCBFunc )
    670         {
    671             /* shouldn't happen - a command response is valid (GWSI) and stop measure called
    672                before measure start response was received (driver) */
    673             TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": stop from wait for driver mode - within request context and command response is not NULL?!?\n");
    674 
    675             cmdBld_CmdMeasurementStop (pMeasurementSRV->hCmdBld,
    676                                        (void *)pMeasurementSRV->commandResponseCBFunc,
    677                                        pMeasurementSRV->commandResponseCBObj);
    678 
    679             pMeasurementSRV->commandResponseCBFunc = NULL;
    680             pMeasurementSRV->commandResponseCBObj = NULL;
    681         }
    682         if ( NULL != pMeasurementSRV->measurmentCompleteCBFunc )
    683         {
    684             /* Note: this is being called from request context, but there's npthing else that can be done */
    685             /* mark that all types has failed */
    686             TI_INT32 i;
    687             for ( i = 0; i < MAX_NUM_OF_MSR_TYPES_IN_PARALLEL; i++ )
    688             {
    689                 pMeasurementSRV->msrReply.msrTypes[ i ].status = TI_NOK;
    690             }
    691             /* call the complete CB */
    692             pMeasurementSRV->measurmentCompleteCBFunc( pMeasurementSRV->measurementCompleteCBObj,
    693                                                        &(pMeasurementSRV->msrReply));
    694         }
    695     }
    696 
    697     return TI_OK;
    698 }
    699 
    700 /**
    701  * \author Ronen Kalish\n
    702  * \date 27-November-2005\n
    703  * \brief handle a STOP_REQUEST event when in WAIT_FOR_DRIVER_MODE by marking negative result status
    704  * \brief and calling the ordinary stop function
    705  *
    706  * Function Scope \e Public.\n
    707  * \param hMeasurementSrv - handle to the Measurement SRV object.\n
    708  * \return always TI_OK.\n
    709  */
    710 TI_STATUS measurementSRVSM_stopFromWaitForMeasureStart( TI_HANDLE hMeasurementSRV )
    711 {
    712     measurementSRV_t* pMeasurementSRV = (measurementSRV_t*)hMeasurementSRV;
    713     TI_INT32 i;
    714 
    715     /* mark that all types has failed */
    716     for ( i = 0; i < pMeasurementSRV->msrRequest.numberOfTypes; i++ )
    717     {
    718         pMeasurementSRV->msrReply.msrTypes[ i ].status = TI_NOK;
    719     }
    720 
    721     /* call the ordinary stop function (will send a measure stop command to FW) */
    722     measurementSRVSM_requestMeasureStop( hMeasurementSRV );
    723 
    724     return TI_OK;
    725 }
    726 
    727 /**
    728  * \author Ronen Kalish\n
    729  * \date 08-November-2005\n
    730  * \brief handle a STOP_REQUEST event when in MEASURE_IN_PROGRESS by stopping all measure types and
    731  * \brief requesting measure stop from the FW.\n
    732  *
    733  * Function Scope \e Public.\n
    734  * \param hMeasurementSrv - handle to the Measurement SRV object.\n
    735  * \return always TI_OK.\n
    736  */
    737 TI_STATUS measurementSRVSM_stopFromMeasureInProgress( TI_HANDLE hMeasurementSRV )
    738 {
    739     measurementSRV_t* pMeasurementSRV = (measurementSRV_t*)hMeasurementSRV;
    740     TNoiseHistogram   pNoiseHistParams;
    741     TI_STATUS         status;
    742     TI_INT32          i;
    743 
    744     /* stop all running measure types */
    745     for (i = 0; i < pMeasurementSRV->msrRequest.numberOfTypes; i++)
    746     {
    747         if (pMeasurementSRV->bRequestTimerRunning[i])
    748         {
    749             /* stop timer */
    750 			tmr_StopTimer (pMeasurementSRV->hRequestTimer[i]);
    751             pMeasurementSRV->bRequestTimerRunning[i] = TI_FALSE;
    752 
    753             /* if necessary, stop measurement type */
    754             switch ( pMeasurementSRV->msrRequest.msrTypes[ i ].msrType )
    755             {
    756             case MSR_TYPE_BEACON_MEASUREMENT:
    757                 /* send stop AP discovery command */
    758                 status = cmdBld_CmdApDiscoveryStop (pMeasurementSRV->hCmdBld, NULL, NULL);
    759                 if ( TI_OK != status )
    760                 {
    761                     TRACE1( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": TWD_ApDiscoveryStop returned status %d\n", status);
    762                 }
    763                 break;
    764 
    765             case MSR_TYPE_NOISE_HISTOGRAM_MEASUREMENT:
    766                 /* Set Noise Histogram Cmd Params */
    767                 pNoiseHistParams.cmd = STOP_NOISE_HIST;
    768                 pNoiseHistParams.sampleInterval = 0;
    769                 os_memoryZero( pMeasurementSRV->hOS, &(pNoiseHistParams.ranges[ 0 ]), MEASUREMENT_NOISE_HISTOGRAM_NUM_OF_RANGES );
    770 
    771                 /* Send a Stop command to the FW */
    772                 status = cmdBld_CmdNoiseHistogram (pMeasurementSRV->hCmdBld, &pNoiseHistParams, NULL, NULL);
    773 
    774                 if ( TI_OK != status )
    775                 {
    776                     TRACE1( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": TWD_NoiseHistogramCmd returned status %d\n", status);
    777                 }
    778                 break;
    779 
    780             /* These are just to avoid compilation warnings, nothing is actualy done here! */
    781             case MSR_TYPE_BASIC_MEASUREMENT:
    782             case MSR_TYPE_CCA_LOAD_MEASUREMENT:
    783             case MSR_TYPE_FRAME_MEASUREMENT:
    784             case MSR_TYPE_MAX_NUM_OF_MEASURE_TYPES:
    785             default:
    786                 TRACE1( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": unsupported measurement type: %d\n", pMeasurementSRV->msrRequest.msrTypes[ i ].msrType);
    787                 break;
    788             }
    789 
    790             /* mark that measurement has failed */
    791             pMeasurementSRV->msrReply.msrTypes[ i ].status = TI_NOK;
    792         }
    793     }
    794 
    795     /* Send Measurement Stop command to the FW */
    796     status = cmdBld_CmdMeasurementStop (pMeasurementSRV->hCmdBld,
    797                                         (void *)pMeasurementSRV->commandResponseCBFunc,
    798                                         pMeasurementSRV->commandResponseCBObj);
    799 
    800     pMeasurementSRV->commandResponseCBFunc = NULL;
    801     pMeasurementSRV->commandResponseCBObj = NULL;
    802 
    803     if ( TI_OK != status )
    804     {
    805         TRACE1( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": Failed to send measurement stop command, statud=%d,\n", status);
    806 
    807         /* send a measurement complete event - since it can't be stopped */
    808         measurementSRVSM_SMEvent( hMeasurementSRV, &(pMeasurementSRV->SMState),
    809                                   MSR_SRV_EVENT_STOP_COMPLETE );
    810         return TI_OK;
    811     }
    812 
    813     TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ": measure stop command sent.\n");
    814 
    815     /* start the FW guard timer */
    816     pMeasurementSRV->bStartStopTimerRunning = TI_TRUE;
    817     tmr_StartTimer (pMeasurementSRV->hStartStopTimer,
    818                     MacServices_measurementSRV_startStopTimerExpired,
    819                     (TI_HANDLE)pMeasurementSRV,
    820                     MSR_FW_GUARD_TIME,
    821                     TI_FALSE);
    822 
    823     return TI_OK;
    824 }
    825 
    826 /**
    827  * \author Ronen Kalish\n
    828  * \date 08-November-2005\n
    829  * \brief handle a DRIVER_MODE_FAILURE event by calling the response and complete CBs.\n
    830  *
    831  * Function Scope \e Public.\n
    832  * \param hMeasurementSrv - handle to the Measurement SRV object.\n
    833  * \return always TI_OK.\n
    834  */
    835 TI_STATUS measurementSRVSM_DriverModeFailure( TI_HANDLE hMeasurementSRV )
    836 {
    837     measurementSRV_t* pMeasurementSRV = (measurementSRV_t*)hMeasurementSRV;
    838 
    839     /* this function can be called from within a request (when the power save SRV returned an immediate error),
    840        or in a different context, when power save entry failed. The latter is a valid status, whereas the former
    841        indicates a severe error. However, as there is nothing to do with the former (other than debug it), the same
    842        failure indication is used for both of them, which will make the upper layer (Palau driver or TI measurement
    843        manager) to return to idle state. Still, for the former the error is returned as the return status from the
    844        measurement start API call whereas for the latter the error is indicated both by the command response and
    845        measurement complete CBs status */
    846 
    847     /* if we are running within a request context, don't call the CBs! The startMeasurement function
    848        will return an invalid status instead */
    849     if ( TI_FALSE == pMeasurementSRV->bInRequest )
    850     {
    851         /* if a response CB is available (GWSI) call it */
    852         if ( NULL != pMeasurementSRV->commandResponseCBFunc )
    853         {
    854             pMeasurementSRV->commandResponseCBFunc( pMeasurementSRV->commandResponseCBObj, TI_NOK );
    855         }
    856 
    857         /* if a complete CB is available (both GWSI and TI driver), call it */
    858         if ( NULL != pMeasurementSRV->measurmentCompleteCBFunc )
    859         {
    860             /* mark that all types has failed */
    861             TI_INT32 i;
    862             for ( i = 0; i < MAX_NUM_OF_MSR_TYPES_IN_PARALLEL; i++ )
    863             {
    864                 pMeasurementSRV->msrReply.msrTypes[ i ].status = TI_NOK;
    865             }
    866             /* call the complete CB */
    867             pMeasurementSRV->measurmentCompleteCBFunc( pMeasurementSRV->measurementCompleteCBObj,
    868                                                        &(pMeasurementSRV->msrReply));
    869         }
    870         else
    871         {
    872             TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": driver mode failure and complete CB is NULL!!!\n");
    873         }
    874     }
    875 
    876     return TI_OK;
    877 }
    878 
    879 /**
    880  * \author Ronen Kalish\n
    881  * \date 08-November-2005\n
    882  * \brief handle a START_FAILURE event by exiting driver mode and calling the complete CB.\n
    883  *
    884  * Function Scope \e Public.\n
    885  * \param hMeasurementSrv - handle to the Measurement SRV object.\n
    886  * \return always TI_OK.\n
    887  */
    888 TI_STATUS measurementSRVSM_measureStartFailure( TI_HANDLE hMeasurementSRV )
    889 {
    890     measurementSRV_t* pMeasurementSRV = (measurementSRV_t*)hMeasurementSRV;
    891 
    892     /* This function can be called from within a request context (if the driver mode entry process
    893        was immediate), or from the driver mode CB context. Regardless of teh context in which it runs,
    894        The error indicates that something is wrong in the HAL. There is no way to solve this (other than debug it).
    895        The error is either indicating by the measurement start API return status (if still in the request context),
    896        or by calling the response (if available, only in GWSI) and complete CBs with invalid status */
    897 
    898     /* Switch Power save SRV back to user mode */
    899     powerSrv_ReleasePS( pMeasurementSRV->hPowerSaveSRV, pMeasurementSRV->bSendNullDataWhenExitPs, NULL, NULL );
    900 
    901     /* if we are running within a request context, don't call the CB! The startMeasurement function
    902        will return an invalid status instead */
    903     if ( TI_FALSE == pMeasurementSRV->bInRequest )
    904     {
    905         /* if a response CB is available (GWSI) call it */
    906         if ( NULL != pMeasurementSRV->commandResponseCBFunc )
    907         {
    908             pMeasurementSRV->commandResponseCBFunc( pMeasurementSRV->commandResponseCBObj, TI_NOK );
    909         }
    910 
    911         /* if a complete CB is available (both GWSI and TI driver), call it */
    912         if ( NULL != pMeasurementSRV->measurmentCompleteCBFunc )
    913         {
    914             /* mark that all types has failed */
    915             TI_INT32 i;
    916             for ( i = 0; i < MAX_NUM_OF_MSR_TYPES_IN_PARALLEL; i++ )
    917             {
    918                 pMeasurementSRV->msrReply.msrTypes[ i ].status = TI_NOK;
    919             }
    920             /* call the complete CB */
    921             pMeasurementSRV->measurmentCompleteCBFunc( pMeasurementSRV->measurementCompleteCBObj,
    922                                                        &(pMeasurementSRV->msrReply));
    923         }
    924         else
    925         {
    926             TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_ERROR, ": Start measurement failure and response and complete CBs are NULL!!!\n");
    927         }
    928     }
    929 
    930     return TI_OK;
    931 }
    932 
    933 
    934 static void measurementSRVSM_requestMeasureStartResponseCB(TI_HANDLE hMeasurementSRV, TI_UINT32 uMboxStatus)
    935 {
    936 	measurementSRV_t* pMeasurementSRV = (measurementSRV_t*)hMeasurementSRV;
    937 	TI_INT32 i;
    938 
    939 TRACE1( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ": FW has responded with CMD_STATUS = %d\n", uMboxStatus);
    940 
    941 	if (uMboxStatus == TI_OK)
    942 	{
    943 TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ": FW has responded with CMD_STATUS_SUCCESS!\n");
    944 
    945 		if ( NULL != pMeasurementSRV->commandResponseCBFunc )
    946         {
    947             pMeasurementSRV->commandResponseCBFunc( pMeasurementSRV->commandResponseCBObj, TI_OK );
    948         }
    949 	}
    950 	else
    951 	{
    952 		if (uMboxStatus == SG_REJECT_MEAS_SG_ACTIVE)
    953 		{
    954 TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ": FW has responded with CMD_STATUS_REJECT_MEAS_SG_ACTIVE!\n");
    955 		}
    956 
    957 TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, ": FW has responded with CMD_STATUS NOK!!!\n");
    958 
    959 
    960 		/* if a timer is running, stop it */
    961 		if ( TI_TRUE == pMeasurementSRV->bStartStopTimerRunning )
    962 		{
    963 TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_INFORMATION, "***** STOP TIMER 8 *****\n");
    964 			tmr_StopTimer( pMeasurementSRV->hStartStopTimer );
    965 			pMeasurementSRV->bStartStopTimerRunning = TI_FALSE;
    966 		}
    967 		for ( i = 0; i < MAX_NUM_OF_MSR_TYPES_IN_PARALLEL; i++ )
    968 		{
    969 			if ( TI_TRUE == pMeasurementSRV->bRequestTimerRunning[ i ] )
    970 			{
    971 				tmr_StopTimer( pMeasurementSRV->hRequestTimer[ i ] );
    972 				pMeasurementSRV->bRequestTimerRunning[ i ] = TI_FALSE;
    973 			}
    974 		}
    975 
    976 		measurementSRVSM_SMEvent( hMeasurementSRV, &(pMeasurementSRV->SMState),
    977 											 MSR_SRV_EVENT_START_FAILURE );
    978 	}
    979 }
    980 
    981 
    982 /**
    983  * \author Ronen Kalish\n
    984  * \date 23-December-2005\n
    985  * \brief Handles a stop request when no stop is needed (SM is either idle or already send stop command to FW.\n
    986  *
    987  * Function Scope \e Private.\n
    988  * \param hMeasurementSrv - handle to the measurement SRV object.\n
    989  * \return always TI_OK.\n
    990  */
    991 TI_STATUS measurementSRVSRVSM_dummyStop( TI_HANDLE hMeasurementSrv )
    992 {
    993     measurementSRV_t *pMeasurementSRV = (measurementSRV_t*)hMeasurementSrv;
    994 
    995     TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_WARNING, ": sending unnecessary stop measurement command to FW...\n");
    996 
    997     /* send a stop command to FW, to obtain a different context in ehich to cal the command response CB */
    998     cmdBld_CmdMeasurementStop (pMeasurementSRV->hCmdBld,
    999                                (void *)pMeasurementSRV->commandResponseCBFunc,
   1000                                pMeasurementSRV->commandResponseCBObj);
   1001 
   1002     pMeasurementSRV->commandResponseCBFunc = NULL;
   1003     pMeasurementSRV->commandResponseCBObj = NULL;
   1004 
   1005     return TI_OK;
   1006 }
   1007 
   1008 /**
   1009  * \author Ronen Kalish\n
   1010  * \date 17-November-2005\n
   1011  * \brief Handles an unexpected event.\n
   1012  *
   1013  * Function Scope \e Private.\n
   1014  * \param hMeasurementSrv - handle to the measurement SRV object.\n
   1015  * \return always TI_OK.\n
   1016  */
   1017 TI_STATUS actionUnexpected( TI_HANDLE hMeasurementSrv )
   1018 {
   1019     measurementSRV_t *pMeasurementSRV = (measurementSRV_t*)hMeasurementSrv;
   1020     TI_INT32 i;
   1021 
   1022     TRACE0( pMeasurementSRV->hReport, REPORT_SEVERITY_SM, ": measurement SRV state machine error, unexpected Event\n");
   1023 
   1024     if (pMeasurementSRV->bStartStopTimerRunning)
   1025     {
   1026 		tmr_StopTimer (pMeasurementSRV->hStartStopTimer);
   1027         pMeasurementSRV->bStartStopTimerRunning = TI_FALSE;
   1028     }
   1029 
   1030     for (i = 0; i < MAX_NUM_OF_MSR_TYPES_IN_PARALLEL; i++)
   1031     {
   1032         if (pMeasurementSRV->bRequestTimerRunning[i])
   1033         {
   1034 			tmr_StopTimer (pMeasurementSRV->hRequestTimer[i]);
   1035             pMeasurementSRV->bRequestTimerRunning[i] = TI_FALSE;
   1036         }
   1037     }
   1038 
   1039     /* we must clean the old command response CB since they are no longer relevant
   1040       since the state machine may be corrupted */
   1041     pMeasurementSRV->commandResponseCBFunc = NULL;
   1042     pMeasurementSRV->commandResponseCBObj = NULL;
   1043 
   1044     /* indicate the unexpected event in the return status */
   1045     pMeasurementSRV->returnStatus = TI_NOK;
   1046 
   1047     return TI_OK;
   1048 }
   1049 
   1050 /**
   1051  * \author Ronen Kalish\n
   1052  * \date 10-Jan-2005\n
   1053  * \brief Handles an event that doesn't require any action.\n
   1054  *
   1055  * Function Scope \e Private.\n
   1056  * \param hMeasurementSrv - handle to the measurement SRV object.\n
   1057  * \return always TI_OK.\n
   1058  */
   1059 TI_STATUS actionNop( TI_HANDLE hMeasurementSrv )
   1060 {
   1061     return TI_OK;
   1062 }
   1063 
   1064