FreeCalypso > hg > fc-selenite
diff src/g23m-gprs/grr/grr_css.c @ 1:d393cd9bb723
src/g23m-*: initial import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 15 Jul 2018 04:40:46 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/grr/grr_css.c Sun Jul 15 04:40:46 2018 +0000 @@ -0,0 +1,1715 @@ +/* ++----------------------------------------------------------------------------- +| Project : GPRS (8441) +| Modul : GRR ++----------------------------------------------------------------------------- +| Copyright 2002 Texas Instruments Berlin, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| The receipt of or possession of this file does not convey +| any rights to reproduce or disclose its contents or to +| manufacture, use, or sell anything it may describe, in +| whole, or in part, without the specific written consent of +| Texas Instruments Berlin, AG. ++----------------------------------------------------------------------------- +| Purpose : This module implements signal handler functions for service +| CS of entity GRR. ++----------------------------------------------------------------------------- +*/ + +#ifndef GRR_CSS_C +#define GRR_CSS_C +#endif + +#define ENTITY_GRR + +/*==== INCLUDES =============================================================*/ + +#include "typedefs.h" /* to get Condat data types */ + +#include "vsi.h" /* to get a lot of macros */ +#include "macdef.h" +#include "gprs.h" +#include "gsm.h" /* to get a lot of macros */ +#include "ccdapi.h" /* to get CCD API */ +#include "cnf_grr.h" /* to get cnf-definitions */ +#include "mon_grr.h" /* to get mon-definitions */ +#include "prim.h" /* to get the definitions of used SAP and directions */ +#include "message.h" +#include "grr.h" /* to get the global entity definitions */ +#include "grr_f.h" +#include "grr_css.h" +#include "grr_csf.h" +#include "grr_meass.h" +#include "grr_pgs.h" +#include "grr_tcs.h" + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + + +EXTERN T_NC_DATA* nc_data; + +/*==== PRIVATE FUNCTIONS ====================================================*/ +/* ++------------------------------------------------------------------------------ +| Function : cs_cell_change_order_ind ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : *d_cell_chan_order - Ptr to packet cell change order message +| ++------------------------------------------------------------------------------ +*/ +LOCAL void cs_cell_change_order_ind ( T_nc_meas_par *nc_meas_par, + UBYTE v_nc_freq_list, + T_nc_freq_list *nc_freq_list +#if defined (REL99) AND defined (TI_PS_FF_EMR) + , UBYTE v_enh_meas_param_pcco, + T_enh_meas_param_pcco *enh_meas_param_pcco +#endif + ) + + +{ + TRACE_FUNCTION( "cs_cell_change_order_ind" ); + + switch( GET_STATE( CS ) ) + { + case CS_IDLE: + + /* process the CS main process */ + SET_STATE( CS, CS_CR_NETWORK ); + + cs_process_cc_order( nc_meas_par, v_nc_freq_list, nc_freq_list +#if defined (REL99) AND defined (TI_PS_FF_EMR) + , v_enh_meas_param_pcco, enh_meas_param_pcco +#endif + ); + + + + if( grr_is_pbcch_present( ) EQ TRUE ) + { + if( grr_data->cs_meas.packet_mode NEQ PACKET_MODE_PTM ) + { + cs_send_cr_meas_stop_req( ); + } + } + + grr_data->cs_meas.packet_mode = PACKET_MODE_NULL; + + /*cs_init_nc_ref_list( &grr_data->db.nc_ref_lst );*/ + + /* inform service MEAS about stop of cell re-selection measurements */ + sig_cs_meas_stop( ); + + /* process the CS measurement process */ + cs_cancel_meas_report( ); + + SET_STATE( CS_MEAS, CS_MEAS_NULL ); + + cs_process_t3158( ); + + TRACE_EVENT_P4( "NC Cell Re-Selection Parameter: %d %d %d %d", + cs_get_network_ctrl_order( FALSE ), + grr_data->db.nc_ref_lst.param->rep_per_i, + grr_data->db.nc_ref_lst.param->rep_per_t, + grr_data->db.nc_ref_lst.param->non_drx_per ); + break; + + default: + TRACE_ERROR( "PACKET CELL CHANGE ORDER unexpected" ); + break; + } +}/* cs_cell_change_order_ind */ + +/* ++------------------------------------------------------------------------------ +| Function : cs_all_cells_with_cr_param ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : ++------------------------------------------------------------------------------ +*/ +LOCAL BOOL cs_all_cells_with_cr_param ( void ) +{ + UBYTE i; /* used for counting */ + BOOL all_cells_with_cr_param = TRUE; + + TRACE_FUNCTION( "cs_all_cells_with_cr_param" ); + + for( i = 0; + i < grr_data->db.nc_ref_lst.number AND all_cells_with_cr_param EQ TRUE; + i++ ) + { + all_cells_with_cr_param = grr_data->db.nc_ref_lst.info[i]->v_cr_par; + } + + return( all_cells_with_cr_param ); +}/* cs_all_cells_with_cr_param */ + +/*==== PUBLIC FUNCTIONS =====================================================*/ +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_start ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_START +| +| Parameters : dummy - description of parameter dummy +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_start ( void) +{ + UBYTE state = GET_STATE( CS ); +#if defined (REL99) AND defined (TI_PS_FF_EMR) + UBYTE psi3_cm = grr_get_psi3_cm(); +#endif + + TRACE_ISIG( "sig_ctrl_cs_start" ); + + switch( state ) + { + case CS_NULL: + SET_STATE( CS, CS_IDLE ); + + /*lint -fallthrough*/ + + case CS_IDLE: + + /*lint -fallthrough*/ + + case CS_CR_MOBILE: + case CS_CR_NETWORK: + + grr_data->db.scell_info.cell_barred = FALSE; + grr_data->cs.reselect_cause = CS_RESELECT_CAUSE_CS_NORMAL; + +#if defined (REL99) AND defined (TI_PS_FF_EMR) + /* If PCCO is received with PSI3_CM and BA_IND, then NC_FREQ list is + used in the network directed cell, only if PSI3_CM and BA_IND matches + with the ones received in PSIs or SIs in the new cell */ + if( state EQ CS_CR_NETWORK ) + { + if( ( grr_is_pbcch_present() AND (psc_db->nc_ms.psi3_cm NEQ NOT_SET) AND + (psc_db->nc_ms.psi3_cm NEQ psi3_cm) ) + OR + ( !grr_is_pbcch_present() AND (psc_db->nc_ms.ba_ind NEQ NOT_SET) AND + (psc_db->nc_ms.ba_ind NEQ psc_db->ba_ind) ) ) + { + psc_db->nc_ms.ncmeas.list.number = 0; + psc_db->nc_ms.rfreq.number = 0; + } + psc_db->nc_ms.psi3_cm = NOT_SET; + psc_db->nc_ms.ba_ind = NOT_SET; + } +#endif + + + if( grr_is_pbcch_present( ) ) + { + grr_data->cs.is_upd_ncell_stat_needed = TRUE; + + cs_build_nc_ref_list( psc_db, FALSE ); + cs_reset_nc_change_mark( psc_db ); + cs_send_cr_meas_req( CS_DELETE_MEAS_RSLT ); + sig_cs_meas_start( ); + } + else + { + cs_init_nc_mval_lst( ); + cs_build_nc_ref_list( psc_db, FALSE ); + cs_reset_nc_change_mark( psc_db ); + + if( state EQ CS_CR_NETWORK ) + { + cs_send_update_ba_req ( psc_db ); + } + } + + cs_process_t3158( ); + + TRACE_EVENT_P4( "NC Cell Re-Selection Parameter: %d %d %d %d", + cs_get_network_ctrl_order( FALSE ), + grr_data->db.nc_ref_lst.param->rep_per_i, + grr_data->db.nc_ref_lst.param->rep_per_t, + grr_data->db.nc_ref_lst.param->non_drx_per ); + break; + + default: + /* do nothing */ + break; + } +} /* sig_ctrl_cs_start() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_stop ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_STOP +| +| Parameters : dummy - description of parameter dummy +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_stop ( T_CS_DC_STATUS dc_stat ) +{ + TRACE_ISIG( "sig_ctrl_cs_stop" ); + + switch(dc_stat) + { + case CS_DC_DEDICATED: + cs_stop_t3158( ); + cs_reset_all_rxlev_results( ); + /* + * Stop rx_lev averaging when NC=1 or NC=2 in ALR + */ + if( grr_is_pbcch_present( ) EQ FALSE AND + grr_data->cs_meas.nc_meas_cause NEQ NC_STOP_MEAS ) + { + cs_send_meas_rep_req ( NC_STOP_MEAS ); + } + break; + case CS_DC_OTHER: + default: + /* do nothing */ + break; + } + + switch( GET_STATE( CS ) ) + { + case CS_NULL: + /* do nothing */ + break; + + case CS_IDLE: + SET_STATE( CS, CS_NULL ); + + /*lint -fallthrough*/ + + case CS_CR_NETWORK: + cs_stop_t_reselect( ); + + /*lint -fallthrough*/ + + default: + cs_cancel_meas_report( ); + grr_data->cs.nc_sync_rep_pd = 0; + + SET_STATE( CS_MEAS, CS_MEAS_NULL ); + + if( GET_STATE( CS ) NEQ CS_CR_MOBILE AND + grr_is_pbcch_present( ) EQ TRUE AND + grr_data->cs_meas.packet_mode NEQ PACKET_MODE_PTM ) + { + cs_send_cr_meas_stop_req( ); + } + + grr_data->cs_meas.packet_mode = PACKET_MODE_NULL; + + if( grr_t_status( T3158) NEQ 0 ) + { + vsi_t_stop( GRR_handle, T3158); + TRACE_EVENT( "Timer T3158 stopped" ); + } + + /*cs_init_nc_ref_list( &grr_data->db.nc_ref_lst );*/ + + /* inform service MEAS about stop of cell re-selection measurements */ + sig_cs_meas_stop( ); + break; + } +} /* sig_ctrl_cs_stop() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_check_bsic_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_CHECK_BSIC_IND +| +| Parameters : rrgrr_check_bsic_ind - pointer to primitive +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_check_bsic_ind + ( T_RRGRR_NCELL_SYNC_IND *rrgrr_check_bsic_ind ) +{ + TRACE_ISIG( "sig_ctrl_cs_check_bsic_ind" ); + + switch( GET_STATE( CS ) ) + { + case CS_IDLE: + case CS_CR_MOBILE: + case CS_CR_NETWORK: + cs_compare_bsic( rrgrr_check_bsic_ind ); + break; + + default: + TRACE_ERROR( "SIG_CTRL_CS_CHECK_BSIC_IND unexpected" ); + break; + } +} /* sig_ctrl_cs_check_bsic_ind() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_cc_result ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_CC_RESULT +| +| Parameters : cc_status - if cc_status is true then cell reselection was +| successful performed. Otherwise cell reselection is +| failed. +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_cc_result ( BOOL cc_status ) +{ + TRACE_ISIG( "sig_ctrl_cs_cc_result" ); + + switch( GET_STATE( CS ) ) + { + case CS_CR_MOBILE: + if( cc_status ) + { + /* + * Cell Reselection with the given candidate was successfull + */ + SET_STATE( CS, CS_NULL ); + + cs_stop_t_reselect( ); + } + else + { + /* + * Cell Reselection with the given candidate was NOT successfull + */ + SET_STATE( CS, CS_IDLE ); + + cs_cr_decision( CRDM_CR_CONT ); + } + break; + + case CS_CR_NETWORK: + /* + * Timer T_RESLECT should be stopped during processing of a + * Packet Cell Change Order. Timer T3174 is used instead. + */ + cs_stop_t_reselect( ); + + if( cc_status ) + { + /* + * network controlled cell re-selection was successfull, so we + * stay in the already selected cell and just go to idle mode, + * cell re-slection measurements are already requested so no + * further action is required. + */ + SET_STATE( CS, CS_IDLE ); + } + else + { + /* + * network controlled cell re-selection was unsuccessfull, so + * we are back in the old cell and start of cell re-selection + * measurements will be requested immediately. + */ + SET_STATE( CS, CS_NULL ); + } + break; + + default: + TRACE_EVENT( "SIG_CTRL_CS_CC_RESULT unexpected" ); + break; + } +} /* sig_ctrl_cs_cc_result() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_gmm_state ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_GMM_STATE +| If this signal is received GMM has changed its state. +| +| Parameters : state +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_gmm_state (T_GMM_STATES state ) +{ + T_NC_ORDER ctrl_order; + + TRACE_ISIG( "sig_ctrl_cs_gmm_state " ); + + switch( GET_STATE( CS ) ) + { + case CS_IDLE: + case CS_CR_MOBILE: + case CS_CR_NETWORK: + + if( state EQ READY_STATE ) + { + grr_data->cs.gmm_state = state; + ctrl_order = cs_get_network_ctrl_order( TRUE ); + } + else + { + ctrl_order = cs_get_network_ctrl_order( TRUE ); + /* A set of measurement reporting parameters (NETWORK_CONTROL_ORDER and + * NC_REPORTING_PERIOD(s)) is broadcast on PBCCH. The parameters may also + * be sent individually to an MS on PCCCH or PACCH, in which case it + * overrides the broadcast parameters. The individual parameters are valid + * until the RESET command is sent to the MS or there is a downlink + * signalling failure or the MS goes to the Standby state or the MS enters + * dedicated mode. */ + cs_reset_meas_rep_params (psc_db); + grr_data->cs.gmm_state = state; + } + + if( grr_is_pbcch_present( ) EQ TRUE AND + ctrl_order EQ NC_NC2 AND + cs_all_cells_with_cr_param( ) EQ FALSE ) + { + cs_send_cr_meas_req( CS_DELETE_MEAS_RSLT ); + } + + if( cs_is_meas_reporting( ) EQ FALSE ) + { + cs_build_nc_ref_list( psc_db, FALSE ); + /* if we already sent a measurement report to L1 then GRR should wait untill + mphp_single_block_con comes from the L1, GRR should not send stop_single_block_req + cs_cancel_meas_report( ); */ + } + + cs_process_t3158( ); + break; + + default: + grr_data->cs.gmm_state = state; + break; + } +} /* sig_ctrl_cs_gmm_state () */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_reselect ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_RESELECT +| +| Parameters : state +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_reselect ( T_CS_RESELECT_CAUSE reselect_cause ) +{ + TRACE_ISIG( "sig_ctrl_cs_reselect" ); + + switch( GET_STATE( CS ) ) + { + case CS_NULL: + case CS_IDLE: + grr_data->db.scell_info.cell_barred = TRUE; + grr_data->cs.reselect_cause = reselect_cause; + + cs_cr_decision( CRDM_CR_CTRL ); + break; + + default: + TRACE_ERROR( "SIG_CTRL_CS_RESELECT unexpected" ); + break; + } +} /* sig_ctrl_cs_reselect () */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_ptm ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_PTM +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_ptm ( void ) +{ + TRACE_ISIG( "sig_ctrl_cs_ptm" ); + + if( grr_data->cs_meas.packet_mode NEQ PACKET_MODE_PTM ) + { + sig_ctrl_tc_delete_cs_msg (); + switch( GET_STATE( CS ) ) + { + case CS_NULL: + grr_data->cs_meas.packet_mode = PACKET_MODE_PTM; + break; + + case CS_IDLE: + case CS_CR_MOBILE: + case CS_CR_NETWORK: + grr_data->cs_meas.packet_mode = PACKET_MODE_PTM; + + /* + * reset the update condition in GRR + */ + if( !grr_is_pbcch_present( ) ) + { + cs_send_cr_meas_stop_req( ); + } + + cs_process_t3158( ); + break; + + default: + TRACE_ERROR( "SIG_CTRL_CS_PTM unexpected" ); + break; + } + } + +#ifdef _SIMULATION_ + + else + { + TRACE_EVENT( "Service CS is already in PTM" ); + } + +#endif /* #ifdef _SIMULATION_ */ + +} /* sig_ctrl_cs_ptm() */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_leave_to_pam ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_LEAVE_TO_PAM. +| If this signal is received GRR starts the packet access +| procedure. +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_leave_to_pam ( void ) +{ + TRACE_ISIG( "sig_ctrl_cs_leave_to_pam" ); + + + if( grr_data->cs_meas.packet_mode NEQ PACKET_MODE_PAM AND + grr_data->cs_meas.packet_mode NEQ PACKET_MODE_PTM ) + { + switch( GET_STATE( CS ) ) + { + case CS_NULL: + grr_data->cs_meas.packet_mode = PACKET_MODE_PAM; + break; + + case CS_IDLE: + case CS_CR_MOBILE: + case CS_CR_NETWORK: + grr_data->cs_meas.packet_mode = PACKET_MODE_PAM; + + /* + * reset the update condition in GRR + */ + if( !grr_is_pbcch_present( ) ) + { + cs_send_cr_meas_stop_req( ); + } + break; + + default: + TRACE_ERROR( "SIG_CTRL_CS_LEAVE_TO_PAM unexpected" ); + break; + } + } + +#ifdef _SIMULATION_ + + else + { + TRACE_EVENT( "Service CS is already in PAM" ); + } + +#endif /* #ifdef _SIMULATION_ */ + +} /* sig_ctrl_cs_leave_to_pam () */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_enter_pam ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_ENTER_PAM. +| If this signal is received GRR starts the packet access +| procedure. +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_enter_pam ( void ) +{ + T_PACKET_MODE packet_mode = grr_data->cs_meas.packet_mode; + + TRACE_ISIG( "sig_ctrl_cs_enter_pam" ); + + if( packet_mode EQ PACKET_MODE_PTM ) + { + switch( GET_STATE( CS ) ) + { + case CS_NULL: + grr_data->cs_meas.packet_mode = PACKET_MODE_PAM; + break; + + case CS_IDLE: + grr_data->cs_meas.packet_mode = PACKET_MODE_PAM; + + if( grr_is_pbcch_present( ) EQ TRUE ) + { + cs_send_cr_meas_req( CS_KEEP_MEAS_RSLT ); + } + + cs_process_t3158( ); + break; + + case CS_CR_NETWORK: + grr_data->cs_meas.packet_mode = PACKET_MODE_PAM; + + cs_process_t3158( ); + break; + + default: + TRACE_ERROR( "SIG_CTRL_CS_ENTER_PAM unexpected" ); + break; + } + } + +#ifdef _SIMULATION_ + + else + { + TRACE_EVENT( "Service CS is already in PAM" ); + } + +#endif /* #ifdef _SIMULATION_ */ + +} /* sig_ctrl_cs_enter_pam () */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_pim ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_PIM +| If this signal is received GRR returns in packet idle mode. +| Cell reselection measurements has to restarted in idle mode. +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_pim ( void ) +{ + T_PACKET_MODE packet_mode = grr_data->cs_meas.packet_mode; + + TRACE_ISIG( "sig_ctrl_cs_pim" ); + + if( packet_mode NEQ PACKET_MODE_PIM ) + { + switch( GET_STATE( CS ) ) + { + case CS_NULL: + grr_data->cs_meas.packet_mode = PACKET_MODE_PIM; + break; + + case CS_IDLE: + grr_data->cs_meas.packet_mode = PACKET_MODE_PIM; + + if( grr_is_pbcch_present( ) EQ TRUE AND + packet_mode EQ PACKET_MODE_PTM ) + { + cs_send_cr_meas_req( CS_KEEP_MEAS_RSLT ); + } + + cs_process_t3158( ); + break; + + case CS_CR_NETWORK: + grr_data->cs_meas.packet_mode = PACKET_MODE_PIM; + + cs_process_t3158( ); + break; + + default: + TRACE_ERROR( "SIG_CTRL_CS_PIM unexpected" ); + break; + } + } + +#ifdef _SIMULATION_ + + else + { + TRACE_EVENT( "Service CS is already in PIM" ); + } + +#endif /* #ifdef _SIMULATION_ */ + +} /* sig_ctrl_cs_pim () */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_meas_rep_cnf ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_MEAS_REP_CNF +| +| Parameters : rrgrr_meas_rep_cnf - Pointer to primitive payload +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_meas_rep_cnf (T_RRGRR_MEAS_REP_CNF *rrgrr_meas_rep_cnf) +{ + +#if defined (REL99) AND defined (TI_PS_FF_EMR) +BOOL is_enh_meas = cs_is_enh_meas_reporting(); +#endif + + TRACE_ISIG( "sig_ctrl_cs_meas_rep_cnf" ); + + switch( GET_STATE( CS ) ) + { + case CS_IDLE: + switch( GET_STATE( CS_MEAS ) ) + { + case( CS_MEAS_REP_REQ ): + cs_store_meas_rep_cnf( rrgrr_meas_rep_cnf ); + cs_build_strongest( ); + + SET_STATE( CS_MEAS, CS_MEAS_PMR_SENDING ); +#if defined (REL99) AND defined (TI_PS_FF_EMR) + if( ((is_enh_meas EQ TRUE) AND (cs_send_enh_meas_rpt() EQ FALSE)) + OR + ((is_enh_meas EQ FALSE) AND (cs_send_meas_rpt(TRUE) EQ FALSE)) ) +#else + if(cs_send_meas_rpt( TRUE ) EQ FALSE ) +#endif + { + /* + * The additional state check is necessary because signals might + * be send during the processing of the function cs_send_meas_rpt. + */ + if( GET_STATE( CS_MEAS ) EQ CS_MEAS_PMR_SENDING ) + { + SET_STATE( CS_MEAS, CS_MEAS_NULL ); + /* + cs_process_t3158( ); + */ + } + } + break; + + default: + TRACE_ERROR( "SIG_CTRL_CS_MEAS_REP_CNF unexpected 1" ); + break; + } + break; + + default: + TRACE_ERROR( "SIG_CTRL_CS_MEAS_REP_CNF unexpected 2" ); + break; + } +} /* sig_ctrl_cs_meas_rep_cnf () */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_meas_cs_meas_order ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_MEAS_CS_MEAS_ORDER +| +| Parameters : dummy - description of parameter dummy +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_meas_cs_meas_order ( T_NC_ORDER prev_ctrl_order ) +{ + T_NC_ORDER ctrl_order; + T_NC_ORDER applied_ctrl_order; + T_NC_ORDER prev_applied_ctrl_order; + + TRACE_ISIG( "sig_meas_cs_meas_order" ); + + switch( GET_STATE( CS ) ) + { + case CS_IDLE: + case CS_CR_NETWORK: + cs_build_nc_ref_list( psc_db, FALSE ); + + if( grr_is_pbcch_present( ) ) + { + /* begin temporary replacement of NETWORK CONTROL ORDER value */ + ctrl_order = cs_get_network_ctrl_order( FALSE ); + + grr_data->db.nc_ref_lst.param->ctrl_order = prev_ctrl_order; + prev_applied_ctrl_order = cs_get_network_ctrl_order( TRUE ); + + grr_data->db.nc_ref_lst.param->ctrl_order = ctrl_order; + applied_ctrl_order = cs_get_network_ctrl_order( TRUE ); + /* end temporary replacement of NETWORK CONTROL ORDER value */ + + if( + ( + psc_db->nc_cw.list.chng_mrk.prev NEQ + psc_db->nc_cw.list.chng_mrk.curr + OR + psc_db->nc_ms.ncmeas.list.chng_mrk.prev NEQ + psc_db->nc_ms.ncmeas.list.chng_mrk.curr + ) + OR + ( + ( + ( + applied_ctrl_order EQ NC_NC2 AND + prev_applied_ctrl_order NEQ NC_NC2 + ) + OR + ( + applied_ctrl_order NEQ NC_NC2 AND + prev_applied_ctrl_order EQ NC_NC2 + ) + ) + AND + ( + cs_all_cells_with_cr_param( ) EQ FALSE + ) + ) + ) + { + cs_send_cr_meas_req( CS_DELETE_MEAS_RSLT ); + + psc_db->nc_cw.list.chng_mrk.prev = psc_db->nc_cw.list.chng_mrk.curr; + psc_db->nc_ms.ncmeas.list.chng_mrk.prev = + psc_db->nc_ms.ncmeas.list.chng_mrk.curr; + } + } + else + { + if( + psc_db->nc_cw.list.chng_mrk.prev NEQ + psc_db->nc_cw.list.chng_mrk.curr + OR + psc_db->nc_ms.ncmeas.list.chng_mrk.prev NEQ + psc_db->nc_ms.ncmeas.list.chng_mrk.curr + OR + prev_ctrl_order NEQ + cs_get_network_ctrl_order( FALSE ) + ) + { + cs_send_update_ba_req ( psc_db ); + + if( grr_data->cs_meas.packet_mode EQ PACKET_MODE_PTM ) + { + cs_send_cr_meas_req( CS_DELETE_MEAS_RSLT ); + } + + psc_db->nc_cw.list.chng_mrk.prev = psc_db->nc_cw.list.chng_mrk.curr; + psc_db->nc_ms.ncmeas.list.chng_mrk.prev = + psc_db->nc_ms.ncmeas.list.chng_mrk.curr; + } + } + + if( + psc_db->nc_cw.param.chng_mrk.prev NEQ + psc_db->nc_cw.param.chng_mrk.curr + OR + psc_db->nc_ms.ncmeas.param.chng_mrk.prev NEQ + psc_db->nc_ms.ncmeas.param.chng_mrk.curr + ) + { + if( cs_is_meas_reporting( ) EQ FALSE ) + { + cs_cancel_meas_report( ); + } + + cs_process_t3158( ); + + psc_db->nc_cw.param.chng_mrk.prev = psc_db->nc_cw.param.chng_mrk.curr; + psc_db->nc_ms.ncmeas.param.chng_mrk.prev = + psc_db->nc_ms.ncmeas.param.chng_mrk.curr; + } + + TRACE_EVENT_P4( "NC Cell Re-Selection Parameter: %d %d %d %d", + cs_get_network_ctrl_order( FALSE ), + grr_data->db.nc_ref_lst.param->rep_per_i, + grr_data->db.nc_ref_lst.param->rep_per_t, + grr_data->db.nc_ref_lst.param->non_drx_per ); + break; + + default: + TRACE_ERROR( "SIG_MEAS_CS_MEAS_ORDER unexpected" ); + break; + } +} /* sig_meas_cs_meas_order() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_install_new_scell ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_install_new_scell ( void ) +{ + TRACE_ISIG( "sig_ctrl_cs_install_new_scell" ); + + grr_data->db.cr_cell = NULL; + + grr_set_db_ptr( DB_MODE_CC_ACC ); + /* cs_build_nc_ref_list( posc_db, FALSE ); */ + /* cs_reset_nc_change_mark( posc_db ); */ + +}/* sig_ctrl_cs_install_new_scell */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_start_cell_selection ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_start_cell_selection ( UBYTE cr_type ) +{ + TRACE_ISIG( "sig_ctrl_cs_start_cell_selection" ); + + switch( GET_STATE( CS ) ) + { + case( CS_NULL ): + case( CS_IDLE ): + case( CS_CR_MOBILE ): + + switch( cr_type ) + { + case( CR_NEW ): + TRACE_EVENT( "CTRL->CS: start cell re-selection" ); + + grr_data->db.cr_cell->mode = CS_MODE_SELECTION_PERFORMED; + + SET_STATE( CS, CS_CR_MOBILE ); + + cs_start_t_reselect( ); + break; + + case( CR_CS ): + TRACE_EVENT( "CTRL->CS: start cell selection" ); + + SET_STATE( CS, CS_NULL ); + + cs_stop_t_reselect( ); + break; + + case( CR_CONT ): + TRACE_EVENT( "CTRL->CS: continue cell (re-)selection" ); + break; + + default: + TRACE_ASSERT( cr_type EQ CR_NEW OR + cr_type EQ CR_CS OR + cr_type EQ CR_CONT ); + break; + } + break; + case( CS_CR_NETWORK ): + + switch( cr_type ) + { + case( CR_NEW ): + case( CR_NEW_NOT_SYNCED ): + TRACE_EVENT( "CTRL->CS: CS_CR_NETWORK:cell re-selection" ); + + grr_data->db.cr_cell->mode = CS_MODE_SELECTION_PERFORMED; + + /* + * Timer T_RESLECT should be stopped during processing of a + * Packet Cell Change Order. Timer T3174 is used instead. + */ + break; + + default: + TRACE_ASSERT( cr_type EQ CR_NEW OR cr_type EQ CR_NEW_NOT_SYNCED ); + break; + } + break; + + default: + TRACE_ERROR( "SIG_CTRL_CS_START_CELL_SELECTION unexpected" ); + break; + } +}/* sig_ctrl_cs_start_cell_selection */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_cc_order_ind ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_cc_order_ind ( T_D_CELL_CHAN_ORDER *d_cell_chan_order, + T_D_CHANGE_ORDER *d_change_order ) +{ + TRACE_ISIG( "sig_ctrl_cs_cc_order_ind" ); + + if( d_cell_chan_order NEQ NULL ) + { + if( d_change_order EQ NULL ) + { + cs_cell_change_order_ind + ( &d_cell_chan_order->tgt_cell_gsm_info.gsm_target_cell.nc_meas_par_list.nc_meas_par, + d_cell_chan_order->tgt_cell_gsm_info.gsm_target_cell.nc_meas_par_list.v_nc_freq_list, + &d_cell_chan_order->tgt_cell_gsm_info.gsm_target_cell.nc_meas_par_list.nc_freq_list +#if defined (REL99) AND defined (TI_PS_FF_EMR) + , d_cell_chan_order->tgt_cell_gsm_info.gsm_target_cell.release_98_str_pcco.v_release_99_str_pcco, + &d_cell_chan_order->tgt_cell_gsm_info.gsm_target_cell.release_98_str_pcco.release_99_str_pcco.enh_meas_param_pcco +#endif + ); + } + else + { + TRACE_ERROR( "Call error 1 in sig_ctrl_cs_cc_order_ind" ); + } + } + else if( d_change_order NEQ NULL ) + { + T_nc_meas_par nc_meas_par; + + nc_meas_par.v_nc_meas_per = FALSE; + + switch( d_change_order->nc_mode.ncm ) + { + case( NC_0 ): nc_meas_par.ctrl_order = NCMEAS_NC0; break; + case( NC_1 ): nc_meas_par.ctrl_order = NCMEAS_NC1; break; + case( NC_2 ): nc_meas_par.ctrl_order = NCMEAS_NC2; break; + case( NC_TARGET ): + default : nc_meas_par.ctrl_order = NCMEAS_RESET; break; + } + + cs_cell_change_order_ind( &nc_meas_par, FALSE, NULL +#if defined (REL99) AND defined (TI_PS_FF_EMR) + , FALSE, NULL +#endif + ); + } + else + { + TRACE_ERROR( "Call error 2 in sig_ctrl_cs_cc_order_ind" ); + } +}/* sig_ctrl_cs_cc_order_ind */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_check_c1_new_scell ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL BOOL sig_ctrl_cs_check_c1_new_scell ( BOOL cell_change_order, + UBYTE gprs_rxlev_access_min, + UBYTE gprs_ms_txpwr_max_cch ) +{ + BOOL result = TRUE; + T_ncell_info *ncell_info; + T_NC_MVAL *nc_mval; + T_CR_PAR_1 cr_par_1; + T_CR_CRITERIONS cr_crit; + + TRACE_ISIG( "sig_ctrl_cs_check_c1_new_scell" ); + + /* + * GRR should not recalculate the C1 value for the serving cell once received + * the System Information on the new cell in case a cell change order has been + * processed previously. + */ + if( cell_change_order EQ FALSE ) + { + if( grr_data->db.cr_cell NEQ NULL ) + { + nc_mval = &grr_data->db.nc_mval_list.nc_mval[grr_data->db.cr_cell->idx]; + ncell_info = grr_get_ncell_info( nc_mval->arfcn, nc_mval->sync_info.bsic ); + + if( ncell_info NEQ NULL ) + { + cr_par_1.cr_pow_par.gprs_rxlev_access_min = gprs_rxlev_access_min; + cr_par_1.cr_pow_par.gprs_ms_txpwr_max_cch = gprs_ms_txpwr_max_cch; + + /* + * the HCS parameter are not present because + * they are not determined by the entity RR + */ + cr_par_1.v_hcs_par = FALSE; + + /* + * calculate the cell re-selection criterions for the new serving cell + * taking under account the new cell re-selection parameters determined + * by the entity RR + */ + cs_calc_cr_criterion( &cr_crit, + ncell_info->arfcn, + &nc_mval->rla_p, + &cr_par_1 ); + + TRACE_EVENT_P1( "RECALC C1 SCELL: %d", cr_crit.c1 ); + + /* + * if the path loss criterion is not fulfilled for the new serving cell + * forget it for any further operations + */ + result = ( cr_crit.c1 >= 0 ); + } + else + { + TRACE_ERROR( "sig_ctrl_cs_check_c1_new_scell: ncell_info EQ NULL" ); + } + } + else + { + TRACE_ERROR( "sig_ctrl_cs_check_c1_new_scell: grr_data->db.cr_cell EQ NULL" ); + } + } + else + { + TRACE_EVENT( "sig_ctrl_cs_check_c1_new_scell: skip check" ); + } + + return( result ); + +}/* sig_ctrl_cs_check_c1_new_scell */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_pmr_accept ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_PMR_ACCEPT +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_pmr_accept ( void ) +{ + UBYTE nc_non_drx_period = grr_data->db.nc_ref_lst.param->non_drx_per; + + TRACE_ISIG( "sig_ctrl_cs_pmr_accept" ); + + switch( GET_STATE( CS_MEAS ) ) + { + case( CS_MEAS_PMR_SENDING ): + +#if defined (REL99) AND (TI_PS_FF_EMR) + if( ( ( cs_is_enh_meas_reporting() EQ FALSE ) AND ( cs_send_meas_rpt( FALSE ) EQ FALSE ) ) + OR + ( cs_is_enh_meas_reporting() EQ TRUE ) + ) +#else + if( cs_send_meas_rpt( FALSE ) EQ FALSE ) +#endif + { + SET_STATE( CS_MEAS, CS_MEAS_NULL ); + cs_process_t3158( ); + } + + sig_cs_pg_start_t_nc2_ndrx( nc_non_drx_period ); + break; + + default: + TRACE_ERROR( "SIG_MEAS_CS_PMR_ACCEPT unexpected" ); + break; + } +} /* sig_ctrl_cs_pmr_accept() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_pmr_reject ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_PMR_REJECT +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_pmr_reject ( void ) +{ + TRACE_ISIG( "sig_ctrl_cs_pmr_reject" ); + + switch( GET_STATE( CS_MEAS ) ) + { + case( CS_MEAS_PMR_SENDING ): + SET_STATE( CS_MEAS, CS_MEAS_NULL ); + + cs_process_t3158( ); + break; + + default: + TRACE_ERROR( "SIG_MEAS_CS_PMR_REJECT unexpected" ); + break; + } +} /* sig_ctrl_cs_pmr_reject() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_check_cell_location ++------------------------------------------------------------------------------ +| Description : Check the location of the target cell when packet cell change +| has to be processed +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_check_cell_location ( USHORT arfcn, UBYTE bsic ) +{ + T_NC_MVAL *nc_mval; + UBYTE nc_mval_idx; + + TRACE_EVENT( "sig_ctrl_cs_check_cell_location" ); + + /* check whether the cell is in the neighbour cell list */ + nc_mval = grr_get_nc_mval( arfcn, bsic, &nc_mval_idx ); + + if( nc_mval NEQ NULL ) + { + TRACE_EVENT( "sig_ctrl_cs_check_cell_location: cell part of neighbour cell list" ); + + grr_data->db.cr_cell = &grr_data->db.nc_nw_slctd.strgst; + grr_data->db.cr_cell->idx = nc_mval_idx; + grr_data->db.cr_cell->mode = CS_MODE_IDLE; + grr_data->db.cr_cell->avail_time = 0; + } + else + { + /* + * In case of a BCCH only environment no neighbor cell measured values + * nc_mval are present at all. As result always the cell re-selection + * cell cr_cell should be created and error traces should be suppressed. + */ + cs_create_cr_cell( arfcn, bsic ); + } +} /* sig_ctrl_cs_check_cell_location */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_cs_cr_meas_ind ++------------------------------------------------------------------------------ +| Description : Handles the signal SIG_GFP_CS_CR_MEAS_IND +| +| Parameters : *mphp_cr_meas_ind - Ptr to primitive payload +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_cs_cr_meas_ind( T_MPHP_CR_MEAS_IND * mphp_cr_meas_ind ) +{ + + UBYTE state = GET_STATE( CS ); + BOOL cr_initiated = FALSE; + BOOL strgst_changed = FALSE; + + TRACE_FUNCTION( "sig_gfp_cs_cr_meas_ind" ); + + switch( state ) + { + case CS_IDLE: + case CS_CR_NETWORK: + if( mphp_cr_meas_ind->list_id EQ ( UBYTE )( grr_data->cs.list_id - 1 ) ) + { + if( mphp_cr_meas_ind->nmeas > MPHP_NUMC_BA_GPRS_SC OR + mphp_cr_meas_ind->nmeas NEQ nc_data->c_cell ) + { + TRACE_EVENT_P2( "sig_gfp_cs_cr_meas_ind: wrong number of measurements - %d %d", + mphp_cr_meas_ind->nmeas, nc_data->c_cell ); + return; + } + + cs_fill_meas_rslt( mphp_cr_meas_ind, NULL ); + cs_store_meas_values( ); + + if( cs_find_strongest( mphp_cr_meas_ind->reporting_period ) OR + grr_data->cs.is_upd_ncell_stat_needed ) + { + strgst_changed = TRUE; + grr_data->cs.is_upd_ncell_stat_needed = FALSE; + } + + + if( state EQ CS_IDLE ) + { + cr_initiated = cs_cr_decision( CRDM_CR_INITIAL ); + } +#if defined (REL99) AND (TI_PS_FF_EMR) + if( ( (strgst_changed EQ TRUE) OR (cs_is_enh_meas_reporting()) ) + AND cr_initiated EQ FALSE ) +#else + if( strgst_changed EQ TRUE AND cr_initiated EQ FALSE ) +#endif + + { + cs_update_bsic( ); + } + } + else + { + TRACE_EVENT_P2( "sig_gfp_cs_cr_meas_ind: mismatch of list_id - %d %d", + mphp_cr_meas_ind->list_id, ( UBYTE )( grr_data->cs.list_id - 1 ) ); + } + cs_check_nc_sync_timer(mphp_cr_meas_ind->reporting_period); + break; + + default: + TRACE_ERROR( "SIG_GFP_CS_CR_MEAS_IND unexpected" ); + break; + } +} /* sig_gfp_cs_cr_meas_ind() */ + + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_cs_tcr_meas_ind ++------------------------------------------------------------------------------ +| Description : Handles the signal SIG_GFP_TCS_CR_MEAS_IND +| +| Parameters : *mphp_tcr_meas_ind - Ptr to primitive payload +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_cs_tcr_meas_ind( T_MPHP_TCR_MEAS_IND * mphp_tcr_meas_ind ) +{ + UBYTE state = GET_STATE( CS ); + BOOL cr_initiated = FALSE; + BOOL strgst_changed = FALSE; + + TRACE_FUNCTION( "sig_gfp_cs_cr_meas_ind" ); + + switch( state ) + { + case CS_IDLE: + case CS_CR_NETWORK: + if( grr_is_pbcch_present() ) + { + cs_fill_meas_rslt( NULL, mphp_tcr_meas_ind ); + cs_store_meas_values( ); + + if( cs_find_strongest( CS_RPT_PRD_PTM ) OR + grr_data->cs.is_upd_ncell_stat_needed ) + { + strgst_changed = TRUE; + grr_data->cs.is_upd_ncell_stat_needed = FALSE; + } + + if( state EQ CS_IDLE ) + { + cr_initiated = cs_cr_decision( CRDM_CR_INITIAL ); + } +#if defined (REL99) AND defined (TI_PS_FF_EMR) + if( ( (strgst_changed EQ TRUE) OR (cs_is_enh_meas_reporting()) ) + AND cr_initiated EQ FALSE ) +#else + if( strgst_changed EQ TRUE AND cr_initiated EQ FALSE ) +#endif + { + cs_update_bsic( ); + } + cs_check_nc_sync_timer(CS_RPT_PRD_PTM); + } + else + { + cs_tcr_meas_ind_to_pl( mphp_tcr_meas_ind ); + } + break; + + default: + TRACE_ERROR( "SIG_GFP_CS_TCR_MEAS_IND unexpected" ); + break; + } +} /* sig_gfp_cs_tcr_meas_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_pg_cs_pause ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PG_CS_PAUSE +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_pg_cs_pause ( void ) +{ + TRACE_ISIG( "sig_pg_cs_pause" ); + + switch( GET_STATE( CS ) ) + { + case CS_NULL: + case CS_IDLE: + if( grr_data->cs_meas.packet_mode EQ PACKET_MODE_PIM AND + grr_data->nc_data.c_cell NEQ 0 ) + { + cs_stop_cr_meas( ); + } + break; + + default: + TRACE_ERROR( "SIG_PG_CS_PAUSE unexpected" ); + break; + } +} /* sig_pg_cs_pause() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_pg_cs_resume ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PG_CS_RESUME +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_pg_cs_resume ( void ) +{ + TRACE_ISIG( "sig_pg_cs_resume" ); + + switch( GET_STATE( CS ) ) + { + case CS_NULL: + case CS_IDLE: + cs_req_cr_meas( ); + break; + + default: + TRACE_ERROR( "SIG_PG_CS_RESUME unexpected" ); + break; + } +} /* sig_pg_cs_resume() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_cs_cr_meas_stop_con ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_GFP_CS_CR_MEAS_STOP_CON +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_cs_cr_meas_stop_con ( T_MPHP_CR_MEAS_STOP_CON * dummy) +{ + TRACE_ISIG( "sig_gfp_cs_cr_meas_stop_con" ); + + switch( GET_STATE( CS ) ) + { + case CS_IDLE: + grr_data->cs.stop_req = FALSE; + break; + default: + TRACE_ERROR( "SIG_GFP_CS_CR_MEAS_STOP_CON unexpected" ); + break; + } +} /* sig_gfp_cs_cr_meas_stop_con() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_simu_timer_stop ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_SIMU_TIMER_STOP +| +| Parameters : dummy - description of parameter dummy +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_simu_timer_stop ( void ) +{ + TRACE_ISIG( "sig_ctrl_cs_simu_timer_stop" ); + +#ifdef _SIMULATION_ + cs_stop_t_reselect( ); + cs_stop_t3158( ); + + if( grr_is_pbcch_present( ) EQ FALSE AND + grr_data->cs_meas.nc_meas_cause NEQ NC_STOP_MEAS ) + { + cs_send_meas_rep_req ( NC_STOP_MEAS ); + } +#endif +} /* sig_ctrl_cs_stop() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_nc_param_invalid ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_NC_PARAM_INVALID +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_nc_param_invalid ( void ) +{ + TRACE_ISIG( "sig_ctrl_cs_nc_param_invalid" ); + + switch( GET_STATE( CS ) ) + { + case CS_IDLE: + case CS_CR_MOBILE: + case CS_CR_NETWORK: + psc_db->nc_cw.param.ctrl_order = NC_NC0; + + cs_process_t3158( ); + + TRACE_EVENT_P4( "NC Cell Re-Selection Parameter: %d %d %d %d", + cs_get_network_ctrl_order( FALSE ), + grr_data->db.nc_ref_lst.param->rep_per_i, + grr_data->db.nc_ref_lst.param->rep_per_t, + grr_data->db.nc_ref_lst.param->non_drx_per ); + break; + + case CS_NULL: + default: + /* do nothing */ + break; + } +} /* sig_ctrl_cs_nc_param_invalid() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_nc_param_valid ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_NC_PARAM_VALID +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_nc_param_valid ( void ) +{ + TRACE_ISIG( "sig_ctrl_cs_nc_param_valid" ); + + switch( GET_STATE( CS ) ) + { + case CS_IDLE: + case CS_CR_MOBILE: + case CS_CR_NETWORK: + cs_process_t3158( ); + + TRACE_EVENT_P4( "NC Cell Re-Selection Parameter: %d %d %d %d", + cs_get_network_ctrl_order( FALSE ), + grr_data->db.nc_ref_lst.param->rep_per_i, + grr_data->db.nc_ref_lst.param->rep_per_t, + grr_data->db.nc_ref_lst.param->non_drx_per ); + break; + + case CS_NULL: + default: + /* do nothing */ + break; + } +} /* sig_ctrl_cs_nc_param_valid() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_ba_changed ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_BA_CHANGED +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_ba_changed ( void ) +{ + TRACE_ISIG( "sig_ctrl_cs_ba_changed" ); + + switch( GET_STATE( CS ) ) + { + case CS_IDLE: + case CS_CR_MOBILE: + case CS_CR_NETWORK: + cs_init_nc_mval_lst( ); + cs_build_nc_ref_list( psc_db, FALSE ); + cs_reset_nc_change_mark( psc_db ); + + if( grr_data->cs_meas.packet_mode EQ PACKET_MODE_PTM ) + { + cs_send_cr_meas_req( CS_DELETE_MEAS_RSLT ); + } + break; + + case CS_NULL: + default: + /* do nothing */ + break; + } +} /* sig_ctrl_cs_ba_changed() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_reset_meas_rep_params ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_RESET_MEAS_REP_PARAMS +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_reset_meas_rep_params ( void ) +{ + TRACE_ISIG( "sig_ctrl_cs_reset_meas_rep_params" ); + + cs_reset_meas_rep_params (psc_db); + +} /* sig_ctrl_cs_reset_meas_rep_params() */ + +#if defined (REL99) AND defined (TI_PS_FF_EMR) +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_cs_si2quater_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_CS_SI2QUATER_IND +| +| Parameters : rrgrr_si2quater_ind - Pointer to primitive payload +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_cs_si2quater_ind ( T_RRGRR_SI2QUATER_IND + *rrgrr_si2quater_ind) +{ + TRACE_ISIG( "sig_ctrl_cs_si2quater_ind" ); + + switch( GET_STATE( CS ) ) + { + case CS_IDLE: + case CS_CR_NETWORK: + grr_copy_enh_and_nc_params_from_si2qtr(rrgrr_si2quater_ind); + break; + + default: + TRACE_ERROR( "SIG_CTRL_CS_SI2QUATER_IND unexpected" ); + break; + } +} + +#endif +