FreeCalypso > hg > fc-magnetite
diff src/g23m-gprs/grr/grr_ctrls.c @ 183:219afcfc6250
src/g23m-gprs: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Oct 2016 04:24:13 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/grr/grr_ctrls.c Thu Oct 13 04:24:13 2016 +0000 @@ -0,0 +1,1840 @@ +/* ++----------------------------------------------------------------------------- +| 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 +| CTRL of entity GRR. ++----------------------------------------------------------------------------- +*/ + +#ifndef GRR_CTRLS_C +#define GRR_CTRLS_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_ctrlf.h" /* */ +#include "grr_ctrls.h" /* */ + +#include "grr_psis.h" /* */ +#include "grr_pgs.h" /* */ +#include "grr_css.h" /* */ +#include "grr_meass.h" /* to get the signals for interference measurements */ +#include "grr_tcs.h" /* */ + +#include <string.h> /* for memcpy*/ + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_set_pckt_mode ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_TC_CTRL_SET_PCKT_MODE +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_set_pckt_mode + ( T_GLBL_PCKT_MODE final_pckt_mode, UBYTE param ) +{ + TRACE_ISIG( "sig_tc_ctrl_set_pckt_mode" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_ACCESS_DISABLED: + case CTRL_READY_TO_PROGRESS: + case CTRL_IN_PROGRESS: + case CTRL_WAIT_RSP_4_RR_CR: + case CTRL_WAIT_FOR_CNF_OF_SUSPENSION: + case CTRL_CR: + case CTRL_CR_IN_SUSP: + case CTRL_GRR_NC_CCO: + case CTRL_READY: + ctrl_stop_rr_task_req( final_pckt_mode, param ); + break; + default: + TRACE_ERROR( "sig_tc_ctrl_set_pckt_mode unexpected" ); + break; + } +} /* sig_tc_ctrl_set_pckt_mode() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_prepare_abnorm_rel_with_cr ++------------------------------------------------------------------------------ +| Description : Handles the signal SIG_TC_CTRL_PREPARE_ABNORM_REL_WITH_CR +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_prepare_abnorm_rel_with_cr ( void ) +{ + TRACE_ISIG( "sig_tc_ctrl_prepare_abnorm_rel_with_cr" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + ctrl_send_access_disable_if_needed + ( TC_DC_CR_ABNORMAL, sig_tc_ctrl_abnorm_rel_with_cr ); + break; + + default: + TRACE_ERROR( "SIG_TC_CTRL_PREPARE_ABNORM_REL_WITH_CR unexpected" ); + break; + } +} /* sig_tc_ctrl_prepare_abnorm_rel_with_cr() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_abnorm_rel_with_cr ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_TC_CTRL_ABNORM_REL_WITH_CR +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_abnorm_rel_with_cr ( void ) +{ + TRACE_ISIG( "sig_tc_ctrl_abnorm_rel_with_cr" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + sig_ctrl_cs_reselect( CS_RESELECT_CAUSE_CTRL_ABNORMAL ); + break; + + default: + TRACE_ERROR( "SIG_TC_CTRL_ABNORM_REL_WITH_CR unexpected" ); + break; + } +} /* sig_tc_ctrl_abnorm_rel_with_cr() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_channel_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_TC_CTRL_CHANNEL_REQ +| +| SZML-CTRL/002 +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_channel_req ( UBYTE channel_req) +{ + TRACE_ISIG( "sig_tc_ctrl_channel_req" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + case CTRL_GRR_NC_CCO: + { + PALLOC(rrgrr_channel_req, RRGRR_CHANNEL_REQ); + rrgrr_channel_req->req_data = channel_req; + PSEND(hCommRR, rrgrr_channel_req); + } + break; + default: + TRACE_ERROR( "SIG_TC_CTRL_CHANNEL_REQ unexpected" ); + break; + } +} /* sig_tc_ctrl_channel_req() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_t3172_running ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_TC_CTRL_T3172_RUNNING +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_t3172_running ( void ) +{ + TRACE_ISIG( "sig_tc_ctrl_t3172_running" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + case CTRL_GRR_NC_CCO: + sig_ctrl_pg_t3172_run(); + break; + default: + TRACE_ERROR( "SIG_TC_CTRL_T3172_RUNNING unexpected" ); + break; + } +} /* sig_tc_ctrl_t3172_running() */ + + + + + + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_pg_ctrl_downlink_transfer ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PG_CTRL_DOWNLINK_TRANSFER +| +| Parameters : ULONG pg_tlli +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_pg_ctrl_downlink_transfer ( UBYTE page_id) +{ + TRACE_ISIG( "sig_pg_ctrl_downlink_transfer" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + { + PALLOC(gmmrr_page_ind, GMMRR_PAGE_IND); + gmmrr_page_ind->page_id = page_id; + PSEND(hCommGMM,gmmrr_page_ind); + } + break; + default: + TRACE_ERROR( "SIG_PG_CTRL_DOWNLINK_TRANSFER unexpected" ); + break; + } +} /* sig_pg_ctrl_downlink_transfer() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_pg_ctrl_rr_est_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PG_CTRL_RR_EST_REQ +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_pg_ctrl_rr_est_req ( PG_CHANNEL type) +{ + UBYTE state = GET_STATE( CTRL ); + + TRACE_ISIG( "sig_pg_ctrl_rr_est_req" ); + + grr_data->ctrl.cs_page_channel = type; + + switch( state ) + { + case CTRL_READY: + case CTRL_IN_PROGRESS: + /* + * To pass CS page request to GMM + */ + SET_STATE(CTRL, CTRL_WAIT_CS_PAGE_RES); + + ctrl_handle_gmmrr_cs_page_ind( state ); + break; + default: + TRACE_ERROR( "SIG_PG_CTRL_RR_EST_REQ unexpected" ); + break; + } +} /* sig_pg_ctrl_rr_est_req() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_si13_processed ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_SI13_PROCESSED +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_si13_processed ( void ) +{ + UBYTE state = GET_STATE( CTRL ); + + TRACE_ISIG( "sig_psi_ctrl_si13_processed" ); + + switch( state ) + { + case CTRL_READY: + case CTRL_READY_TO_PROGRESS: + case CTRL_ACCESS_DISABLED: + case CTRL_CR: + case CTRL_CR_IN_SUSP: + case CTRL_AUTO_RR_CR: + case CTRL_RR_CR_IN_SUSP: + case CTRL_RR_NC_CCO: + case CTRL_GRR_NC_CCO: + if( grr_is_pbcch_present( ) ) + { + if( state EQ CTRL_READY ) + { + SET_STATE( CTRL, CTRL_READY_TO_PROGRESS ); + } + ctrl_stop_rr_task_req( GLBL_PCKT_MODE_IDLE, TASK_STOP_DUMMY_VALUE ); + } + else + { + ctrl_send_cell_reselection_req( CR_COMPLETE ); + if( state EQ CTRL_READY ) + { + ctrl_stop_rr_task_req( GLBL_PCKT_MODE_IDLE, TASK_STOP_DUMMY_VALUE ); + + SET_STATE( CTRL, CTRL_IN_PROGRESS ); + } + else if( state EQ CTRL_ACCESS_DISABLED OR + state EQ CTRL_READY_TO_PROGRESS ) + + { + SET_STATE( CTRL, CTRL_IN_PROGRESS ); + } + } + break; + + default: + TRACE_ERROR( "SIG_PSI_CTRL_SI13_PROCESSED unexpected" ); + break; + } +} /* sig_psi_ctrl_si13_processed() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_access_enabled ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_ACCESS_ENABLED +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_access_enabled ( void ) +{ + BOOL send_cr_complete = FALSE; + UBYTE final = FALSE; + + TRACE_ISIG( "sig_psi_ctrl_access_enabled" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_RR_CR_IN_SUSP: + /* + * enable cell after resume + */ + SET_STATE(CTRL, CTRL_ACC_ENABLED_SUSP); + if(grr_is_pbcch_present()) + { + /* + * to stop CCCH after resume + */ + grr_data->ctrl.rr_state.monitoring_stopped = FALSE; + } + ctrl_send_cell_reselection_req( CR_COMPLETE ); + + sig_ctrl_psi_suspend( ); + break; + case CTRL_CR: + case CTRL_CR_IN_SUSP: + case CTRL_READY_TO_PROGRESS: + final = TRUE; + + /*lint -fallthrough*/ + + case CTRL_RR_NC_CCO: + case CTRL_GRR_NC_CCO: + case CTRL_AUTO_RR_CR: + case CTRL_ACCESS_DISABLED: + send_cr_complete = TRUE; + if(( GET_STATE( CTRL ) NEQ CTRL_RR_NC_CCO ) AND (GET_STATE( CTRL ) NEQ CTRL_GRR_NC_CCO)) + { + SET_STATE( CTRL, CTRL_IN_PROGRESS ); + } + + /*lint -fallthrough*/ + + case CTRL_IN_PROGRESS: + ctrl_enable_serving_cell( final ); + + if( send_cr_complete EQ TRUE ) + { + ctrl_send_cell_reselection_req( CR_COMPLETE ); + } + break; + + default: + TRACE_ERROR( "SIG_PSI_CTRL_ACCESS_ENABLED unexpected" ); + break; + } +} /* sig_psi_ctrl_access_enabled() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_access_disabled ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_ACCESS_DISABLED +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_access_disabled ( T_PSI_DISABLE_CAUSE dc ) +{ + UBYTE state = GET_STATE( CTRL ); + + TRACE_ISIG( "sig_psi_ctrl_access_disabled" ); + + switch( state ) + { + case CTRL_IN_PROGRESS: + SET_STATE(CTRL, CTRL_ACCESS_DISABLED); + + /*lint -fallthrough*/ + + case CTRL_RR_NC_CCO: + case CTRL_GRR_NC_CCO: + + switch(dc) + { + case PSI_DC_PBCCH_RELEASED: + TRACE_EVENT( "PBCCH switched off" ); + + sig_ctrl_cs_reselect( CS_RESELECT_CAUSE_CTRL_SCELL ); + break; + case PSI_DC_PBCCH_ESTABLISHED: + TRACE_EVENT( "PBCCH switched on" ); + + grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_PBCCH_ESTABLISHED; + + ctrl_stop_all_activities( CTRL_DC_PSI_MANAGEMENT, NULL ); + break; + case PSI_DC_READ_PSI: + grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_COMPLETE_PSI_READING; + + ctrl_stop_all_activities( CTRL_DC_PSI_MANAGEMENT, NULL ); + break; + case PSI_DC_OTHER: + grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_COMPLETE_SI_READING; + + ctrl_stop_all_activities( CTRL_DC_PSI_MANAGEMENT, NULL ); + break; + default: + break; + } + break; + case CTRL_AUTO_RR_CR: + case CTRL_RR_CR_IN_SUSP: + /* + * RR has to continue CR + */ + ctrl_send_cell_reselection_req( CR_CONT ); + break; + case CTRL_CR: + case CTRL_CR_IN_SUSP: + SET_STATE_FAILED_CR( state ); + ctrl_cc_rejected( ); + break; + default: + TRACE_ERROR( "SIG_PSI_CTRL_ACCESS_DISABLED unexpected" ); + break; + } +} /* sig_psi_ctrl_access_disabled() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_psi1or_psi13_receiption_failure ++------------------------------------------------------------------------------ +| Description : Handles the internal signal +| SIG_PSI_CTRL_PSI1OR_PSI13_RECEIPTION_FAILURE +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_psi1or_psi13_receiption_failure ( void ) +{ + TRACE_ISIG( "sig_psi_ctrl_psi1or_psi13_receiption_failure" ); + + ctrl_failure_processing( FAIL_SIG_PSI1OR_PSI13_RECEIPTION_FAILURE ); +} /* sig_psi_ctrl_psi1or_psi13_receiption_failure() */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_read_si ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_READ_SI: it sends a +| request to RR to read some special SI message. This signal is used +| in case of acquisition +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_read_si ( UBYTE si_to_read ) +{ + TRACE_ISIG( "sig_psi_ctrl_read_si" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_ACCESS_DISABLED: + case CTRL_READY_TO_PROGRESS: + case CTRL_IN_PROGRESS: + ctrl_start_monitoring_bcch( si_to_read ); + break; + default: + TRACE_ERROR( "SIG_PSI_CTRL_READ_SI unexpected" ); + break; + } +} /* sig_psi_ctrl_read_si() */ + + + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_meas_ctrl_meas_report ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_MEAS_CTRL_MEAS_REPORT +| +| Parameters : T_U_MEAS_REPORT *meas_report +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_meas_ctrl_meas_report ( T_U_MEAS_REPORT *meas_report) +{ + TRACE_ISIG( "sig_meas_ctrl_meas_report" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + ctrl_send_control_block( CGRLC_BLK_OWNER_MEAS, (void*)meas_report ); + break; + default: + sig_ctrl_meas_pmr_reject( ); + + TRACE_ERROR( "SIG_MEAS_CTRL_MEAS_REPORT unexpected" ); + break; + } +} /* sig_meas_ctrl_meas_report() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_cs_ctrl_meas_report ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CS_CTRL_MEAS_REPORT +| +| Parameters : T_U_MEAS_REPORT *meas_report +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_cs_ctrl_meas_report ( T_U_MEAS_REPORT *meas_report) +{ + TRACE_ISIG( "sig_cs_ctrl_meas_report" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + case CTRL_GRR_NC_CCO: + ctrl_send_control_block( CGRLC_BLK_OWNER_CS, (void*)meas_report ); + break; + default: + sig_ctrl_cs_pmr_reject( ); + + TRACE_ERROR( "SIG_CS_CTRL_MEAS_REPORT unexpected" ); + break; + } +} /* sig_cs_ctrl_meas_report() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_cs_ctrl_cancel_meas_report ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CS_CTRL_CANCEL_MEAS_REPORT +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_cs_ctrl_cancel_meas_report ( void ) +{ + TRACE_ISIG( "sig_cs_ctrl_cancel_meas_report" ); + + ctrl_cancel_control_block( CGRLC_BLK_OWNER_CS ); + +} /* sig_cs_ctrl_cancel_meas_report() */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_access_barred ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_ACCESS_BARRED +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_access_barred ( void ) +{ + TRACE_ISIG( "sig_psi_ctrl_access_barred" ); + + ctrl_failure_processing( FAIL_SIG_CTRL_ACCESS_BARRED ); +}/* sig_psi_ctrl_access_barred*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_pg_ctrl_stop_mon_ccch ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PG_CTRL_STOP_MON_CCCH: it stops the +| CCCH monitoring process in RR +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_pg_ctrl_stop_mon_ccch(void) +{ + TRACE_ISIG( "sig_pg_ctrl_stop_mon_ccch" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + case CTRL_GRR_NC_CCO: + ctrl_stop_monitoring_ccch(); + break; + default: + TRACE_ERROR( "SIG_PG_CTRL_STOP_MON_CCCH unexpected" ); + break; + } +}/* sig_pg_ctrl_stop_mon_ccch*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_pg_ctrl_start_mon_ccch ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PG_CTRL_START_MON_CCCH: it starts the +| CCCH monitoring process in RR +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_pg_ctrl_start_mon_ccch(UBYTE pg_type) +{ + TRACE_ISIG( "sig_pg_ctrl_start_mon_ccch" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + case CTRL_GRR_NC_CCO: + switch(pg_type) + { + case PAG_MODE_PTM_NP: + case PAG_MODE_PIM_NP: + /* + * use PTM_NP or PIM_NP + */ + ctrl_start_monitoring_ccch(pg_type); + break; + default: + if(grr_is_non_drx_period()) + { + /* + * RR continue with paging reorg + */ + ctrl_start_monitoring_ccch(PAG_MODE_REORG); + } + else + { + /* + * RR continue with default paging + */ + ctrl_start_monitoring_ccch(pg_type); + } + break; + } + break; + default: + TRACE_ERROR( "SIG_PG_CTRL_START_MON_CCCH unexpected" ); + break; + } +}/* sig_pg_ctrl_start_mon_ccch*/ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_suspend_cnf ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_TC_CTRL_SUSPEND_CNF: +| GRR is suspended +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_suspend_cnf(void) +{ + TRACE_ISIG( "sig_tc_ctrl_suspend_cnf" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_WAIT_FOR_CNF_OF_SUSPENSION: + SET_STATE(CTRL, CTRL_SUSPENDED); + ctrl_stop_rr_task_req( GLBL_PCKT_MODE_SUSP, TASK_STOP_DUMMY_VALUE ); + psc_db->is_access_enabled = FALSE; /* at this point , we do not have any GPRS access*/ + switch(grr_data->ctrl.after_suspension) + { + case ACTIVATE_RR: + { + /* activate RR. We have to check whether we have non-GPRS access parameters or not. + * Non-GPRS parameters are present in case of PCCCH presence + * GRR has to inform RR whether it should send GPRS Suspension request or not + */ + PALLOC(rrgrr_activate_req, RRGRR_ACTIVATE_REQ); + + /* Suspension needed*/ + rrgrr_activate_req->susp_req = grr_data->ctrl.is_susp_needed; + if(grr_is_pbcch_present() AND (psc_db->v_non_gprs_opt EQ TRUE)) + { + /* There is valid non-GPRS parameters present in the database, so we have to send + * it to RR to allow a fast access to the network + */ + rrgrr_activate_req->non_gprs.v_non_gprs = TRUE; + ctrl_copy_non_gprs_opt(&rrgrr_activate_req->non_gprs); + } + else + rrgrr_activate_req->non_gprs.v_non_gprs = FALSE; + /* + * SZML-CTRL/004 + */ + rrgrr_activate_req->rac = psc_db->cell_info_for_gmm.cell_info.cell_env.rai.rac; + + PSEND(hCommRR, rrgrr_activate_req); + } + + ctrl_send_gmmrr_suspend_cnf( ); + break; + case SEND_RR_EST_REQ: + /* */ + ctrl_send_rr_est_req(grr_data->ctrl.is_susp_needed); + break; + case SEND_RR_EST_RSP: + ctrl_send_rr_est_rsp(grr_data->ctrl.is_susp_needed, + TRUE /* CS_PAGE was accepted*/); + + break; + } + break; + default: + TRACE_ERROR( "SIG_TC_CTRL_SUSPEND_CNF unexpected" ); + break; + } +}/* sig_tc_ctrl_suspend_cnf*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_dcch_data_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_TC_CTRL_DCCH_DATA_REQ +| +| Parameters : rrgrr_data_req-pointer to primitive which includes the data +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_dcch_data_req(T_RRGRR_DATA_REQ * rrgrr_data_req_i ) +{ + TRACE_ISIG( "sig_tc_ctrl_dcch_data_req" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + { + PSEND(hCommRR,rrgrr_data_req_i); + } + break; + default: + TRACE_ERROR( "sig_tc_ctrl_dcch_data_req unexpected" ); + break; + } +}/* sig_tc_ctrl_dcch_data_req */ + + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_tc_gprs_data_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_TC_GPRS_DATA_REQ +| +| Parameters : rrgrr_gprs_data_req-pointer to primitive which includes the data +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_gprs_data_req(T_RRGRR_GPRS_DATA_REQ *rrgrr_gprs_data_req_i) +{ + TRACE_ISIG( "sig_tc_ctrl_gprs_data_req" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + case CTRL_GRR_NC_CCO: + { + PSEND(hCommRR,rrgrr_gprs_data_req_i); + } + break; + default: + TRACE_ERROR( "sig_tc_ctrl_gprs_data_req unexpected" ); + break; + } +}/* sig_tc_ctrl_gprs_data_req*/ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_suspend_dedi_chan ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_TC_CTRL_SUSPEND_DEDICATED_CHANNEL +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_suspend_dedi_chan(void) +{ + TRACE_ISIG( "sig_tc_ctrl_suspend_dedi_chan" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + { + PALLOC(rrgrr_suspend_dcch_req, RRGRR_SUSPEND_DCCH_REQ); + PSEND(hCommRR, rrgrr_suspend_dcch_req); + } + break; + default: + TRACE_ERROR( "SIG_TC_CTRL_SUSPEND_DEDICATED_CHANNEL unexpected" ); + break; + } +}/* sig_tc_ctrl_suspend_dedi_chan*/ + + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_resume_dedi_chan ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_TC_CTRL_RESUME_DEDICATED_CHANNEL +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_resume_dedi_chan(void) +{ + TRACE_ISIG( "sig_tc_ctrl_resume_dedi_chan" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + ctrl_reinstall_old_scell_req( FALSE, RECONN_PROT_UNSPECIFIED ); + break; + default: + TRACE_ERROR( "SIG_TC_CTRL_RESUME_DEDICATED_CHANNEL unexpected" ); + break; + } +}/* sig_tc_ctrl_resume_dedi_chan*/ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_contention_ok ++------------------------------------------------------------------------------ +| Description : Cell change ok +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_contention_ok(void) +{ + TRACE_ISIG( "sig_tc_ctrl_contention_ok" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_GRR_NC_CCO: + case CTRL_IN_PROGRESS: + if( grr_data->cc_running ) + { + vsi_t_stop( GRR_handle, T3134 ); + + grr_data->cc_running = FALSE; + + ctrl_install_new_scell( ); + + { + PALLOC( rrgrr_resumed_tbf_req, RRGRR_RESUMED_TBF_REQ ); + PSEND( hCommRR, rrgrr_resumed_tbf_req ); + } + } + + if( grr_t_status( T3174 ) > 0 ) + { + SET_STATE( CTRL, CTRL_IN_PROGRESS ); + ctrl_stop_T3174( ); + ctrl_install_new_scell( ); +#if defined (REL99) AND defined (TI_PS_FF_EMR) + grr_init_nc_list(&pcr_db->nc_cw.list ); + grr_init_ba_bcch_nc_list(pcr_db); +#endif + } + break; + default: + TRACE_ERROR( "sig_tc_ctrl_contention_ok unexpected" ); + break; + } +}/* sig_tc_ctrl_contention_ok()*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_contention_failure ++------------------------------------------------------------------------------ +| Description : Cell reselection has failled because of different +| of contention resolution sending by the MS in RLC and received uplink assigment +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL void sig_tc_ctrl_contention_failure() +{ + TRACE_ISIG( "sig_tc_ctrl_contention_failure" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_GRR_NC_CCO: + ctrl_stop_T3174(); + TRACE_EVENT("ctrl_cell_change_order:No response on target cell"); + grr_data->pcco_failure_cause = 1; + ctrl_pcco_failure(); + break; + default: + TRACE_ERROR( "sig_tc_contention_failure unexpected" ); + break; + } +} /*sig_tc_ctrl_contention_failure*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_access_reject_on_new_cell ++------------------------------------------------------------------------------ +| Description : Handles the internal signal ACCESS_REJECT_ON_NEW_CELL +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL void sig_tc_ctrl_access_reject_on_new_cell(void) +{ + TRACE_ISIG( "sig_tc_ctrl_access_reject_on_new_cell" ); + + ctrl_stop_T3174(); + ctrl_pcco_failure(); + +} /*sig_tc_ctrl_access_reject_on_new_cell*/ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_cs_ctrl_new_candidate ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CS_CTRL_NEW_CANDIDATE +| This signal indicates that the CS service has detected +| a new cell candidate for a cell reselection +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_cs_ctrl_new_candidate( T_CS_RESELECT_CAUSE reselect_cause ) +{ + TRACE_ISIG( "sig_cs_ctrl_new_candidate" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_READY: + case CTRL_ACCESS_DISABLED: + case CTRL_READY_TO_PROGRESS: + case CTRL_IN_PROGRESS: + { + SET_STATE( CTRL, CTRL_CR ); + + if( reselect_cause EQ CS_RESELECT_CAUSE_CTRL_ABNORMAL ) + { + ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_ABNORMAL, NULL ); + } + else + { + ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_NORMAL, NULL ); + } + } + break; + case CTRL_CR_IN_SUSP: + case CTRL_FAILED_CR_IN_SUSP: + ctrl_stop_all_activities( CTRL_DC_OTHER, NULL ); + + /*lint -fallthrough*/ + + case CTRL_CR: + case CTRL_FAILED_CR: + case CTRL_GRR_NC_CCO: + ctrl_handle_new_candidate( FALSE ); + break; + default: + TRACE_ERROR( "SIG_CS_CTRL_NEW_CANDIDATE unexpected" ); + break; + } +}/* sig_cs_ctrl_new_candidate*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_ncell_param_valid ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_NCELL_PARAM_VALID +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_ncell_param_valid ( void ) +{ + TRACE_ISIG( "sig_psi_ctrl_ncell_param_valid" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: +#if defined (REL99) AND defined (TI_PS_FF_EMR) + psc_db->nc_ms.ncmeas.list.number=0; + psc_db->nc_ms.rfreq.number = 0; + /*This is called to reset the only Freq List from PMO as BA(GPRS) is changed. + Spec 5.08 - sec 10.1.4.1 + The list is valid until an empty list is sent to the MS, there is a downlink + signalling failure or the MS selects a new cell or the BA(GPRS) that is modified + by the NC_FREQUENCY_LIST changes or the MS enters dedicated mode + + 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*/ + /*NO BREAK */ +#endif + /*lint -fallthrough*/ + case CTRL_GRR_NC_CCO: + if( grr_data->is_pg_started ) + + { + sig_ctrl_cs_start(); + } + break; + default: + /* ignore */ + break; + } +} /* sig_psi_ctrl_ncell_param_valid() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_ncell_param_invalid ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_NCELL_PARAM_INVALID +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_ncell_param_invalid ( void ) +{ + TRACE_ISIG( "sig_psi_ctrl_ncell_param_invalid" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + case CTRL_GRR_NC_CCO: + sig_ctrl_cs_stop(CS_DC_OTHER); + break; + default: + /*ignore*/ + break; + } +} /* sig_psi_ctrl_ncell_param_invalid() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_access_changed ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_ACCESS_CHANGED +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_access_changed ( void ) +{ + TRACE_ISIG( "sig_psi_ctrl_access_changed" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + ctrl_send_cell_ind(); + break; + default: + TRACE_ERROR( "SIG_PSI_CTRL_ACCESS_CHANGED unexpected" ); + break; + } +} /* sig_psi_ctrl_access_changed() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_ncell_psi_read ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_NCELL_PSI_READ +| +| +| Parameters : BOOL read_successfully +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_ncell_psi_read( BOOL read_successfully) +{ + TRACE_ISIG( "sig_psi_ctrl_ncell_psi_read" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_CR: + case CTRL_CR_IN_SUSP: + if(read_successfully) + { + /* + * Inform RR and wait for positive indication of the cell reselection request + */ + ctrl_send_cell_reselection_req( CR_COMPLETE ); + } + else + { + ctrl_cc_rejected( ); + } + break; + default: + TRACE_ERROR( "SIG_PSI_CTRL_NCELL_PSI_READ unexpected" ); + break; + } +}/* sig_psi_ctrl_ncell_psi_read*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_int_list_invalid ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_INT_LIST_INVALID +| +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_int_list_invalid(void) +{ + TRACE_ISIG( "sig_psi_ctrl_int_list_invalid" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + sig_ctrl_meas_int_list_invalid(); + break; + default: + /*ignore*/ + break; + } + +}/* sig_psi_ctrl_int_list_invalid*/ +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_int_list_valid ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_INT_LIST_VALID +| +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_int_list_valid(void) +{ + TRACE_ISIG( "sig_psi_ctrl_int_list_valid" ); + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + if(grr_data->is_pg_started) + sig_ctrl_meas_int_list_valid(); + break; + default: + /*ignore*/ + break; + } +}/* sig_psi_ctrl_int_list_valid*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_meas_param_invalid_psi5 ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_MEAS_PARAM_INVALID_PSI5 +| +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_meas_param_invalid_psi5(void) +{ + TRACE_ISIG( "sig_psi_ctrl_meas_param_invalid_psi5" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + sig_ctrl_meas_ext_invalid_psi5(); + sig_ctrl_cs_nc_param_invalid(); + break; + default: + /*ignore*/ + break; + } + +}/* sig_psi_ctrl_meas_param_invalid_psi5*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_meas_param_valid_psi5 ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_MEAS_PARAM_VALID_PSI5 +| +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_meas_param_valid_psi5(void) +{ + TRACE_ISIG( "sig_psi_ctrl_meas_param_valid_psi5" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + if(grr_data->is_pg_started) + { + sig_ctrl_meas_ext_valid_psi5(); + sig_ctrl_cs_nc_param_valid(); + } + break; + default: + /*ignore*/ + break; + } +}/* sig_psi_ctrl_meas_param_valid_psi5*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_meas_param_invalid_si13 ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_MEAS_PARAM_INVALID_SI13 +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_meas_param_invalid_si13( void ) +{ + TRACE_ISIG( "sig_psi_ctrl_meas_param_invalid_si13" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + sig_ctrl_cs_nc_param_invalid( ); + break; + + default: + /* do nothing */ + break; + } +}/* sig_psi_ctrl_meas_param_invalid_si13 */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_meas_param_valid_si13 ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_MEAS_PARAM_VALID_SI13 +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_meas_param_valid_si13( BOOL ba_bcch_changed ) +{ + TRACE_ISIG( "sig_psi_ctrl_meas_param_valid_si13" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + sig_ctrl_cs_nc_param_valid( ); + sig_ctrl_tc_enable_grlc (CGRLC_QUEUE_MODE_DEFAULT, CGRLC_RA_DEFAULT ); + + if( ba_bcch_changed EQ TRUE ) + { + sig_ctrl_meas_ba_changed( ); + sig_ctrl_cs_ba_changed( ); + } + break; + + default: + /* do nothing */ + break; + } +}/* sig_psi_ctrl_meas_param_valid_si13 */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_new_pccch ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PSI_CTRL_NEW_PCCCH +| +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_new_pccch(void) +{ + TRACE_ISIG( "sig_psi_ctrl_new_pccch" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + if(grr_data->is_pg_started) + { + TRACE_EVENT("Restart PCCCH: Config may have changed"); + sig_ctrl_pg_start(); + } + break; + default: + TRACE_EVENT_P1( "NEW_PCCCH not handled in CTRL state: %d", grr_data->ctrl.state); + break; + } +}/* sig_psi_ctrl_new_pccch*/ + +#ifdef REL99 +/* ++------------------------------------------------------------------------------ +| Function : sig_psi_ctrl_cbch_info_ind ++------------------------------------------------------------------------------ +| Description : This function gives the RRGRR_CBCH_INFO ind to RR. +| This would be called on success cell selection/reselection +| or when PSIs are completely acquired or when there is change +| in PSI2,PSI13 or PSI8 messages. +| This primitive is sent to RR only when the mobile is in R99 +| network. +| The CBCH channel description present in this primitive is in +| a form which could be used by MPH_* primitives in RR. +| The frequency list is NOT in TI L1 form. When RR passes this +| information to ALR, it is converted to TI L1 FORMAT. +| Parameters : None. +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_psi_ctrl_cbch_info_ind() +{ + T_cbch *cbch_req = NULL; + PALLOC(rrgrr_cbch_info_ind, RRGRR_CBCH_INFO_IND); + TRACE_ISIG( "sig_psi_ctrl_cbch_info_ind" ); + + cbch_req = &(rrgrr_cbch_info_ind->cbch); + memset (cbch_req, 0, sizeof (T_cbch)); + + /* fill in cbch info from psc_db */ + if(psc_db->v_cbch_chan_desc) + { + cbch_req->stat = STAT_ACT; + cbch_req->ch = psc_db->cbch_chan_desc.chan_typ_tdma_offset; + cbch_req->tn = psc_db->cbch_chan_desc.tn; + cbch_req->tsc = psc_db->cbch_chan_desc.freq_par.tsc; + /* If frequency encoding has indirect encoding/direct encoding 1 + * /direct encoding 2, then hopping is used. Otherwise channel + * description describes a non-hopping channel. + * When none of the above three coding methods are used, arfcn choice + * should be set to true.Ref 3GPP 04.60 Section 12.8 + */ + cbch_req->h = (psc_db->cbch_chan_desc.freq_par.v_arfcn)?H_NO:H_FREQ; + if(cbch_req->h) + { + /* + * CBCH uses frequency hopping, then configure MAIO and HSN + * and create a frequency hopping list from the cell allocation/ + * PSI13/direct encoding 2 scheme and the mobile allocation + * stored in Frequency Parameters. + */ + /* When hopping is allowed - hsn,maio and ma have to be filled. */ + ctrl_fill_cbch_hopping_params(cbch_req,&psc_db->cbch_chan_desc.freq_par); + } + else + { + /* non hopping channel */ + cbch_req->arfcn = psc_db->cbch_chan_desc.freq_par.arfcn; + } + } + else + { + cbch_req->stat = STAT_INACT; + } + PSEND(hCommRR,rrgrr_cbch_info_ind); +} /* sig_psi_ctrl_cbch_info_ind */ +#endif + +/* ++------------------------------------------------------------------------------ +| Function : sig_cs_ctrl_no_more_candidate ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CS_CTRL_NO_MORE_CANDIDATE +| This signal indicates that the RR has to start a complete cell +| selection procedure +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_cs_ctrl_no_more_candidate( T_CS_RESELECT_CAUSE reselect_cause ) +{ + UBYTE state = GET_STATE( CTRL ); + + TRACE_ISIG( "sig_cs_ctrl_no_more_candidate" ); + + switch( state ) + { + case CTRL_IN_PROGRESS: + if( reselect_cause EQ CS_RESELECT_CAUSE_CTRL_ABNORMAL ) + { + ctrl_tc_access_enable( sig_ctrl_tc_abnorm_rel_with_cr_failed ); + } + else + { + SET_STATE( CTRL, CTRL_READY ); + + ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_NORMAL, NULL ); + } + break; + + case CTRL_CR: + case CTRL_FAILED_CR: + case CTRL_CR_IN_SUSP: + case CTRL_FAILED_CR_IN_SUSP: + + switch( reselect_cause ) + { + case CS_RESELECT_CAUSE_CTRL_ABNORMAL: + SET_STATE( CTRL, CTRL_IN_PROGRESS ); + + grr_set_db_ptr( DB_MODE_CC_REJ ); + ctrl_tc_access_enable( sig_ctrl_tc_abnorm_rel_with_cr_failed ); + sig_ctrl_psi_resumpt( ); + ctrl_enable_serving_cell( FALSE ); + break; + + default: + SET_STATE( CTRL, CTRL_READY ); + + ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_NORMAL, NULL ); + break; + } + break; + + case CTRL_ACCESS_DISABLED: + case CTRL_READY_TO_PROGRESS: + { + T_CTRL_CR_TYPE ctrl_cr_type; + + ctrl_cr_type = ( reselect_cause EQ CS_RESELECT_CAUSE_CS_NORMAL ? + CTRL_CR_TYPE_CS : CTRL_CR_TYPE_CONT ); + + ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_NORMAL, NULL ); + ctrl_handle_no_more_candidate( ctrl_cr_type, FALSE ); + } + break; + + case CTRL_READY: + case CTRL_AUTO_RR_CR: + case CTRL_RR_CR_IN_SUSP: + ctrl_send_cell_reselection_req( CR_CONT ); + break; + + default: + TRACE_ERROR( "SIG_CS_CTRL_NO_MORE_CANDIDATE unexpected 2" ); + break; + } +}/* sig_cs_ctrl_no_more_candidate*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_cr_started_rsp ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_TC_CTRL_CR_STARTED_RSP +| This signal indicates that the service TC is ready for +| cell reselection, e.g. it stopped running procedures, controlled +| the flow control etc. +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_cr_started_rsp( void ) +{ + T_NC_MVAL *nc_mval; + + TRACE_ISIG( "sig_tc_ctrl_cr_started_rsp" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_WAIT_RSP_4_RR_CR: + SET_STATE(CTRL, CTRL_AUTO_RR_CR); + /* + * Init PSI and psc_db parameters to be able to read/process new SI (PSI) + */ + grr_prepare_db_for_new_cell(); + ctrl_send_cell_reselection_req( CR_COMPLETE ); + break; + case CTRL_GRR_NC_CCO: + if(grr_t_status( T3176 ) > 0 ) + { + ctrl_start_cell_reselection( CTRL_CR_TYPE_NEW, TRUE ); + } + else + { + TRACE_ASSERT( grr_data->db.cr_cell NEQ NULL ); + + nc_mval = &grr_data->db.nc_mval_list.nc_mval[grr_data->db.cr_cell->idx]; + + switch( nc_mval->sync_info.sync.status ) + { + case( STAT_SYNC_OK ): + ctrl_start_cell_reselection( CTRL_CR_TYPE_NEW, TRUE ); + + TRACE_EVENT( "sig_tc_ctrl_cr_started_rsp: cell already known(sync ok!)" ); + break; + + case( STAT_SYNC_NONE ): + ctrl_start_cell_reselection( CTRL_CR_TYPE_NEW_NOT_SYNCED, TRUE ); + break; + + case( STAT_SYNC_FAILED ): + default: + /* stay in the serving cell */ + break; + } + } + break; + case CTRL_CR: + case CTRL_CR_IN_SUSP: + ctrl_handle_new_candidate( TRUE ); + break; + + case CTRL_READY: + ctrl_handle_no_more_candidate( CTRL_CR_TYPE_CS, TRUE ); + break; + + case CTRL_RR_CR_IN_SUSP: + ctrl_send_cell_reselection_req( CR_COMPLETE ); + break; + + default: + sig_tc_ctrl_tbf_release_cnf( ); + break; + } +}/* sig_tc_ctrl_cr_started_rsp*/ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_tbf_release_cnf ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_tbf_release_cnf ( void ) +{ + TRACE_ISIG( "sig_tc_ctrl_tbf_release_cnf" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_ACCESS_DISABLED: + case CTRL_READY_TO_PROGRESS: + switch( grr_data->ctrl.psi_tbf_rel_cause ) + { + case CTRL_PTRC_PBCCH_ESTABLISHED: + ctrl_start_monitoring_ccch( PAG_MODE_DEFAULT ); + ctrl_start_monitoring_bcch( UPDATE_SI13 ); + ctrl_stop_rr_task_req( GLBL_PCKT_MODE_NULL, TASK_STOP_DUMMY_VALUE ); + + grr_data->ctrl.rr_state.cr_ind_return = CR_IND_RETURN_COMPLETE; + break; + + case CTRL_PTRC_COMPLETE_SI_READING: + ctrl_start_monitoring_ccch( PAG_MODE_DEFAULT ); + ctrl_start_monitoring_bcch( COMPLETE_SI ); + sig_ctrl_psi_access_disabled( PSI_DC_OTHER ); + break; + + case CTRL_PTRC_COMPLETE_PSI_READING: + sig_ctrl_psi_access_disabled( PSI_DC_READ_PSI ); + break; + } + + grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_NONE; + break; + + default: + TRACE_ERROR( "SIG_TC_CTRL_TBF_RELEASE_CNF unexpected" ); + break; + } +}/* sig_tc_ctrl_tbf_release_cnf */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_rel_state ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_TC_CTRL_REL_STATE +| This signal indicates that the service TC started or performed +| tbf release +| Parameters : T_RELEASE_STATE rel_state +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_rel_state(T_RELEASE_STATE rel_state) +{ + TRACE_ISIG( "sig_tc_ctrl_rel_state" ); + + sig_ctrl_psi_rel_state(rel_state); + +}/* sig_tc_ctrl_rel_state*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_control_block_result ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_control_block_result + ( T_BLK_OWNER blk_owner, BOOL is_success ) +{ + TRACE_ISIG( "sig_tc_ctrl_control_block_result" ); + + ctrl_send_control_block_result( blk_owner, is_success ); + +}/* sig_tc_ctrl_control_block_result */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_send_stop_task_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_TC_CTRL_STOP_TASK_REQ +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_send_stop_task_req( UBYTE v_stop_ccch ) +{ + TRACE_ISIG( "sig_tc_ctrl_send_stop_task_req" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + case CTRL_GRR_NC_CCO: + ctrl_send_rrgrr_stop_task_req( CTRL_TASK_BCCH, v_stop_ccch ); + break; + default: + sig_ctrl_tc_stop_task_cnf_received( ); + TRACE_ERROR( "SIG_TC_CTRL_STOP_TASK_REQ unexpected" ); + break; + } +}/* sig_tc_ctrl_send_stop_task_req */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_ctrl_cc_order ++------------------------------------------------------------------------------ +| Description : Handles the signal SIG_GFP_CTRL_CC_ORDER +| +| Parameters : - +| ++------------------------------------------------------------------------------ +*/ +#ifdef REL99 +GLOBAL void sig_gfp_ctrl_cc_order(T_TIME time_to_poll ) +#else +GLOBAL void sig_gfp_ctrl_cc_order( void ) +#endif +{ + MCAST( d_cell_chan_order, D_CELL_CHAN_ORDER ); + TRACE_ISIG( "sig_gfp_ctrl_cc_order" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + + if (grr_data->nc2_on) + { +#ifdef REL99 + if(time_to_poll > 0) + { + vsi_t_start(GRR_handle, T_POLL_TIMER,time_to_poll); + memcpy(&grr_data->ctrl.pcco, d_cell_chan_order, sizeof(T_D_CELL_CHAN_ORDER)); + grr_data->ctrl.poll_for_msg = GRR_PCCO_POLL; + } + else +#endif + { + TRACE_EVENT( "PACKET CELL CHANGE ORDER RECEIVED" ); + + ctrl_cell_change_order + ( CCO_TYPE_GRR, (void *)d_cell_chan_order ); + } + } + else + { + TRACE_EVENT( "PACKET CELL CHANGE ORDER RECEIVED,but NC2 is deactivated" ); + } + + break; + + default: + TRACE_ERROR( "SIG_GFP_CTRL_CC_ORDER unexpected" ); + break; + } + +} /* sig_gfp_ctrl_cc_order() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_ctrl_dsf_ind ++------------------------------------------------------------------------------ +| Description : This signal indicates that a downlink signalling failure has +| occured, we have to reselect a new cell +| Parameters : payload to primitive +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_ctrl_dsf_ind ( void ) +{ + TRACE_ISIG( "sig_gfp_ctrl_dsf_ind" ); + + /* 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. */ + sig_ctrl_cs_reset_meas_rep_params ( ); + + ctrl_failure_processing( FAIL_SIG_DSF_IND ); + +}/* sig_gfp_ctrl_dsf_ind*/ + +#if defined (REL99) AND defined (TI_PS_FF_EMR) +/* ++------------------------------------------------------------------------------ +| Function : sig_cs_ctrl_enh_meas_report ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CS_CTRL_ENH_MEAS_REPORT +| +| Parameters : T_U_ENHNC_MEAS_REPORT *enh_meas_report +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_cs_ctrl_enh_meas_report ( T_U_ENHNC_MEAS_REPORT *enh_meas_report) +{ + TRACE_ISIG( "sig_cs_ctrl_enh_meas_report" ); + + switch( GET_STATE( CTRL ) ) + { + case CTRL_IN_PROGRESS: + case CTRL_GRR_NC_CCO: + ctrl_send_control_block( CGRLC_BLK_OWNER_CS, (void*)enh_meas_report ); + break; + default: + TRACE_ERROR( "SIG_CS_CTRL_ENH_MEAS_REPORT unexpected" ); + break; + } +} /* sig_cs_ctrl_enh_meas_report() */ +#endif + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_ctrl_test_mode_ind ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_ctrl_test_mode_ind(void) +{ + TRACE_EVENT("sig_tc_ctrl_test_mode_ind"); + if(grr_data->test_mode NEQ CGRLC_NO_TEST_MODE) + { + ctrl_stop_monitoring_ccch(); + } + +}