FreeCalypso > hg > fc-magnetite
view src/g23m-gprs/grr/grr_css.c @ 667:36df58db1640
AT@LPG and AT@PWL implemented in aci2
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 28 May 2020 01:47:28 +0000 |
parents | 219afcfc6250 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | 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