view g23m-gsm/alr/alr_main.c @ 49:908742e46a7f default tip

README: FC Selenite updates
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 14 Apr 2020 21:55:22 +0000
parents 75a11d740a02
children
line wrap: on
line source

/*
+-----------------------------------------------------------------------------
|  Project :  GSM-PS
|  Modul   :  ALR_MAIN
+-----------------------------------------------------------------------------
|  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 Modul defines the functions for the SDL process
|             Main_Control of the ALR functionality.
+-----------------------------------------------------------------------------
*/

#ifndef ALR_MAIN_C
#define ALR_MAIN_C

#include "config.h"
#include "fixedconf.h"
#include "condat-features.h"

#define ENTITY_PL

/*==== INCLUDES ===================================================*/
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "typedefs.h"
#include "message.h"
#include "ccdapi.h"
#include "vsi.h"
#include "custom.h"
#include "gsm.h"
#include "prim.h"
#include "cnf_alr.h"
#include "mon_alr.h"
#include "pei.h"
#include "tok.h"
#include "pcm.h"

#ifdef GPRS
#include "alr_gprs.h"
#endif

#if defined (WIN32)
#define TRACING
#else
/* #define TRACING */
/* #define DL_TRACE_ENABLED */
#endif

#include "alr.h"
#include "alr_em.h"

#if defined (TRACING)
#define ALR_TRACE_MAIN(a)  ALR_TRACE(a)
#else
#define ALR_TRACE_MAIN(a)
#endif

#if defined (TRACING)

#define ALR_TRACE_MAIN_BSIC_REQ(s)    TRACE_EVENT_P1 ("bsic_req state %d",s)
#define ALR_TRACE_MAIN_RAND_ACC(s,m)  TRACE_EVENT_P2 ("con est on for: %d %d times", s, m);
#define ALR_TRACE_MAIN_SCELL(o,s)     TRACE_EVENT_P2 ("SC [%d]->[%d]", o, s)
#define ALR_TRACE_MAIN_VALID_BLOCK(m) TRACE_EVENT_P1 ("VALID BLOCK %d", m)
#define ALR_TRACE_MAIN_SI_UNEQ(c)     TRACE_EVENT_P1 ("si uneq %d", c)
#define ALR_TRACE_MAIN_CR(m)          TRACE_EVENT_P1 ("VALID BLOCK CR %d",m)
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
#define ALR_TRACE_MAIN_RACH(t)        TRACE_EVENT_P1 ("powerclass txpwr %d", t)
#else
#define ALR_TRACE_MAIN_RACH(p,t)      TRACE_EVENT_P2 ("powerclass gsm %d txpwr %d", p, t)
#endif
#define ALR_TRACE_MAIN_POWER_CNF      { USHORT i; \
                                      TRACE_EVENT_P1 ("power cnf: %d channels", mph_power_cnf->num_of_chan)\
                                      for (i = 0; i < mph_power_cnf->num_of_chan; i++) { \
                                        TRACE_EVENT_P2 ("rx_lev[%4d]= %d", \
                                          mph_power_cnf->arfcn[i]&ARFCN_MASK, \
                                          mph_power_cnf->rx_lev[i]);} }
#define ALR_TRACE_MAIN_RA_CNF(t1,t2,t3) TRACE_EVENT_P3 ("af: %d %d %d", t1,t2,t3)

#else /* TRACING */

#define ALR_TRACE_MAIN_BSIC_REQ(s)
#define ALR_TRACE_MAIN_RAND_ACC(s,m)
#define ALR_TRACE_MAIN_SCELL(o,s)
#define ALR_TRACE_MAIN_VALID_BLOCK(m)
#define ALR_TRACE_MAIN_SI_UNEQ(c)
#define ALR_TRACE_MAIN_CR(m)
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
#define ALR_TRACE_MAIN_RACH(t)
#else
#define ALR_TRACE_MAIN_RACH(p,t)
#endif
#define ALR_TRACE_MAIN_POWER_CNF
#define ALR_TRACE_MAIN_RA_CNF(t1,t2,t3)

#endif  /* TRACING */

/*==== EXPORT =====================================================*/

/*==== PRIVAT =====================================================*/

/*==== VARIABLES ==================================================*/
LOCAL UBYTE from_dedicated = FALSE;

/*==== FUNCTIONS ==================================================*/

LOCAL BOOL ma_compare_dedi_sys_buffer (T_MPHC_DATA_IND *mphc_data_ind,
                                       UBYTE msg_t);
LOCAL void ma_fill_dedi_sys_buffer (T_MPHC_DATA_IND *mphc_data_ind,
                                    UBYTE msg_t);
LOCAL void ma_stop_rxlev_periodic_req (void);
LOCAL BOOL ma_compare_sys_buffer (T_MPHC_DATA_IND *mphc_data_ind,
                                  UBYTE msg_t);
LOCAL void ma_send_dedi_unitdata (T_MPHC_DATA_IND *data_ind);
LOCAL void ma_sync_ind (UBYTE cause, USHORT arfcn);
LOCAL void ma_set_si_bitmap (UBYTE msg_t);
LOCAL void ma_fill_sys_buffer (T_MPHC_DATA_IND *data_ind, UBYTE msg_t);
LOCAL void ma_dedi_data_out (T_PH_DATA_IND *data_ind);
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
LOCAL void compare_l1_frequency_band_with_ffs (T_MPHC_INIT_L1_CON *init_l1_cnf);
#endif

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_CS                     |
| STATE   : code                ROUTINE : ma_init                    |
+--------------------------------------------------------------------+

  PURPOSE : Initialize Main Control.

*/

GLOBAL void ma_init (void)
{
  GET_INSTANCE_DATA;
  memset (alr_data, 0, sizeof (T_ALR_DATA));
  alr_data->state[STATE_MA] = MA_NULL;

  alr_data->mmi = 2;        /* EVA 4 Board */
  alr_data->keypad = 2;        /* EVA 4 Board */
  alr_data->ext_display = FALSE;    /* internal display */
  alr_data->pch_data.last_start_ccch_req.bs_pa_mfrms = NOT_PRESENT_8BIT;
  ma_clean_sys_buffer (IND_ALL_SI);
  ma_clean_dedi_sys_buffer ();
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_idle_req            |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_IDLE_REQ.

*/

UBYTE v_eotd = 0;  /* for test automation */

GLOBAL void ma_mph_idle_req (T_MPH_IDLE_REQ* idle)
{
  GET_INSTANCE_DATA;
  if(idle->mod EQ MODE_CELL_SELECTION)
  {
    alr_data->nc_data.eotd_avail = idle->eotd_avail | v_eotd;
#if defined (REL99) && defined (TI_PS_FF_EMR)
    if(idle->si2quater_status EQ SI2QUATER_CONFIGURE)
    {
      alr_data->nc_data.si2quater_status = SI2QUATER_CONFIGURE;
      alr_data->nc_data.si2quater_pos = idle->si2quater_pos;
    }
    else if(idle->si2quater_status EQ SI2QUATER_ABSENT )
    {
      alr_data->nc_data.si2quater_status = SI2QUATER_ABSENT;
    }
    alr_data->nc_data.si2_count = NOT_PRESENT_8BIT;
#endif
  }

  switch (GET_STATE (STATE_MA))
  {
    case MA_DEDICATED:
      ALR_TRACE_MAIN ("leave dedi");
      ma_stop_active_procs(DONT_STOP_PCH_READING);
      alr_data->bs_pa_mfrms = idle->bs_pa_mfrms;
      nc_new_serving_cell (idle->arfcn);

      switch(idle->mod)
      {
        case MODE_CELL_RESELECTION:
          ALR_TRACE_MAIN ("CR");
          trc_state_transition(__LINE__, MA_CELL_RESELECTION);
          SET_STATE (STATE_MA, MA_CELL_RESELECTION);
#ifdef GPRS
          /*
           * if going to a PBCCH cell we have to update the
           * ncell states with GRR
           */
          gprs_alr_init();
          alr_data->nc_sync_with_grr = TRUE;
#endif
          from_dedicated = TRUE;
          rach_init ();
          rach_configure_power (idle->power);
          pch_configure (idle, PGM_REORG);
          pch_save_pgm(PGM_REORG_CS); /* reset saved pgm to REORG_CS */
          nc_suspend ();  /* to set the nc state      */
          nc_start_reselect (idle->arfcn);
          break;
        case MODE_CELL_SELECTION:
          ALR_TRACE_MAIN ("CS");
          if (idle->arfcn NEQ alr_data->old_serving_cell)
          {
            ALR_TRACE_MAIN ("CS but different cell!!!");
          }
          trc_state_transition(__LINE__, MA_IDLE);
          SET_STATE(STATE_MA, MA_IDLE);
          nc_suspend(); /* stop dedicated mode activity */
          nc_add_offset();
#ifdef GPRS
          set_gprs_support(idle->gprs_support);
#endif
          pch_configure (idle, SAVED_PGM);
          pch_start_ccch_req();
          cb_start();

          nc_start_monitoring();
          break;
#ifdef GPRS
        case MODE_CONFIG_PL: /* Cell has PBCCH */
          ma_stop_active_procs(STOP_PCH_READING);
          nc_suspend(); /* stop dedicated mode activity */
          gprs_alr_init();
          set_gprs_support(idle->gprs_support);
          alr_data->nc_sync_with_grr = TRUE; 
          alr_data->gprs_data.pbcch      = TRUE;
          nc_add_offset(); /* convert counters */

          rach_init ();
          rach_configure_power (idle->power);
          pch_configure (idle, PGM_NORMAL);
          alr_data->nc_sync_with_grr = TRUE;
          SET_STATE(STATE_MA, MA_IDLE);
          break;
#endif
        default:
          break;
      }
      break;
    case MA_CON_EST:
#ifdef GPRS
      if(idle->mod EQ MODE_PACKET_TRANSFER) /* transition to PTM */
      { /*
         * NC BCCH reading doesn't need to be stopped, because it has
         * already been stopped when entering MA_CON_EST
         */
        ma_stop_active_procs(STOP_PCH_READING);
        SET_STATE (STATE_MA, MA_PTM);
      }
      else
      {
#endif  /* GPRS */
        ma_stop_active_procs(DONT_STOP_PCH_READING);
        rach_configure_power (idle->power);
        alr_data->bs_pa_mfrms = idle->bs_pa_mfrms;
        nc_new_serving_cell (idle->arfcn);
#ifdef GPRS
        if(idle->mod EQ MODE_CONFIG_PL)
        {
          ma_stop_active_procs(STOP_PCH_READING);
          gprs_alr_init();
          set_gprs_support(idle->gprs_support);
          alr_data->gprs_data.pbcch      = TRUE;
          alr_data->nc_sync_with_grr = TRUE; 
          rach_init ();
          rach_configure_power (idle->power);
          pch_configure (idle, PGM_NORMAL);
          SET_STATE(STATE_MA, MA_IDLE);
        }
        else
        {
#endif
          if (idle->arfcn EQ alr_data->old_serving_cell)
          {
            /* coming back after RACH failure */
            trc_state_transition(__LINE__, MA_IDLE);
            SET_STATE (STATE_MA, MA_IDLE);
#ifdef GPRS
            set_gprs_support(idle->gprs_support);
#endif
            pch_configure (idle, SAVED_PGM);
            pch_start_ccch_req();
            cb_start();
            nc_start_monitoring();
          }
          else
          {
            trc_state_transition(__LINE__, MA_CELL_RESELECTION);
            SET_STATE (STATE_MA, MA_CELL_RESELECTION);
#ifdef GPRS
            /*
             * if going to a PBCCH cell we have to update the
             * ncell states with GRR
             */
            gprs_alr_init();
            alr_data->nc_sync_with_grr = TRUE;
#endif
            pch_configure (idle, PGM_REORG);
            pch_save_pgm(PGM_REORG_CS); /* reset saved pgm to REORG_CS */
            nc_start_reselect (idle->arfcn);
          }
#ifdef GPRS
        }
      }
#endif
      break;
    case MA_CELL_SELECTION:
      TRACE_EVENT_P1 ("SC[%u] in use, leave CS", idle->arfcn);

#ifdef GPRS
      if(idle->mod EQ MODE_CONFIG_PL)
      {
        ma_stop_active_procs(STOP_PCH_READING);
        gprs_alr_init();
        set_gprs_support(idle->gprs_support);
        alr_data->gprs_data.pbcch      = TRUE;
        alr_data->nc_sync_with_grr = TRUE;
        rach_init ();
        rach_configure_power (idle->power);
        nc_new_serving_cell (idle->arfcn);
        pch_configure (idle, PGM_NORMAL);
        SET_STATE(STATE_MA, MA_IDLE);
        break;
      }
#endif

      ALR_EM_CONFIGURE_IDLE_MODE;

      ma_stop_active_procs(DONT_STOP_PCH_READING);

      trc_state_transition(__LINE__, MA_IDLE);
      SET_STATE (STATE_MA, MA_IDLE);
#ifdef GPRS
      alr_data->nc_sync_with_grr=FALSE;
      set_gprs_support(idle->gprs_support);
#endif
      rach_configure_power (idle->power);
      alr_data->bs_pa_mfrms = idle->bs_pa_mfrms;
      nc_check_new_ncc_permitted (idle->ncc_permitted);
      nc_new_serving_cell (idle->arfcn);
      pch_configure (idle, PGM_REORG_CS);
      pch_save_pgm(0); /* reset saved pgm to REORG_CS */
      pch_start_ccch_req();
      /*
       * nc_start_monitoring will be called when ncell list from RR
       * is received
       */
      break;

    case MA_IDLE:
      switch (idle->mod)
      {
#ifdef GPRS
        case MODE_PACKET_TRANSFER: /* transition to PTM */
          /*NC BCCH reading will be stopped when leaving idle*/
          ma_stop_active_procs(STOP_PCH_READING | STOP_MEASUREMENTS);
          SET_STATE (STATE_MA, MA_PTM);
          break;
        case MODE_CONFIG_PL:
          ma_stop_active_procs(STOP_PCH_READING|STOP_MEASUREMENTS);
          gprs_alr_init();
          set_gprs_support(idle->gprs_support);
          /* PBCCH activated in cell */
          alr_data->nc_sync_with_grr = TRUE;
          alr_data->gprs_data.pbcch  = TRUE;
          rach_init ();
          rach_configure_power (idle->power);
          pch_configure (idle, PGM_NORMAL);
          SET_STATE(STATE_MA, MA_IDLE);
          break;
#endif  /* GPRS */

        case MODE_CELL_RESELECTION:
          ALR_TRACE_MAIN ("idle mode cr");

          ma_stop_active_procs(STOP_PCH_READING | STOP_MEASUREMENTS);

          trc_state_transition(__LINE__, MA_CELL_RESELECTION);
          SET_STATE (STATE_MA, MA_CELL_RESELECTION);
#ifdef GPRS
          /*
           * if going to a PBCCH cell we have to update the
           * ncell states with GRR
           */
          gprs_alr_init();
          alr_data->nc_sync_with_grr = TRUE;
#endif
          rach_init ();
          rach_configure_power (idle->power);
          TRACE_EVENT("IDLE_REQ : Cell found after CR");
          alr_data->bs_pa_mfrms = idle->bs_pa_mfrms;
//          nc_check_new_ncc_permitted(idle->ncc_permitted);
          nc_new_serving_cell (idle->arfcn);
          pch_configure (idle, PGM_REORG);
          pch_save_pgm(PGM_REORG_CS); /* reset saved pgm to REORG_CS */
          nc_start_reselect (idle->arfcn);
          break;
#ifdef GPRS
        case MODE_CELL_RESELECTION_SYNC_ONLY:
          if(alr_data->gprs_data.pbcch)
          {
            alr_data->gprs_data.sync_only=1;
            alr_data->gprs_data.ptm=0;
            ma_stop_active_procs(STOP_PCH_READING);
            trc_state_transition(__LINE__, MA_CELL_RESELECTION);
            SET_STATE (STATE_MA, MA_CELL_RESELECTION);
            nc_new_serving_cell (idle->arfcn);
            nc_start_reselect  (idle->arfcn);
          }
          break;
#endif
        case MODE_SYS_INFO_CHANGE:
          ALR_TRACE_MAIN ("idle mode sys info changed");
          rach_init ();
          rach_configure_power (idle->power);

          alr_data->bs_pa_mfrms = idle->bs_pa_mfrms;
          nc_check_new_ncc_permitted (idle->ncc_permitted);

          if((idle->tn/2) NEQ
             (alr_data->pch_data.pl_idle.ccch_group)
#ifdef GPRS
             OR alr_data->gprs_data.pbcch
#endif
            )
          {
            /* stop CCCH reading beforehand */
            ma_stop_active_procs(STOP_PCH_READING | STOP_MEASUREMENTS);
#ifdef GPRS
            gprs_alr_init();
            set_gprs_support(idle->gprs_support);
#endif
            pch_configure (idle, PGM_REORG_CS);
            pch_save_pgm(PGM_REORG_CS); /* reset saved pgm to REORG_CS */
            pch_start_ccch_req();

            nc_start_monitoring ();
          }
          else
          {
#ifdef GPRS
            if(idle->reorg_only EQ NORMAL_PGM AND
               alr_data->gprs_data.ign_pgm EQ TRUE)
            {
              /*
               * use last page mode read on PCH
               * when the NON_DRX_TIMER has expired
               */
              pch_configure (idle, SAVED_PGM);
              pch_start_ccch_req();
              alr_data->gprs_data.ign_pgm = FALSE;
            }
            else if(alr_data->gprs_data.ign_pgm EQ FALSE)
            {
              set_gprs_support(idle->gprs_support);
              if(gprs_alr_is_supported())
              {
                gprs_alr_init();
                set_gprs_support(idle->gprs_support);
                ma_stop_scell_bcch_req();
              }
#endif
              pch_save_pgm(0); /* save current pgm */
              pch_configure (idle, SAVED_PGM);
              pch_start_ccch_req();
#ifdef GPRS
            }
            /* other case should not happen */
#endif

          }
          break;
        case MODE_CELL_SELECTION:
          /* XXX does not seem to be used by RR*/
          break;
      default:
        break;
      }
      break;
    case MA_CELL_RESELECTION:
      switch(idle->mod)
      {
        case MODE_CELL_SELECTION:

          ALR_TRACE_MAIN ("from cr use cell");
          /* we have found a suitable cell */
          ma_stop_active_procs(DONT_STOP_PCH_READING);
          rach_init ();
          rach_configure_power (idle->power);
          TRACE_EVENT("IDLE_REQ : PM config after CR");
          alr_data->bs_pa_mfrms = idle->bs_pa_mfrms;
          nc_check_new_ncc_permitted (idle->ncc_permitted);
          if (from_dedicated)
          {
            from_dedicated = FALSE;
            nc_add_offset ();
          }
          pch_configure (idle, SAVED_PGM);

	  /*
           * For OMAPS#90692 - Move to MA_IDLE before configuring 
           * the serving cell BCCH request, so as not to reset the
           * si_bitmap again 
           */
          trc_state_transition(__LINE__, MA_IDLE);
          SET_STATE (STATE_MA, MA_IDLE);
          pch_start_ccch_req();
#ifdef GPRS
          alr_data->nc_sync_with_grr=FALSE;
          set_gprs_support(idle->gprs_support);
#endif

          /*
           * resume neighbourcell operation
           */
          nc_start_monitoring ();
          break;
        case MODE_CELL_RESELECTION:
          /* the last cell wasn't the right one, try again */
          ma_stop_active_procs(STOP_PCH_READING);
	  /* don't forget to stop all processes */
#ifdef GPRS
          gprs_alr_init();
#endif
          alr_data->bs_pa_mfrms = idle->bs_pa_mfrms;
//          nc_check_new_ncc_permitted (idle->ncc_permitted);
          nc_new_serving_cell (idle->arfcn);
          pch_configure (idle, PGM_REORG);
          pch_save_pgm(PGM_REORG_CS); /* reset saved pgm to REORG_CS */
          nc_start_reselect (idle->arfcn);
          break;
#ifdef GPRS
        case MODE_CONFIG_PL:
          ma_stop_active_procs(STOP_PCH_READING);
          if (from_dedicated) from_dedicated = FALSE;

          gprs_alr_init();
          set_gprs_support(idle->gprs_support);
          alr_data->gprs_data.pbcch      = TRUE;
          alr_data->nc_sync_with_grr = TRUE;
          rach_init ();
          rach_configure_power (idle->power);
          pch_configure (idle, PGM_NORMAL);
          SET_STATE(STATE_MA, MA_IDLE);
          break;
#endif
        default:
          break;
      }
      break;
#ifdef GPRS
    case MA_PTM:
      /* back to packet idle */
      ma_stop_active_procs(DONT_STOP_PCH_READING);
      rach_configure_power (idle->power);
      alr_data->bs_pa_mfrms      = idle->bs_pa_mfrms;
      nc_new_serving_cell (idle->arfcn);
      nc_suspend();
      if (idle->arfcn EQ alr_data->old_serving_cell)
      {
        trc_state_transition(__LINE__, MA_IDLE);
        SET_STATE(STATE_MA, MA_IDLE);
#ifdef GPRS
        set_gprs_support(idle->gprs_support);
#endif

        if(idle->reorg_only EQ REORG_ONLY)
        {
          pch_configure (idle, PGM_REORG_CS);
          alr_data->gprs_data.ign_pgm = TRUE;
        }
        else
        {
          pch_configure (idle, SAVED_PGM);
          alr_data->gprs_data.ign_pgm = FALSE;
        }
        pch_start_ccch_req();
        cb_start();
        nc_start_monitoring();
      }
      else
      {
        trc_state_transition(__LINE__, MA_CELL_RESELECTION);
        SET_STATE (STATE_MA, MA_CELL_RESELECTION);
#ifdef GPRS
        /*
         * if going to a PBCCH cell we have to update the
         * ncell states with GRR
         */
        gprs_alr_init();
        alr_data->nc_sync_with_grr = TRUE;
#endif
        pch_configure (idle, PGM_REORG);
        pch_save_pgm(PGM_REORG_CS); /* reset saved pgm to REORG_CS */
        nc_start_reselect (idle->arfcn);
      }
      break;
#endif
    default:
      break;
  }
  PFREE (idle);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_neighbourcell_req   |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_NEIGHBOURCELL_REQ.

*/

GLOBAL void ma_mph_neighbourcell_req (T_MPH_NEIGHBOURCELL_REQ* mph_neighbourcell_req)
{
  GET_INSTANCE_DATA;

  switch (GET_STATE (STATE_MA))
  {
    case MA_IDLE:
    case MA_DEDICATED:
      nc_ncell_list (mph_neighbourcell_req);

      ALR_EM_CONFIGURE_NEIGHBOUERCELL_LIST;

      break;
#ifdef GPRS
    case MA_PTM:
      /*In PTM just update the BA list. No need to start monitoring at L1 through MPHC*/
      /*
       * mix new list with old list
       */
      nc_update_ba_list (alr_data->serving_cell, mph_neighbourcell_req);
      break;
#endif

    default:
      break;
  }
  PFREE (mph_neighbourcell_req);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_dedicated_req       |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_DEDICATED_REQ.

*/

GLOBAL void ma_mph_dedicated_req (T_MPH_DEDICATED_REQ* dedi)
{
  GET_INSTANCE_DATA;
  switch (GET_STATE (STATE_MA))
  {
    case MA_CON_EST:
        ALR_TRACE_MAIN ("dedi on");

        ma_stop_active_procs (STOP_PCH_READING);
        trc_state_transition(__LINE__, MA_DEDICATED);
        SET_STATE (STATE_MA, MA_DEDICATED);
        dedi_req (dedi);
        ma_clean_dedi_sys_buffer ();
        nc_start_dedicated (dedi->tr_para.pwrc, dedi->tr_para.dtx);
      break;

    case MA_DEDICATED:
      dedi_req (dedi);
      break;

    default:
      break;
  }
  PFREE (dedi);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_dedicated_fail_req  |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_DEDICATED_FAIL_REQ.

*/

GLOBAL void ma_mph_dedicated_fail_req (T_MPH_DEDICATED_FAIL_REQ* mph_dedicated_fail_req)
{
  dedi_fail_req ();
  PFREE (mph_dedicated_fail_req);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_ciphering_req       |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_CIPHERING_REQ.

*/

GLOBAL void ma_mph_ciphering_req (T_MPH_CIPHERING_REQ* mph_ciphering_req)
{
  dedi_ciph_req (mph_ciphering_req);
  PFREE(mph_ciphering_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_freq_redef_req      |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_FREQ_REDEF_REQ.

*/

GLOBAL void ma_mph_freq_redef_req (T_MPH_FREQ_REDEF_REQ* mph_freq_redef_req)
{
  dedi_freq_redef_req(mph_freq_redef_req);
  PFREE(mph_freq_redef_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_channel_mode_req    |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_CHANNEL_MODE_REQ.

*/

GLOBAL void ma_mph_channel_mode_req (T_MPH_CHANNEL_MODE_REQ* mph_channel_mode_req)
{
  dedi_chan_mode_req (mph_channel_mode_req);
  PFREE(mph_channel_mode_req);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_deactivate_req      |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_DEACTIVATE_REQ.

*/

GLOBAL void ma_mph_deactivate_req (T_MPH_DEACTIVATE_REQ* mph_deactivate_req)
{
  GET_INSTANCE_DATA;
  UBYTE flags = 0;
  PREUSE (mph_deactivate_req, mphc_deactivate_req, MPHC_DEACTIVATE_REQ);

  if (alr_data->pch_data.last_start_ccch_req.bs_pa_mfrms NEQ NOT_PRESENT_8BIT)
    flags |= STOP_PCH_READING;

  switch (GET_STATE(STATE_MA))
  {
    case MA_CELL_SELECTION:
    case MA_CELL_RESELECTION:
    case MA_CON_EST:
    case MA_DEDICATED:
#ifdef GPRS
    case MA_PTM:
#endif
      break;
    case MA_IDLE:
#ifdef GPRS
      if (alr_data->gprs_data.pbcch EQ TRUE)
        break;
#endif
      /*lint -fallthrough*/
    default:
      flags |= STOP_MEASUREMENTS;
      break;
  }

  ma_stop_active_procs(flags);

  ALR_EM_DEACTIVATE_L1;

  /*
   * There is no activation request for ALR. Therefore ALR is prepared
   * here for the next powering on by stopping really all running processes
   * and reinitialising the state variables.
   */
  nc_stop ();

  cb_init ();
  cs_init ();
  pch_init ();
  dedi_init ();
  SET_STATE(STATE_MA, MA_NULL); /* it isn't clear whether the whole ma_init() should be performed */
  ma_clean_sys_buffer (IND_ALL_SI);
  ma_clean_dedi_sys_buffer ();

  PSENDX(L1, mphc_deactivate_req);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_classmark_req       |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_CLASSMARK_REQ.

*/

GLOBAL void ma_mph_classmark_req (T_MPH_CLASSMARK_REQ* classmark)
{
  rach_configure_class (classmark->classmark.pclass,
                        classmark->classmark.pclass2);

  ALR_EM_CONFIGURE_CLASSMARK;

  PFREE (classmark);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_ext_meas_req        |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_EXT_MEAS_REQ.

*/

GLOBAL void ma_mph_ext_meas_req (T_MPH_EXT_MEAS_REQ* mph_ext_meas_req)
{
  GET_INSTANCE_DATA;
  /* Process CS must be state CS_NULL (no Cell Selection active) */

  if ( GET_STATE ( STATE_CS ) EQ CS_NULL )
  {
    mph_ext_meas_req->pch_interrupt = NO_PCH_INTERRUPT;

    /* alr_data->cs_data.mph_ext_meas_req must be NULL */

    if ( IS_EXT_MEAS_RUNNING ) /*alr_data->cs_data.mph_ext_meas_req NEQ NULL*/
    {
      PFREE ( alr_data->cs_data.mph_ext_meas_req );
    }
    alr_data->cs_data.mph_ext_meas_req    = mph_ext_meas_req;
    alr_data->cs_data.ext_meas_state_pend = CS_NULL;

    ma_mph_power_req((T_MPH_POWER_REQ*) mph_ext_meas_req);
  }
  else
  {
    PALLOC ( mph_ext_meas_cnf, MPH_EXT_MEAS_CNF );
    mph_ext_meas_cnf->num_of_chan = 0;
    PSENDX ( RR, mph_ext_meas_cnf );

    PFREE (mph_ext_meas_req);
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_tch_loop_req        |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_TCH_LOOP_REQ.

*/

GLOBAL void ma_mph_tch_loop_req (T_MPH_TCH_LOOP_REQ* mph_tch_loop_req)
{
  dedi_tch_loop_req (mph_tch_loop_req);
  PFREE(mph_tch_loop_req);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_dai_req             |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_DAI_REQ.

*/

GLOBAL void ma_mph_dai_req (T_MPH_DAI_REQ* mph_dai_req)
{
  dedi_dai_req (mph_dai_req);
  PFREE(mph_dai_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_cbch_req            |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_CBCH_REQ.

*/


GLOBAL void ma_mph_cbch_req (T_MPH_CBCH_REQ* cbch_req)
{
  cb_mph_cbch_req( &cbch_req->cbch);
  PFREE (cbch_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_identity_req        |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_IDENTITY_REQ.

*/

GLOBAL void ma_mph_identity_req (T_MPH_IDENTITY_REQ* mph_identity_req)
{
  pch_identity_req (mph_identity_req);
  PFREE (mph_identity_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_sync_req            |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_SYNC_REQ.

*/

GLOBAL void ma_mph_sync_req (T_MPH_SYNC_REQ* mph_sync_req)
{
  GET_INSTANCE_DATA;
  switch (mph_sync_req->cs)
  {
    case CS_CLEAN_SYS_INFO:
      /*
       * clean stored system information messages to force
       * sending to RR.
       */
      ma_clean_dedi_sys_buffer ();
      break;

    case CS_STOP_BCCH_READING:
      switch (GET_STATE (STATE_MA))
      {
        case MA_CELL_SELECTION:
          cs_stop ();
          break;
        case MA_IDLE:
          nc_stop_rr_activity (FALSE);
          break;
      }
      break;

    case CS_STOP_PLMN_SEARCH:
      switch (GET_STATE (STATE_MA))
      {
        case MA_CELL_SELECTION:
          cs_stop ();
          break;
        case MA_IDLE:
          /*
           * PLMN search is stopped. If mobile was in REORG before
           * PLMN search, this is set again after finishing all BCCH reading.
           */
          if(alr_data->pch_data.pl_idle.page_mode EQ PGM_REORG_NC_SYNC)
          {
            alr_data->pch_data.pl_idle.page_mode = page_mode_before_hplmn_search;
            pch_start_ccch_req ();
            ALR_TRACE_MAIN ("PLMN search complete - REORG reestablished");
          }
          cs_stop ();
          nc_stop_rr_activity (TRUE);
          break;
      }
      break;
    case CS_STOP_PLMN_SEARCH_AND_DEACTIVATE:
      switch (GET_STATE (STATE_MA))
      {
        case MA_CELL_SELECTION:
          cs_stop ();
          break;
        case MA_IDLE:
          /*
           * If mobile was in REORG before PLMN search, this is set again after
           * finishing PLMN search. L1 is not configured, because PCH  reading
           * is stopped anyway
           */
          if(alr_data->pch_data.pl_idle.page_mode EQ PGM_REORG_NC_SYNC)
          {
            alr_data->pch_data.pl_idle.page_mode = page_mode_before_hplmn_search;
            ALR_TRACE_MAIN ("PLMN search complete - REORG reestablished");
          }
          cs_stop ();
          nc_stop_rr_activity (TRUE);
          ma_stop_active_procs(STOP_PCH_READING | STOP_MEASUREMENTS);
          break;
      }
      {
        PALLOC(deact_req, MPHC_DEACTIVATE_REQ);
        PSENDX(L1, deact_req);
      }
      break;
#ifdef GPRS
      case CS_START_PCCO:
      alr_data->gprs_data.pcco_active = TRUE;
      if ( GET_STATE(STATE_MA) EQ MA_PTM )
      {
          ma_stop_active_procs(STOP_MEASUREMENTS |STOP_PCH_READING);
          SET_STATE(STATE_MA, MA_IDLE);
      }
      break;
#endif
    case CS_RXLEV_VAL_REQ:
      switch (GET_STATE(STATE_MA))
      {
#ifdef GPRS
        case MA_PTM:
        case MA_IDLE:
          break;
#endif /* GPRS */
        case MA_DEDICATED:
          /* EMO */
          break;
      }
      break;
    case CS_SYS_INFO_2BIS_SUPPORT_CHANGED:
      if((GET_STATE(STATE_MA) EQ MA_IDLE) AND
          (alr_data->pch_data.pl_idle.page_mode EQ PGM_NORMAL OR
           alr_data->pch_data.pl_idle.page_mode EQ PGM_EXTENDED) AND
           (alr_data->pch_data.reorg_bcch_reading EQ FALSE))
      {
         ma_stop_scell_bcch_req ();
         if(alr_data->cs_data.si_bitmap & SI_2BIS_READ)
           alr_data->cs_data.si_bitmap &= ~(SI_2BIS_READ);
         else
           alr_data->cs_data.si_bitmap |= SI_2BIS_READ;
         sc_start_periodic();
      }
      break;
    case CS_SYS_INFO_2TER_SUPPORT_CHANGED:
      /* Dont start periodic reading if we are in PGM_REORG */
      if((GET_STATE(STATE_MA) EQ MA_IDLE) AND
          (alr_data->pch_data.pl_idle.page_mode EQ PGM_NORMAL OR
           alr_data->pch_data.pl_idle.page_mode EQ PGM_EXTENDED) AND
           (alr_data->pch_data.reorg_bcch_reading EQ FALSE))
      {
        ma_stop_scell_bcch_req ();
        if(alr_data->cs_data.si_bitmap & SI_2TER_READ)
          alr_data->cs_data.si_bitmap &= ~(SI_2TER_READ);
        else
          alr_data->cs_data.si_bitmap |= SI_2TER_READ;
        sc_start_periodic();
      }
      break;
    default:
      break;
  }

  PFREE (mph_sync_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_clean_buf_req       |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_CLEAN_BUF_REQ.

*/

GLOBAL void ma_mph_clean_buf_req (T_MPH_CLEAN_BUF_REQ* mph_clean_buf_req)
{
  ma_clean_sys_buffer(mph_clean_buf_req->si_to_clean);
  PFREE(mph_clean_buf_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_stop_dedi_req       |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_STOP_DEDICATED_REQ.

*/
GLOBAL void ma_mph_stop_dedi_req(T_MPH_STOP_DEDICATED_REQ *stop_dedi)
{
  dedi_stop();
  PFREE(stop_dedi);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_power_req           |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_POWER_REQ and MPH_EXT_MEAS_REQ.

*/

GLOBAL void ma_mph_power_req(T_MPH_POWER_REQ* mph_power_req)
{
  GET_INSTANCE_DATA;
  if ( D_OPC(mph_power_req) EQ MPH_POWER_REQ && IS_EXT_MEAS_RUNNING )
  {
    PALLOC ( mph_power_cnf, MPH_POWER_CNF );
    mph_power_cnf->num_of_chan = 0;
    PSENDX ( RR, mph_power_cnf );
    TRACE_ERROR ( "Cell Sel during Ext Meas");
    PFREE (mph_power_req);
    return;
  }

  if (mph_power_req->freq_bands EQ 0)
  {
    TRACE_ERROR ("MPH_POWER_REQ with freq_bands=0 (Invalid value)!");
    TRACE_ASSERT (mph_power_req->freq_bands EQ 0);
  }

  if(!IS_EXT_MEAS_RUNNING)
  {
    /* CSI-LLD Section : 4.1.3.4.2.2 */
    if(alr_data->cs_data.p_power_req NEQ NULL)
    {
      TRACE_ERROR("MPH_POWER_REQ buffer leakage");
      PFREE(alr_data->cs_data.p_power_req);
    }
    /* Store the MPH_POWER_REQ pointer for later usage */
    alr_data->cs_data.p_power_req = mph_power_req;
  }

  alr_data->cs_data.freq_bands = mph_power_req->freq_bands;

  ALR_EM_POWER_MEASSUREMENT_REQUEST;

  switch (mph_power_req->pch_interrupt)
  {
    case NO_PCH_INTERRUPT:
      /*
       * Full list power measurements without changing the current state
       */
      alr_data->plmn_search_running = TRUE;
      nc_suspend();
      cs_power_req (NO_PCH_INTERRUPT);
      break;
    case PCH_INTERRUPT:
      /*
       * Full list power measurements for Cell Selection
       */
      alr_data->plmn_search_running = FALSE;
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
      alr_multiband_std = NOT_PRESENT_8BIT;
#endif
#ifdef GPRS
      gprs_alr_init();
#endif
      switch (GET_STATE(STATE_MA))
      {
        case MA_NULL:
        case MA_CELL_SELECTION:
          ma_stop_active_procs(DONT_STOP_PCH_READING);
          SET_STATE(STATE_MA, MA_CELL_SELECTION);
          cs_power_req (PCH_INTERRUPT);
          break;
        case MA_CELL_RESELECTION:
          ma_stop_active_procs(STOP_PCH_READING | STOP_MEASUREMENTS);
          nc_stop();
          SET_STATE(STATE_MA, MA_CELL_SELECTION);
          cs_power_req (PCH_INTERRUPT);
          break;
        case MA_CON_EST:
        case MA_DEDICATED:
        case MA_IDLE:
#ifdef GPRS
        case MA_PTM:
          alr_data->nc_sync_with_grr = TRUE;
#endif
          ma_stop_active_procs(STOP_PCH_READING | STOP_MEASUREMENTS);
          /*
           * call this explicitly here, because stop_active_procs only
           * suspends ncell procedures
           */
          nc_stop();
          SET_STATE(STATE_MA, MA_CELL_SELECTION);
          cs_power_req (PCH_INTERRUPT);
          break;
        default:
          if(!IS_EXT_MEAS_RUNNING)
          {
            PFREE (mph_power_req);
            alr_data->cs_data.p_power_req = NULL;
            TRACE_ERROR ("MPH_POWER_REQ received in invalid MA state");
          }
            break;
      }
      break;
    default:
      if(!IS_EXT_MEAS_RUNNING)
      {
        PFREE (mph_power_req);
        alr_data->cs_data.p_power_req = NULL;
        TRACE_ERROR ("MPH_POWER_REQ: Invalid search type");
      }
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_bsic_req            |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_BSIC_REQ.

*/

GLOBAL void ma_mph_bsic_req (T_MPH_BSIC_REQ* mph_bsic_req)
{
  GET_INSTANCE_DATA;
  ALR_TRACE_MAIN_BSIC_REQ (GET_STATE(STATE_MA));

#ifdef GPRS
  if(alr_data->gprs_data.pcco_active)
  {
    cs_bsic_req(mph_bsic_req);
    PFREE (mph_bsic_req);
    return;
  }
#endif

  switch (GET_STATE (STATE_MA))
  {
    case MA_CELL_SELECTION:
      cs_bsic_req (mph_bsic_req);
      break;
    case MA_IDLE:
      nc_bsic_req (mph_bsic_req);
      break;
#ifdef GPRS
    case MA_DEDICATED:

      ma_stop_active_procs(STOP_PCH_READING | STOP_MEASUREMENTS); /* DEDI-state is now DEDI_INACTIVE */
      /* DEDI-state is now DEDI_INACTIVE */
      SET_STATE(STATE_NC, NC_NULL);
#ifdef NOT_YET
      nc_suspend(); /* stop dedicated mode activity */
#endif

      SET_STATE(STATE_MA, MA_CELL_SELECTION);
      cs_bsic_req (mph_bsic_req);
      break;
#endif
    default:
      break;
  }

  PFREE (mph_bsic_req);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_meas_rep_req        |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_MEAS_REP_REQ.
*/

#ifdef GPRS
GLOBAL void ma_mph_meas_rep_req(T_MPH_MEAS_REP_REQ * mph_meas_rep_req)
{
  GET_INSTANCE_DATA;
  USHORT i;
  TRACE_EVENT("mph_meas_rep_req");

  switch(mph_meas_rep_req->cause)
  {
    case NC_START_MEAS:
      /*
       * Reset nc mease results database
       */
      for(i=0;i<=BA_LIST_SIZE;i++)
      {
        alr_data->nc_data.cell[i].nc_rxlev = 0;
        alr_data->nc_data.cell[i].c_nc_rxlev = 0;
      }
      /*
       * activate rx_lev averaging when NC=1 or NC=2
       */
      alr_data->nwctrl_meas_active = TRUE;
      break;
    case NC_REPORT_MEAS:
      /*
       * Calculate rx_lev average and send the report to RR. RR forwards this to GRR
       */
      if(alr_data->nwctrl_meas_active)
      {
        PALLOC(mph_meas_rep_cnf, MPH_MEAS_REP_CNF);
        memset(mph_meas_rep_cnf,0,sizeof(T_MPH_MEAS_REP_CNF));
        nc_build_nwctrl_rr_report(mph_meas_rep_cnf);
        PSENDX ( RR, mph_meas_rep_cnf);
        for(i=0;i<=BA_LIST_SIZE;i++)
        {
          alr_data->nc_data.cell[i].nc_rxlev = 0;
          alr_data->nc_data.cell[i].c_nc_rxlev = 0;
        }
      }
      break;
    case NC_STOP_MEAS:
      /*
       * De-activate rx_lev averaging for Network control
       */
      alr_data->nwctrl_meas_active = FALSE;
      break;
    default:
      break;
  }
  PFREE(mph_meas_rep_req);
}
#endif


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_random_access_req   |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_RANDOM_ACCESS_REQ.

*/

GLOBAL void ma_mph_random_access_req (T_MPH_RANDOM_ACCESS_REQ* mph_random_access_req)
{
  GET_INSTANCE_DATA;
  switch (GET_STATE (STATE_MA))
  {
    case MA_IDLE:
      ALR_TRACE_MAIN_RAND_ACC(alr_data->serving_cell, mph_random_access_req->send_mode.no);

      /*
       * suspend neighbour cell procedures
       */
      ma_stop_active_procs(DONT_STOP_PCH_READING | STOP_MEASUREMENTS);
      SET_STATE (STATE_MA, MA_CON_EST);
      /*
       * switch to full downlink CCCH listening
       */
      pch_save_pgm(0);
      pch_configure(NULL, PGM_REORG_CS);
      pch_start_ccch_req ();
      /*
       * Send uplink Random Bursts
       */
      rach_random_req (mph_random_access_req);
      break;
#ifdef GPRS
    case MA_PTM:
      ma_stop_active_procs(DONT_STOP_PCH_READING| STOP_MEASUREMENTS);
      // nc_suspend(); gprs_alr_nc_leave_ptm();
      SET_STATE (STATE_MA, MA_CON_EST);
      /*
       * switch to full downlink CCCH listening
       */
      /*pch_save_pgm(0);*/
      pch_configure(NULL, PGM_REORG_CS);
      pch_start_ccch_req ();
      /*
       * Send uplink Random Bursts
       */
      rach_random_req (mph_random_access_req);
      break;
#endif
      case MA_CON_EST:
      SET_STATE (STATE_MA, MA_CON_EST);
      rach_random_req (mph_random_access_req);
      break;

    default:
      break;
  }

  PFREE (mph_random_access_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_mph_emo_req         |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_MPH_EMO_REQ.

*/

GLOBAL void ma_mph_emo_req (T_MPH_EMO_REQ *mph_emo_req)
{
  GET_INSTANCE_DATA;
  switch (GET_STATE (STATE_MA))
  {
    case MA_DEDICATED:
    {
      UBYTE   i,n;
      USHORT *radio_freq;
      USHORT *arfcn;
      USHORT  sc = alr_data->serving_cell;
      BOOL    sc_ok;
      PALLOC (mphc_update_ba_list, MPHC_UPDATE_BA_LIST);

      alr_data->dedi_data.emo_ba_id = mph_emo_req->ba_id;

      n = mph_emo_req->c_arfcn;
      if ( n >= BA_LIST_SIZE )
        n = BA_LIST_SIZE;

      /*
       * Initialize the outgoing primitive MPHC_UPDATE_BA_LIST.
       */

      radio_freq = &mphc_update_ba_list->chan_list.radio_freq[0];
      arfcn      = &mph_emo_req->arfcn[0];
      sc_ok      = FALSE;

      for ( i = 0; i < n; i++ )
      {
        radio_freq[i] = ARFCN_TO_L1 (arfcn[i]);
        if ( radio_freq[i] EQ sc )
        {
          sc_ok = TRUE;
        }
      }
      if ( !sc_ok AND n < BA_LIST_SIZE )  /* add the serving cell ARFCN */
      {
        radio_freq[n++] = sc;
      }
      mphc_update_ba_list->num_of_chans = n;
      mphc_update_ba_list->pwrc         = alr_data->nc_data.pwrc;
      mphc_update_ba_list->dtx_allowed  = alr_data->nc_data.dtx;
      mphc_update_ba_list->ba_id        = mph_emo_req->ba_id;

      PSENDX (L1, mphc_update_ba_list);

      break;
    }
  }
  PFREE (mph_emo_req);
}
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_mph_emo_req         |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_MPH_EMO_REQ.

*/

GLOBAL void ma_mph_ncell_pos_req (T_MPH_NCELL_POS_REQ *mph_ncell_pos_req)
{
  nc_ncell_pos_req(mph_ncell_pos_req);
}
/* ------------------------------------------------------------------
 * ------------------------------------------------------------------
 * Functions for the lower layer(MPHC) primitive processing
 * ------------------------------------------------------------------
 * ------------------------------------------------------------------
 */


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_rxlev_con          |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_RXLEV_CON.

*/

GLOBAL void ma_mphc_rxlev_ind (T_MPHC_RXLEV_IND* rxlev_ind)
{
  GET_INSTANCE_DATA;

  USHORT cs_state = GET_STATE (STATE_CS);
  switch (cs_state)
  {
    default:
      TRACE_EVENT_P1 ("wrong CS state (%u) in ma_mphc_rxlev_ind()", cs_state);
      /*lint -fallthrough*/
    case CS_ACTIVE_MEASURE:
      SET_STATE(STATE_CS, CS_MEASURED);
      break;
  }

  ALR_EM_FIELDSTRENGTH_MEASUREMENT_CONFIRM;
  cs_rxlev_ind (rxlev_ind);
  PFREE (rxlev_ind);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_stop_rxlev_con          |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_RXLEV_CON.

*/

GLOBAL void ma_mphc_stop_rxlev_cnf (T_MPHC_STOP_RXLEV_CON * rxlev_cnf)
{
  GET_INSTANCE_DATA;
  if ( IS_EXT_MEAS_RUNNING )
  {
     nc_stop_ext_meas_ind();
     alr_data->cs_data.ext_meas_state_pend = CS_NULL;
  }
  PFREE(rxlev_cnf);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_stop_cnf                |
+--------------------------------------------------------------------+

  PURPOSE : Processes the primitives MPHC_STOP_*_CON.

*/

GLOBAL void ma_mphc_empty_cnf (void *cnf)
{
  PFREE (cnf);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_network_sync_ind   |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_NETWORK_SYNC_IND.

*/

GLOBAL void ma_mphc_network_sync_ind (T_MPHC_NETWORK_SYNC_IND* sync_ind)
{
  TIMERSTOP(TIM_NW_SYNC_GUARD);
  cs_network_sync_ind (sync_ind);
  PFREE(sync_ind);
}

#if defined(STOP_SYNC_TASK)
/*
+----------------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                           |
| STATE   : code                ROUTINE : ma_mphc_stop_network_sync_req      |
+----------------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_STOP_NETWORK_SYNC_REQ.

*/

GLOBAL void ma_cs_stop_network_sync_req(void)
{
  GET_INSTANCE_DATA;
  if (alr_data->cs_data.sync_active)
  {
    PALLOC (stop_sync_task, MPHC_STOP_NETWORK_SYNC_REQ); /* T_MPHC_STOP_NETWORK_SYNC_REQ */
    TRACE_EVENT ("STOP_NETWORK_SYNC_REQ");
    PSENDX(L1, stop_sync_task);
  }
}

/*
+----------------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                           |
| STATE   : code                ROUTINE : ma_mphc_stop_network_sync_cnf      |
+----------------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_STOP_NETWORK_SYNC_CON.

*/

GLOBAL void ma_mphc_stop_network_sync_cnf(T_MPHC_STOP_NETWORK_SYNC_CON   *stop_network_sync_cnf)
{
  GET_INSTANCE_DATA;
  alr_data->cs_data.sync_active = FALSE;
  switch(GET_STATE(STATE_CS))
  {
    case CS_STOP_SYNC:
      SET_STATE (STATE_CS, CS_STOP_SYNC_DONE);
      cs_bsic_req(NULL);
      break;

    case CS_NW_SYNC_TIMEOUT:
      /* Inform RR that no BCCH was found */
      SET_STATE (STATE_CS, CS_ACTIVE_SYNC);

      {
        PALLOC (mph_bsic_cnf, MPH_BSIC_CNF);
        mph_bsic_cnf->cs = CS_NO_BCCH_AVAIL;
        PSENDX (RR, mph_bsic_cnf);
      }
      break;

    default:
      break;
  }

  PFREE(stop_network_sync_cnf);
}
#endif /* STOP_SYNC_TASK */

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_new_scell_cnf      |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_NEW_SCELL_CON.

*/

GLOBAL void ma_mphc_new_scell_cnf (T_MPHC_NEW_SCELL_CON* new_scell_cnf)
{
  GET_INSTANCE_DATA;
  /* we have a new serving cell */
  vsi_t_sleep(VSI_CALLER 10);

  switch (GET_STATE(STATE_MA))
  {
    case MA_CELL_SELECTION:
      /*
       * we are synchronized to the new cell
       * now read the BCCH to check if the cell
       * is suitable
       */
      cs_read_scell_bcch ();
      break;
    case MA_CELL_RESELECTION:
      ALR_TRACE_MAIN ("new sc in cr");
      if (alr_data->old_serving_cell NEQ alr_data->serving_cell)
      {
        ALR_TRACE_MAIN_SCELL(alr_data->old_serving_cell, alr_data->serving_cell);
        ALR_TRACE_MAIN ("update timebase");
          /*
           * update the timebase now
           */
        nc_update_list (alr_data->serving_cell);
        /*
         * removing of the old serving cell only just if
         * RR gives a positive receipt for cell selection.
         * obsolet: nc_update_serving_cell (alr_data->old_serving_cell);
         */

        /*
         * In case the serving cell has been changed, the last CCCH configuration
         * is not valid anymore! It will delete now, so that the sucessful
         * comparison inside ma_pch_start_ccch_req() will not prevent a new
         * CCCH configuration of L1.
         */
        memset (&alr_data->pch_data.last_start_ccch_req, 0,
          sizeof (alr_data->pch_data.last_start_ccch_req));
      }
#ifdef GPRS
      if(alr_data->gprs_data.sync_only)
      {
        PALLOC(sync, MPH_SYNC_IND);
        sync->cs =  CS_SCELL_IS_SYNCED;
        alr_data->gprs_data.sync_only=0;
        SET_STATE(STATE_MA, MA_IDLE);
        PSENDX (RR, sync);
      }
      else
      {
#endif
        pch_start_ccch_req();
#ifdef GPRS
      }
#endif
      break;
    case MA_IDLE:
      ALR_TRACE_MAIN ("new sc in idle");
      if (alr_data->old_serving_cell NEQ alr_data->serving_cell)
        nc_update_list (alr_data->serving_cell);
      break;
    case MA_CON_EST:
      break;
    default:
      break;
  }

  PFREE (new_scell_cnf);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_ncell_bcch_ind     |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_NCELL_BCCH_IND.

*/

GLOBAL void ma_mphc_ncell_bcch_ind (T_MPHC_NCELL_BCCH_IND* ncell_bcch_ind)
{
  nc_bcch_ind (ncell_bcch_ind);
  PFREE (ncell_bcch_ind);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_ncell_sync_ind     |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_NCELL_SYNC_IND.

*/

GLOBAL void ma_mphc_ncell_sync_ind (T_MPHC_NCELL_SYNC_IND* ncell_sync_ind)
{
  nc_sync_ind (ncell_sync_ind);
  PFREE (ncell_sync_ind);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_stop_ncell_sync_cnf     |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_NCELL_SYNC_IND.

*/

GLOBAL void ma_mphc_stop_ncell_sync_cnf (T_MPHC_STOP_NCELL_SYNC_CON *cnf )
{
  GET_INSTANCE_DATA;
  if ( IS_EXT_MEAS_RUNNING )
  {
     nc_stop_ext_meas_ind();
     alr_data->cs_data.ext_meas_state_pend = CS_NULL;
  }
  PFREE (cnf);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_ncell_bcch_ind     |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_RXLEV_PERIODIC_IND.

*/

GLOBAL void ma_mphc_rxlev_periodic_ind (T_MPHC_RXLEV_PERIODIC_IND*
                                        rxlev_periodic_ind)
{
  GET_INSTANCE_DATA;

  switch (GET_STATE (STATE_MA))
  {
    case MA_CELL_RESELECTION:
    case MA_CON_EST:
    case MA_IDLE:
      nc_report (rxlev_periodic_ind);
#ifdef TI_PS_HCOMM_CHANGE
      PSIGNAL (_hCommDL, PH_TRACE_IND, NULL);
#else
      PSIGNAL (hCommDL, PH_TRACE_IND, NULL);
#endif /* TI_PS_HCOMM_CHANGE */
      alr_trc_read (8);
      break;

    default:
      break;
  }
  PFREE (rxlev_periodic_ind);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_ra_cnf             |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_RA_CON.

*/

GLOBAL void ma_mphc_ra_cnf (T_MPHC_RA_CON* ra_cnf)
{
  GET_INSTANCE_DATA;

  switch (GET_STATE (STATE_MA))
  {
    case MA_CON_EST:
      rach_ra_cnf (ra_cnf);
      break;
    default:
      break;
  }
  PFREE (ra_cnf);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_trc_data_ind            |
+--------------------------------------------------------------------+

  PURPOSE : Trace the primitive MPHC_DATA_IND.

  configure the output with the following command:
  CONFIG TRC_DATA_IND=n

  the available decimal values of the bit mask 'n' are:
  ID_TRC_DATA_IND_ALL     255
  ID_TRC_DATA_IND_VALID   127
  ID_TRC_DATA_IND_INVALID 128
  ID_TRC_DATA_IND_BCCH      1  normal and extended BCCH
  ID_TRC_DATA_IND_PCH       2  normal and extended PCH
  ID_TRC_DATA_IND_CCCH      4
  ID_TRC_DATA_IND_CBCH      8
  ID_TRC_DATA_IND_SCCH     16  SACCH and SDCCH
  ID_TRC_DATA_IND_FCCH     32  full and half rate FACCH
  ID_TRC_DATA_IND_STATE    64  MA status

  ID_TRC_DATA_IND_INIT     63  all valid frames without stati
  ID_TRC_DATA_IND_INIT2    31  ... without FACCH
*/
#if !defined(NCONFIG)
static void ma_trc_data_ind(T_MPHC_DATA_IND* data_ind)
{
  GET_INSTANCE_DATA;
  char *msg_s = "";
  UBYTE msg_t = 0;

  if (data_ind->error_flag NEQ VALID_BLOCK)
  {
    if (v_mon_trc_data_ind & ID_TRC_DATA_IND_INVALID)
    {
#if !defined(DL_TRACE_ENABLED)
      SYST_TRACE ("invalid block");
#else  /* !DL_TRACE_ENABLED */
      DL_OFFLINE_TRACE ("invalid block");
#endif  /* !DL_TRACE_ENABLED */
    }
    return;
  }

  switch (data_ind->l2_channel)
  {
    case L2_CHANNEL_SACCH:
    case L2_CHANNEL_SDCCH:
      if ((v_mon_trc_data_ind & ID_TRC_DATA_IND_SCCH) EQ 0)
        msg_t = (UBYTE)-1;
      break;
    case L2_CHANNEL_FACCH_H:
    case L2_CHANNEL_FACCH_F:
      if ((v_mon_trc_data_ind & ID_TRC_DATA_IND_FCCH) EQ 0)
        msg_t = (UBYTE)-1;
      break;
    case L2_CHANNEL_CCCH:
      if ((v_mon_trc_data_ind & ID_TRC_DATA_IND_CCCH) EQ 0)
        return;
      break;
    case L2_CHANNEL_NBCCH:
    case L2_CHANNEL_EBCCH:
      if ((v_mon_trc_data_ind & ID_TRC_DATA_IND_BCCH) EQ 0)
        msg_t = (UBYTE)-1;
      break;
    case L2_CHANNEL_PCH:
    case L2_CHANNEL_EPCH:
      if ((v_mon_trc_data_ind & ID_TRC_DATA_IND_PCH) EQ 0)
        msg_t = (UBYTE)-1;
      break;
    case L2_CHANNEL_CBCH:
      if ((v_mon_trc_data_ind & ID_TRC_DATA_IND_CBCH) EQ 0)
        msg_t = (UBYTE)-1;
      break;
    default:
        msg_t = (UBYTE)-1;
        SYST_TRACE_P((SYST, "trc_data_ind %02x ch=%d",
          v_mon_trc_data_ind, data_ind->l2_channel));
      break;
  }

  if (msg_t)
  {
    return;
  }

  if (data_ind->error_flag EQ VALID_BLOCK)
  {
    msg_t = data_ind->l2_frame.content[SI_CONTENTS_MSG_T];
    switch (msg_t)
    {
      case D_IMM_ASSIGN:
        msg_s = "IMM_ASS";
        break;
      case D_IMM_ASSIGN_EXT:
        msg_s = "IMM_ASS_EXT";
        break;
      case D_IMM_ASSIGN_REJ:
        msg_s = "IMM_ASS_REJ";
        break;
      case D_PAG_REQ_1:
        msg_s = "PAG1";
        break;
      case D_PAG_REQ_2:
        msg_s = "PAG2";
        break;
      case D_PAG_REQ_3:
        msg_s = "PAG3";
        break;
      case D_SYS_INFO_1:
        msg_s = "SI 1";
        break;
      case D_SYS_INFO_2:
        msg_s = "SI 2";
        break;
      case D_SYS_INFO_2BIS:
        msg_s = "SI 2bis";
        break;
      case D_SYS_INFO_2TER:
        msg_s = "SI 2ter";
        break;
#if defined (REL99) && defined (TI_PS_FF_EMR)
      case D_SYS_INFO_2QUATER:
        msg_s = "SI 2quater";
        break;
#endif
      case D_SYS_INFO_3:
        msg_s = "SI 3";
        /*
        TRACE_EVENT_P8 ("SI3: lai=%x%x%x %x%x%x %02x%02x",
          data_ind->l2_frame.content[5]&0x0f,
          data_ind->l2_frame.content[5]>>4,
          data_ind->l2_frame.content[6]&0x0f,

          data_ind->l2_frame.content[7]&0x0f,
          data_ind->l2_frame.content[7]>>4,
          data_ind->l2_frame.content[6]>>4,

          data_ind->l2_frame.content[8],
          data_ind->l2_frame.content[9]);
        */
        break;
      case D_SYS_INFO_4:
        msg_s = "SI 4";
        /*
        TRACE_EVENT_P8 ("SI4: lai=%x%x%x %x%x%x %02x%02x",
          data_ind->l2_frame.content[3]&0x0f,
          data_ind->l2_frame.content[3]>>4,
          data_ind->l2_frame.content[4]&0x0f,

          data_ind->l2_frame.content[5]&0x0f,
          data_ind->l2_frame.content[5]>>4,
          data_ind->l2_frame.content[4]>>4,

          data_ind->l2_frame.content[6],
          data_ind->l2_frame.content[7]);
        */
        break;
      case D_SYS_INFO_5:
        msg_s = "SI 5";
        break;
      case D_SYS_INFO_5BIS:
        msg_s = "SI 5bis";
        break;
      case D_SYS_INFO_5TER:
        msg_s = "SI 5ter";
        break;
      case D_SYS_INFO_6:
        msg_s = "SI 6";
        break;
#ifdef GPRS
      case D_SYS_INFO_13:
        msg_s = "SI 13";
        break;
#endif /* GPRS */
      default:
        if (data_ind->l2_channel EQ L2_CHANNEL_CBCH)
          msg_s = "CBCH";
        else
          msg_s = 0;
        break;
    }
  }

#if !defined(DL_TRACE_ENABLED)
  if (msg_s)
  {
    if (v_mon_trc_data_ind & ID_TRC_DATA_IND_STATE)
    {
      SYST_TRACE_P((SYST, "[%u] %s %s",
        ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK,
        msg_s, STATE_MA_NAME[GET_STATE (STATE_MA)]));
    }
    else
    {
      SYST_TRACE_P((SYST, "[%u] %s",
        ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, msg_s));
    }
  }
  else
  {
    /* protocol discriminator */
    UBYTE pd = data_ind->l2_frame.content[SI_CONTENTS_MSG_T-1];
    char buf[47];

    if (v_mon_trc_data_ind & ID_TRC_DATA_IND_STATE)
    {
      SYST_TRACE_P((SYST, "[%u] unknown %02x (PD%02x, ch=%d) %s",
        ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, msg_t, pd,
        data_ind->l2_channel, STATE_MA_NAME[GET_STATE (STATE_MA)]));
    }
    else
    {
      SYST_TRACE_P((SYST, "[%u] unknown %02x (PD%02x, ch=%d)",
        ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK,
        msg_t, pd, data_ind->l2_channel));
    }
    for (pd=0; pd<23; pd++)
      sprintf (buf+(pd<<1), "%02x", (UBYTE)data_ind->l2_frame.content[pd]);
    SYST_TRACE(buf);
  }
#else  /* !DL_TRACE_ENABLED */
  {
    if (msg_s)
    {
      if (v_mon_trc_data_ind & ID_TRC_DATA_IND_STATE)
      {
        sprintf (dl_trace_buf, "[%u] %s %s",
          ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK,
          msg_s, STATE_MA_NAME[GET_STATE (STATE_MA)]);
      }
      else
      {
        sprintf (dl_trace_buf, "[%u] %s",
          ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, msg_s);
      }
    }
    else
    {
      /* protocol discriminator */
      UBYTE pd = data_ind->l2_frame.content[SI_CONTENTS_MSG_T-1];

      sprintf (dl_trace_buf, "[%u] unknown %02x (PD%02x, ch=%d)",
          ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK,
          msg_t, pd, data_ind->l2_channel);
    }
    DL_OFFLINE_TRACE (dl_trace_buf);
  }
#endif  /* !DL_TRACE_ENABLED */
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : trc_state_transition		 |
+--------------------------------------------------------------------+

  PURPOSE : Traces state transition

*/


#if !defined(NTRACE) && defined(TRACE_STATE_TRANSITION)
void trc_state_transition(int line, UBYTE newstate)
{
#if defined(DL_TRACE_ENABLED)
  sprintf (dl_trace_buf, "%s->%s (#%u)",
    STATE_MA_NAME[GET_STATE (STATE_MA)], STATE_MA_NAME[newstate], line);
  DL_OFFLINE_TRACE (dl_trace_buf);
#else  /* DL_TRACE_ENABLED */
  SYST_TRACE_P((SYST, "%s->%s (#%u)",
    STATE_MA_NAME[GET_STATE (STATE_MA)], STATE_MA_NAME[newstate], line));
#endif  /* DL_TRACE_ENABLED */
}
#endif  /* !NTRACE && TRACE_STATE_TRANSITION */
#endif  /* !NCONFIG */

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : trc_paging                 |
+--------------------------------------------------------------------+

  PURPOSE : Traces state transition

*/


#if !defined(NTRACE) && 0
void trc_paging(T_MPHC_DATA_IND* data_ind)
{
  if ((data_ind->error_flag EQ VALID_BLOCK) AND
      ((data_ind->l2_channel EQ L2_CHANNEL_PCH) OR
       (data_ind->l2_channel EQ L2_CHANNEL_EPCH)))
  {
    char *str;

    switch (data_ind->l2_frame.content[SI_CONTENTS_MSG_T]) // SI_CONTENTS_MSG_T=2
    {
      case D_PAG_REQ_1:
        str="D_PAG_REQ_1";
        break;
      case D_PAG_REQ_2:
        str="D_PAG_REQ_2";
        break;
      case D_PAG_REQ_3:
        str="D_PAG_REQ_3";
        break;
      default:
        str = NULL;
        break;
    }

    if (str)
    {
      /* TRACE_BINDUMP first available with FRAME_2.9.18 */
#ifdef TI_PS_HCOMM_CHANGE
      TRACE_BINDUMP(_hCommPL ,TC_EVENT, str, data_ind->l2_frame.content,
        MAX_L2_FRAME_SIZE);
#else
      TRACE_BINDUMP(hCommPL ,TC_EVENT, str, data_ind->l2_frame.content,
        MAX_L2_FRAME_SIZE);
#endif /* TI_PS_HCOMM_CHANGE */
    }
  }

}
#endif  /* !NTRACE */

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_data_ind           |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_DATA_IND.

*/

GLOBAL void ma_mphc_data_ind (T_MPHC_DATA_IND* data_ind)
{
  GET_INSTANCE_DATA;
  USHORT length=0, valid=0;
  UBYTE msg_t;

  alr_trc_read (1);

#if !defined(NTRACE) && 0
  trc_paging(data_ind);
#endif  /* !NTRACE */

#if !defined(NCONFIG)
  if (v_mon_trc_data_ind)
    ma_trc_data_ind(data_ind);

  /* IOT and FT trace */
  if (data_ind->l2_channel NEQ L2_CHANNEL_CBCH AND
      data_ind->l2_channel NEQ L2_CHANNEL_SACCH)
  {
/* Implements Measure#32: Row 90,...,101 */
    if(data_ind->error_flag EQ VALID_BLOCK)
    {
      length = MAX_L2_FRAME_SIZE;
      valid = 1;
    }
    switch (data_ind->l2_frame.content[SI_CONTENTS_MSG_T])
    {
      case D_SYS_INFO_1:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] D_SYS_INFO_1 block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
      case D_SYS_INFO_2:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] D_SYS_INFO_2 block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
      case D_SYS_INFO_2BIS:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] D_SYS_INFO_2BIS block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
      case D_SYS_INFO_2TER:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] D_SYS_INFO_2TER block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
#if defined (REL99) && defined (TI_PS_FF_EMR)
      case D_SYS_INFO_2QUATER:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] D_SYS_INFO_2QUATER block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
#endif
      case D_SYS_INFO_3:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] D_SYS_INFO_3 block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
      case D_SYS_INFO_4:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] D_SYS_INFO_4 block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
#ifdef GPRS
      case D_SYS_INFO_13:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] D_SYS_INFO_13 block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
#endif
      case D_IMM_ASSIGN:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] D_IMM_ASSIGN block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
      case D_IMM_ASSIGN_EXT:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] D_IMM_ASSIGN_EXT block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
      case D_IMM_ASSIGN_REJ:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] D_IMM_ASSIGN_REJ block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
      case D_PAG_REQ_1:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] PAG_REQ_1 DL block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
      case D_PAG_REQ_2:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] PAG_REQ_2 DL block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
      case D_PAG_REQ_3:
        TRACE_USER_CLASS_P2 (TC_USER4, "[%u] PAG_REQ_3 DL block: Valid=%d",
                  ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK, valid);
        break;
      default:
        break;
    }
    switch (data_ind->l2_frame.content[SI_CONTENTS_MSG_T])
    {
      case D_SYS_INFO_1:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                       "D_SYS_INFO_1", 
                       data_ind->l2_frame.content,
                       length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                       "D_SYS_INFO_1", 
                       data_ind->l2_frame.content,
                       length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
      case D_SYS_INFO_2:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "D_SYS_INFO_2", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "D_SYS_INFO_2", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
      case D_SYS_INFO_2BIS:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "D_SYS_INFO_2BIS", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "D_SYS_INFO_2BIS", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
      case D_SYS_INFO_2TER:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "D_SYS_INFO_2TER", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "D_SYS_INFO_2TER", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
#if defined (REL99) && defined (TI_PS_FF_EMR)
      case D_SYS_INFO_2QUATER:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "D_SYS_INFO_2QUATER", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "D_SYS_INFO_2QUATER", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
#endif
      case D_SYS_INFO_3:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "D_SYS_INFO_3", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "D_SYS_INFO_3", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
      case D_SYS_INFO_4:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "D_SYS_INFO_4", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "D_SYS_INFO_4", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
#ifdef GPRS
      case D_SYS_INFO_13:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "D_SYS_INFO_13", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "D_SYS_INFO_13", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
#endif
      case D_IMM_ASSIGN:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "D_IMM_ASSIGN", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "D_IMM_ASSIGN", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
      case D_IMM_ASSIGN_EXT:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "D_IMM_ASSIGN_EXT", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "D_IMM_ASSIGN_EXT", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
      case D_IMM_ASSIGN_REJ:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "D_IMM_ASSIGN_REJ", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "D_IMM_ASSIGN_REJ", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
      case D_PAG_REQ_1:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "PAG_REQ_1 DL", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "PAG_REQ_1 DL", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
      case D_PAG_REQ_2:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "PAG_REQ_2 DL", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "PAG_REQ_2 DL", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
      case D_PAG_REQ_3:
#ifdef TI_PS_HCOMM_CHANGE
        TRACE_BINDUMP(_hCommPL , TC_USER4, 
                  "PAG_REQ_3 DL", 
                  data_ind->l2_frame.content,
                  length);
#else /* not TI_PS_HCOMM_CHANGE */
        TRACE_BINDUMP(hCommPL , TC_USER4, 
                  "PAG_REQ_3 DL", 
                  data_ind->l2_frame.content,
                  length);
#endif /* TI_PS_HCOMM_CHANGE */
        break;
      default:
        break;
    }
  }
#endif  /* !NCONFIG */


  if (data_ind->l2_channel EQ L2_CHANNEL_CBCH)
  {
    cb_data_ind (data_ind);
  }
  else
  {
    if (data_ind->error_flag EQ VALID_BLOCK AND
        data_ind->l2_channel EQ L2_CHANNEL_SACCH)
    {
      /*
       * store Timing Advance contained in every decodable downlink SACCH frame
       */
      nc_store_tav((USHORT)(data_ind->l2_frame.content[1] & 63));
    }

    msg_t = data_ind->l2_frame.content[SI_CONTENTS_MSG_T];
    switch (GET_STATE (STATE_MA))
    {
      case MA_NULL:
        /*
         * no message expected
         */
        break;
      case MA_CELL_SELECTION:
        if (data_ind->error_flag EQ VALID_BLOCK)
        {
          ALR_TRACE_MAIN_VALID_BLOCK(msg_t);

          switch (msg_t)
          {
            case D_SYS_INFO_1:
            case D_SYS_INFO_2:
            case D_SYS_INFO_2BIS:
            case D_SYS_INFO_2TER:
#if defined (REL99) && defined (TI_PS_FF_EMR)
            case D_SYS_INFO_2QUATER:
#endif
            case D_SYS_INFO_3:
            case D_SYS_INFO_4:
#ifdef GPRS
            case D_SYS_INFO_13:
#endif
              switch(data_ind->l2_channel)
              {
                case L2_CHANNEL_NBCCH:
                  if (data_ind->tc EQ 0 AND msg_t NEQ D_SYS_INFO_1)
                    ma_sync_ind (CS_SYS_INFO_1_NOT_NEEDED,
                                 ARFCN_TO_G23(data_ind->radio_freq));
                  /*lint -fallthrough*/
                case L2_CHANNEL_EBCCH:
                  ma_send_unitdata (data_ind);
                  ma_fill_sys_buffer (data_ind, msg_t);

                  ma_set_si_bitmap(msg_t);

                  ALR_EM_IDLE_MODE_BCCH_PARAMETER_CHANGED;
                  cs_increment_bfc();

                  break;
                default:
                  ALR_TRACE_MAIN ("stray SI");
                  break;
              }
              break;
            default:
              break;
          }
        }
        else
        {
          ALR_TRACE_MAIN ("INVALID BLOCK");
          if (data_ind->l2_channel EQ L2_CHANNEL_NBCCH OR
              data_ind->l2_channel EQ L2_CHANNEL_EBCCH)
          {
            ma_error_ind (CS_BCCH_READ_ERROR,
                          ARFCN_TO_G23(data_ind->radio_freq));
            cs_decrement_bfc();
          }
        }
        break;
      case MA_IDLE:
        if (data_ind->error_flag EQ VALID_BLOCK)
        {
          switch (msg_t)
          {
            case D_SYS_INFO_2:
              /*
               * setting ncc permitted directly after receive sys info 2
               */
              nc_check_new_ncc_permitted (data_ind->l2_frame.content[SI_CONTENTS_MSG_T+17]);
              /*lint -fallthrough*/
            case D_SYS_INFO_1:
            case D_SYS_INFO_2BIS:
            case D_SYS_INFO_2TER:
            case D_SYS_INFO_3:
            case D_SYS_INFO_4:
              if(data_ind->l2_channel NEQ L2_CHANNEL_NBCCH)
              {
                 ALR_TRACE_MAIN ("stray SI");
              }

              if (data_ind->tc EQ 0 AND msg_t NEQ D_SYS_INFO_1)
              {
                ma_sync_ind (CS_SYS_INFO_1_NOT_NEEDED,
                             ARFCN_TO_G23(data_ind->radio_freq));
                alr_data->pch_data.si_bitmap |= SYSTEM_INFO_1_READ;
              }

              if( alr_data->pch_data.reorg_bcch_reading EQ TRUE)
              {
                if(msg_t EQ D_SYS_INFO_1)
                  alr_data->pch_data.si_bitmap |= SYSTEM_INFO_1_READ;
                else if(msg_t EQ D_SYS_INFO_2)
                  alr_data->pch_data.si_bitmap |= SYSTEM_INFO_2_READ;
                else if(msg_t EQ D_SYS_INFO_3)
                  alr_data->pch_data.si_bitmap |= SYSTEM_INFO_3_READ;
                else if(msg_t EQ D_SYS_INFO_4)
                  alr_data->pch_data.si_bitmap |= SYSTEM_INFO_4_READ;

                ma_set_si_bitmap(msg_t);

#ifdef GPRS
                if( !gprs_alr_is_supported() )
#endif
                {
                  if( (alr_data->pch_data.si_bitmap & ALL_SI_READ_EXCEPT_SI13)
                      EQ  ALL_SI_READ_EXCEPT_SI13)
                  {
                    alr_data->pch_data.reorg_bcch_reading = FALSE;
                    if((alr_data->pch_data.pl_idle.page_mode EQ PGM_NORMAL) OR
                        (alr_data->pch_data.pl_idle.page_mode EQ PGM_EXTENDED))
                    {
                      sc_start_periodic();
                    }
                  }
                }
              }
              if (!ma_compare_sys_buffer (data_ind, msg_t))
              {
                ALR_TRACE_MAIN_SI_UNEQ(data_ind->l2_channel);

                ma_send_unitdata (data_ind);
                ma_fill_sys_buffer (data_ind, msg_t);

                ALR_EM_IDLE_MODE_BCCH_PARAMETER_CHANGED;

              }
#if defined (REL99) && defined (TI_PS_FF_EMR)
              if ( (msg_t EQ D_SYS_INFO_2) OR (msg_t EQ D_SYS_INFO_2BIS) OR (msg_t EQ D_SYS_INFO_2TER) )
              {
                if ( (alr_data->nc_data.si2_count NEQ NOT_PRESENT_8BIT ) AND
                     (alr_data->nc_data.si2_count NEQ 0) )
                  alr_data->nc_data.si2_count--;
                /*Required SI-2 variants have been acquired, now we will configure
                  L1 for SI-2quater if it's required to be configured*/
                if ((alr_data->nc_data.si2quater_status NEQ SI2QUATER_ABSENT ) AND
                  (alr_data->nc_data.si2quater_pos EQ SI2QUATER_ON_EBCCH) AND
                  (alr_data->nc_data.si2_count EQ 0))
                {
                  ma_scell_mon_si2quater_ebcch();
                  alr_data->nc_data.si2_count = NOT_PRESENT_8BIT;
                }
              }
              break;
            case D_SYS_INFO_2QUATER:
              ALR_TRACE_MAIN_SI_UNEQ(data_ind->l2_channel);
              ma_send_unitdata (data_ind);
#endif
              break;
#ifdef GPRS
            case D_SYS_INFO_13:
              if(gprs_alr_is_supported())
              {
                alr_data->pch_data.si_bitmap |= SYSTEM_INFO_13_READ;
                alr_data->pch_data.reorg_bcch_reading = FALSE;
              }
              if(! pch_mode_reorg() AND gprs_alr_is_supported())
              {
                /* stop scell BCCH */
                ma_stop_scell_bcch_req();
              }
              ma_send_unitdata (data_ind);
              ma_fill_sys_buffer (data_ind, msg_t);

              ALR_EM_IDLE_MODE_BCCH_PARAMETER_CHANGED;

              ALR_TRACE_MAIN ("SI13");
              break;
#endif  /* GPRS */

            case D_PAG_REQ_1:
              ALR_TRACE_MAIN("PG1");

              pch_check_pag_1 (data_ind);

              if (data_ind->l2_channel EQ L2_CHANNEL_PCH)
              {
                /*
                 * check only if it is the own paging group
                 */
#ifdef GPRS
                gprs_check_page_mode(data_ind);
#else
                pch_check_page_mode (data_ind);
#endif  /* GPRS */
                pch_increment_dlt ();
              }
              break;
            case D_PAG_REQ_2:
              ALR_TRACE_MAIN ("PG2");
              if (alr_data->pch_data.pl_idle.page_mode EQ PGM_NORMAL)
              {
                if (data_ind->l2_channel EQ L2_CHANNEL_PCH)
                  pch_check_pag_2 (data_ind);
                else
                {
                  ALR_TRACE_MAIN ("PCH block skipped");
                }
              }
             else
                pch_check_pag_2 (data_ind);
              if (data_ind->l2_channel EQ L2_CHANNEL_PCH)
              {
                /* check only if it is the own paging group */
#ifdef GPRS
                gprs_check_page_mode(data_ind);
#else
                pch_check_page_mode (data_ind);
#endif  /* GPRS */
                pch_increment_dlt ();
              }
              break;
            case D_PAG_REQ_3:
              ALR_TRACE_MAIN ("PG3");

              if (alr_data->pch_data.pl_idle.page_mode EQ PGM_NORMAL)
              {
                if (data_ind->l2_channel EQ L2_CHANNEL_PCH)
                  pch_check_pag_3 (data_ind);
                else
                {
                  ALR_TRACE_MAIN ("PCH block skipped");
                }
              }
              else
                pch_check_pag_3 (data_ind);
              if (data_ind->l2_channel EQ L2_CHANNEL_PCH)
              {
                /* check only if it is the own paging group */
#ifdef GPRS
                gprs_check_page_mode(data_ind);
#else
                pch_check_page_mode (data_ind);
#endif/* GPRS */
                pch_increment_dlt ();
              }
              break;
            case D_IMM_ASSIGN:
#ifdef GPRS
              gprs_alr_check_downlink_assign(data_ind);
              /*lint -fallthrough*/
#endif
            case D_IMM_ASSIGN_EXT:
            case D_IMM_ASSIGN_REJ:
              if (data_ind->l2_channel EQ L2_CHANNEL_PCH)
              {
                /* check only if it is the own paging group */
#ifdef GPRS
                gprs_check_page_mode(data_ind);
#else
                pch_check_page_mode (data_ind);
#endif  /* GPRS */
                pch_increment_dlt ();
              }
              break;
            default:
              break;
          } /* message type */
        }
        else
        {
          /*
           * invalid block
           */
          ALR_TRACE_MAIN ("INVALID");
          if (data_ind->l2_channel EQ L2_CHANNEL_PCH)
            pch_decrement_dlt ();
        }
        break;
#ifdef GPRS
      case MA_PTM:
        if (data_ind->error_flag EQ VALID_BLOCK)
        {
          switch (msg_t)
          {
            case D_SYS_INFO_2:
              /*
               * setting ncc permitted directly after receive sys info 2
               */
              nc_check_new_ncc_permitted (data_ind->l2_frame.content[SI_CONTENTS_MSG_T+17]);
              /*lint -fallthrough*/
            case D_SYS_INFO_1:
            case D_SYS_INFO_2BIS:
            case D_SYS_INFO_2TER:
#if defined (REL99) && defined (TI_PS_FF_EMR)
            case D_SYS_INFO_2QUATER:
#endif
            case D_SYS_INFO_3:
            case D_SYS_INFO_4:
              if(data_ind->l2_channel NEQ L2_CHANNEL_NBCCH)
              {
                 ALR_TRACE_MAIN ("stray SI");
              }
              if (data_ind->tc EQ 0 AND msg_t NEQ D_SYS_INFO_1)
                ma_sync_ind (CS_SYS_INFO_1_NOT_NEEDED,
                             ARFCN_TO_G23(data_ind->radio_freq));
              if (!ma_compare_sys_buffer (data_ind, msg_t))
              {
                ALR_TRACE_MAIN_SI_UNEQ(data_ind->l2_channel);

                ma_send_unitdata (data_ind);
                ma_fill_sys_buffer (data_ind, msg_t);

                ALR_EM_IDLE_MODE_BCCH_PARAMETER_CHANGED;

              }
              break;
            case D_SYS_INFO_13:
                /* stop scell BCCH */
              ma_stop_scell_bcch_req();

              ma_send_unitdata (data_ind);

              ALR_EM_IDLE_MODE_BCCH_PARAMETER_CHANGED;

              ma_fill_sys_buffer (data_ind, msg_t);
              break;
            case D_PAG_REQ_1:
              ALR_TRACE_MAIN("PG1");

              pch_check_pag_1 (data_ind);

              if (data_ind->l2_channel EQ L2_CHANNEL_PCH)
              {
                /*
                 * check only if it is the own paging group
                 */
                //pch_increment_dlt ();
              }
              break;
            case D_PAG_REQ_2:
              pch_check_pag_2 (data_ind);
              //pch_increment_dlt ();

              break;
            case D_PAG_REQ_3:
              pch_check_pag_3 (data_ind);
              //pch_increment_dlt ();
              break;
            default:
              break;
          }
        }
        break;
#endif  /* GPRS */
      case MA_CELL_RESELECTION:
        if (data_ind->error_flag EQ VALID_BLOCK)
        {
          ALR_TRACE_MAIN_CR(msg_t);

          switch (msg_t)
          {
            case D_IMM_ASSIGN:
#ifdef GPRS
              TRACE_EVENT_P1 ("downlink assign %02x",  data_ind->l2_frame.content[3]);
              gprs_alr_check_downlink_assign(data_ind);
              /*lint -fallthrough*/
#endif
            case D_IMM_ASSIGN_EXT:
            case D_IMM_ASSIGN_REJ:
              break;
            case D_PAG_REQ_1:
              ALR_TRACE_MAIN ("PG1");
              pch_check_pag_1 (data_ind);
              if (data_ind->l2_channel EQ L2_CHANNEL_PCH)
              {
                pch_increment_dlt ();
                pch_check_page_mode_cr (data_ind);
              }
              break;
            case D_PAG_REQ_2:
              ALR_TRACE_MAIN ("PG2");
              pch_check_pag_2 (data_ind);
              if (data_ind->l2_channel EQ L2_CHANNEL_PCH)
              {
                pch_increment_dlt ();
                pch_check_page_mode_cr (data_ind);
              }
              break;
            case D_PAG_REQ_3:
              ALR_TRACE_MAIN ("PG3");
              pch_check_pag_3 (data_ind);
              if (data_ind->l2_channel EQ L2_CHANNEL_PCH)
              {
                pch_increment_dlt ();
                pch_check_page_mode_cr (data_ind);
              }
              break;
            case D_SYS_INFO_1:
            case D_SYS_INFO_2:
            case D_SYS_INFO_2BIS:
            case D_SYS_INFO_2TER:
#if defined (REL99) && defined (TI_PS_FF_EMR)
            case D_SYS_INFO_2QUATER:
#endif
            case D_SYS_INFO_3:
            case D_SYS_INFO_4:
#ifdef GPRS
            case D_SYS_INFO_13:
#endif
              ALR_TRACE_MAIN ("cr si");
              if (data_ind->tc EQ 0 AND msg_t NEQ D_SYS_INFO_1)
                ma_sync_ind (CS_SYS_INFO_1_NOT_NEEDED, ARFCN_TO_G23(data_ind->radio_freq));
              ma_send_unitdata (data_ind);
              ma_fill_sys_buffer (data_ind, msg_t);

              ma_set_si_bitmap(msg_t);
              ALR_EM_IDLE_MODE_BCCH_PARAMETER_CHANGED;

              /*
               * When having received all SI in cell reselection state RR will
               * send an MPH_IDLE_REQ and ALR will send an MPHC_START_CCCH_REQ
               * This is not a good timing for FTA 20.19 because L1 is then
               * unable to detect a paging for some blocks. The test device will
               * not send the paging near the SI3. Therefore the
               * MPHC_START_CCCH_REQ is sent here (and may be overwritten be the
               * later when ALR receives the MPH_IDLE_REQ with other parameters).
               */
              if (msg_t EQ D_SYS_INFO_3 AND
                  alr_data->pch_data.imsi[0] AND
                  ARFCN_TO_G23(data_ind->radio_freq) EQ alr_data->serving_cell)
                pch_config_resel(data_ind);
              break;
            default:
              break;
          }
        }
        else /* invalid block */
        {
          if (data_ind->l2_channel EQ L2_CHANNEL_NBCCH OR
              data_ind->l2_channel EQ L2_CHANNEL_EBCCH)
          {
            ALR_TRACE_MAIN ("INVALID BLOCK");
            ma_error_ind (CS_BCCH_READ_ERROR,
                          ARFCN_TO_G23(data_ind->radio_freq));
            cs_decrement_bfc();
          }
        }

        break;
      case MA_CON_EST:
        if (data_ind->error_flag EQ VALID_BLOCK)
        {
          switch (msg_t)
          {
            case D_IMM_ASSIGN:
            case D_IMM_ASSIGN_EXT:
            case D_IMM_ASSIGN_REJ:
              ALR_TRACE_MAIN ("IA");
              ma_send_unitdata (data_ind);
              break;
#ifdef GPRS
          case D_PAG_REQ_1:
              pch_check_pag_1 (data_ind);
              break;
            case D_PAG_REQ_2:
              pch_check_pag_2 (data_ind);
              break;
            case D_PAG_REQ_3:
              pch_check_pag_3 (data_ind);
              break;
#endif  /* GPRS */
            default:
              break;
          }
        }
        break;
      case MA_DEDICATED:
        if (data_ind->error_flag EQ VALID_BLOCK)
        {
          switch (data_ind->l2_channel)
          {
            case L2_CHANNEL_SACCH:
              if ((data_ind->l2_frame.content[3] & 0xEF) EQ 3) /* layer 2 Control field octet */
              {
                /*
                 * check control field of l2 header
                 * UI Frame received
                 */
                UBYTE msg_t = data_ind->l2_frame.content[6]; /* layer 3 Message Type octet */

                switch (msg_t)
                {
                  case D_SYS_INFO_6:
                  /*
                   * setting ncc permitted directly after receive sys info 6
                   */
                  nc_check_new_ncc_permitted (data_ind->l2_frame.content[15]);

                  /*lint -fallthrough*/
                  case D_SYS_INFO_5:
                  case D_SYS_INFO_5BIS:
                  case D_SYS_INFO_5TER:

                    if (!ma_compare_dedi_sys_buffer (data_ind, msg_t))
                    {
                      ma_send_dedi_unitdata (data_ind);
                      ma_fill_dedi_sys_buffer (data_ind, msg_t);
                    }
                    break;

                  case D_EXT_MEAS_ORDER:
                    ma_send_dedi_unitdata (data_ind);
                    break;

                  default:
                    break;
                }
              }
              else
              {
                /*
                 * no unacknowledged frame or short PD header (format type Bter)
                 * must be handled by DL
                 * is forwarded in original primitive format
                 */
                ma_dedi_data_out ((T_PH_DATA_IND *)data_ind);
                data_ind = NULL; /* must not be freed by ALR */
              }
              dedi_increment_rlt ();
              break;
            default:
              break;
          } /*l2_channel*/
        }
        else
        {
          /* invalid block */
          if (data_ind->l2_channel EQ L2_CHANNEL_SACCH)
            dedi_decrement_rlt ();
        }
        break;
      default:
        break;
    }
  }

  if (data_ind)
  {
    PFREE (data_ind);
  }
}


/*
+----------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                     |
| STATE   : code                ROUTINE : ma_mphc_change_frequency_cnf |
+----------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_CHANGE_FREQUENCY_CON.

*/

GLOBAL void ma_mphc_change_frequency_cnf (T_MPHC_CHANGE_FREQUENCY_CON* change_frequency_cnf)
{
  PFREE (change_frequency_cnf);
  dedi_change_freq_cnf ();
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_async_ho_cnf       |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_ASYNC_HO_CNF.

*/

GLOBAL void ma_mphc_async_ho_cnf (T_MPHC_ASYNC_HO_CON* async_ho_cnf)
{
  PFREE (async_ho_cnf);
  dedi_ho_cnf(HO_TYPE_ASYNC);
}

/*
+---------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                    |
| STATE   : code                ROUTINE : ma_mphc_channel_assign_cnf  |
+---------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_CHANNEL_ASSIGN_CON.

*/

GLOBAL void ma_mphc_channel_assign_cnf (T_MPHC_CHANNEL_ASSIGN_CON* channel_assign_cnf)
{
  PFREE (channel_assign_cnf);
#if defined(DL_TRACE_ENABLED)
  DL_OFFLINE_TRACE ("MPHC_CHANNEL_ASSIGN_CON");
#else
  SYST_TRACE ("dedi chan ass con");
#endif  /* DL_TRACE_ENABLED */
  dedi_chan_ass_cnf ();
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_handover_fail_cnf  |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_HANDOVER_FAIL_CON.

*/

GLOBAL void ma_mphc_handover_fail_cnf (T_MPHC_HANDOVER_FAIL_CON* handover_fail_cnf)
{
  PFREE (handover_fail_cnf);
  dedi_ho_fail_cnf ();
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_immed_assign_cnf   |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_IMMED_ASSIGN_CON.

*/

GLOBAL void ma_mphc_immed_assign_cnf (T_MPHC_IMMED_ASSIGN_CON* immed_assign_cnf)
{
  PFREE (immed_assign_cnf);
#if defined(DL_TRACE_ENABLED)
  DL_OFFLINE_TRACE ("MPHC_IMMED_ASSIGN_CON");
#endif  /* DL_TRACE_ENABLED */
  dedi_imm_ass_cnf ();
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_pre_sync_ho_cnf    |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_PRE_SYNC_HO_CON.

*/

GLOBAL void ma_mphc_pre_sync_ho_cnf (T_MPHC_PRE_SYNC_HO_CON* pre_sync_ho_cnf)
{
  PFREE (pre_sync_ho_cnf);
  dedi_ho_cnf(HO_TYPE_PRE_SYNC);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_sync_ho_cnf        |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_SYNC_HO_CON.

*/

GLOBAL void ma_mphc_sync_ho_cnf (T_MPHC_SYNC_HO_CON* sync_ho_cnf)
{
  PFREE (sync_ho_cnf);
  dedi_ho_cnf(HO_TYPE_SYNC);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_ta_fail_ind        |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_TA_FAIL_IND.

*/

GLOBAL void ma_mphc_ta_fail_ind (T_MPHC_TA_FAIL_IND* ta_fail_ind)
{
  PFREE (ta_fail_ind);
  dedi_ta_fail_ind ();
}

/*
+-----------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                      |
| STATE   : code                ROUTINE : ma_mphc_handover_finished_ind |
+-----------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_HANDOVER_FINISHED.

*/

GLOBAL void ma_mphc_handover_finished_ind (T_MPHC_HANDOVER_FINISHED* ho_finished)
{
  dedi_ho_finished (ho_finished);
  PFREE (ho_finished);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_meas_report_ind_emo|
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_MEAS_REPORT for
            Extended Measurement procedure.

*/

LOCAL BOOL ma_mphc_meas_report_ind_emo (T_MPHC_MEAS_REPORT* mphc_meas_report)
{
  GET_INSTANCE_DATA;
  UBYTE emo_ba_id = alr_data->dedi_data.emo_ba_id;
  UBYTE rep_ba_id = mphc_meas_report->ba_id;

  if ( INRANGE(RR_BA_LOW,rep_ba_id,RR_BA_HIGH) AND
       mphc_meas_report->meas_valid  )
  {
    if ( rep_ba_id EQ emo_ba_id )
    {
      T_ncell_meas    *ncell_meas   = &mphc_meas_report->ncell_meas;
      T_res_list      *res_list     = &ncell_meas->res_list[0];
      T_meas_results  *meas_results;
      USHORT           k,n;
      UBYTE            nmax;

      PALLOC (mph_emo_meas_ind, MPH_EMO_MEAS_IND);

      meas_results = &mph_emo_meas_ind->meas_results[0];

      mph_emo_meas_ind->ba_id = mphc_meas_report->ba_id;
      mph_emo_meas_ind->dtx   = mphc_meas_report->dtx_used;

      nmax = sizeof mph_emo_meas_ind->meas_results /
            sizeof mph_emo_meas_ind->meas_results[0];

      if ( mphc_meas_report->no_of_ncells_meas > nmax )
          mphc_meas_report->no_of_ncells_meas = nmax;

      n = mph_emo_meas_ind->c_meas_results = mphc_meas_report->no_of_ncells_meas;
      for ( k = 0; k < n; k++ )
      {
        SHORT rx_lev = (SHORT)res_list[k].rxlev_acc /
                      (BYTE) res_list[k].rxlev_nbr_meas;

        if ( rx_lev < 0 )
            rx_lev = 0;

        meas_results[k].rx_lev = (UBYTE) rx_lev;
        meas_results[k].arfcn  = ARFCN_TO_G23 ( res_list[k].bcch_freq );
      }

      PSENDX(RR, mph_emo_meas_ind);
    }
    return TRUE; /* primitive handled */
  }

  return FALSE; /* indicate that the primitive has not been handled */
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_meas_report_ind    |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_MEAS_REPORT.

*/

GLOBAL void ma_mphc_meas_report_ind (T_MPHC_MEAS_REPORT* report)
{
  GET_INSTANCE_DATA;
  switch (GET_STATE (STATE_MA))
  {
    case MA_DEDICATED:

      if (report->meas_valid)
      {
        if ( ma_mphc_meas_report_ind_emo ( report ) )
        {
          PFREE ( report ); /*report isn't used any more*/
          return;
        }
        nc_report_dedicated (report);
      }
      else
      {
        PALLOC (rr_report, MPH_MEASUREMENT_IND);
        memset (rr_report, 0, sizeof (T_MPH_MEASUREMENT_IND));

#ifdef GPRS
        rr_report->gprs_sync = NORMAL_MEAS_REP;
#endif

        if (alr_data->nc_data.update)
          nc_fill_report_sc_dedi (rr_report, 0);
        ma_nc_report_res (rr_report);
      }
      alr_data->nc_data.update = FALSE;
      break;
    default:
      break;
  }

  PFREE (report);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : mphc_adc_ind               |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive CST_ADC_RESULT.
*/


GLOBAL void ma_mphc_adc_ind (T_MPHC_ADC_IND *adc_results)
{
  /*
   * FreeCalypso note: in the TCS211 version this function forwarded
   * the ADC results to the CST entity, but in the LoCosto version
   * that code has been deleted w/o explanation.  The proper course
   * of action for FreeCalypso remains to be decided.
   */
  PFREE (adc_results);
}

/* -------------------------------------------------------------------
 * -------------------------------------------------------------------
 * SIGNAL Processing functions
 * These are called by the other ALR processes
 * -------------------------------------------------------------------
 * -------------------------------------------------------------------
 */

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_rach_ra_req             |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal rach_ra_req from SDL process
            RACH_Control.

*/

GLOBAL void ma_rach_ra_req (T_MPHC_RA_REQ * mph_ra_req)
{
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
  ALR_TRACE_MAIN_RACH (mph_ra_req->txpwr);
#else
  ALR_TRACE_MAIN_RACH (mph_ra_req->powerclass_gsm, mph_ra_req->txpwr);
#endif
#ifdef TI_PS_HCOMM_CHANGE
  TRACE_BINDUMP(_hCommPL,
                TC_USER4,
                "CHANNEL_REQ UL",
                &mph_ra_req->channel_request,
                sizeof(mph_ra_req->channel_request));
#else
  TRACE_BINDUMP(hCommPL,
                TC_USER4,
                "CHANNEL_REQ UL",
                &mph_ra_req->channel_request,
                sizeof(mph_ra_req->channel_request));
#endif /* TI_PS_HCOMM_CHANGE */

  PSENDX (L1, mph_ra_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_cs_power_cnf            |
+--------------------------------------------------------------------+

  PURPOSE : Sends the power measurement results to RR.

*/

GLOBAL void ma_cs_power_cnf (T_MPH_POWER_CNF *mph_power_cnf)
{
  GET_INSTANCE_DATA;
#if 0 || defined(TRACING)
  int i;
  TRACE_EVENT_P1 ("mph_power_cnf: %u freq.", mph_power_cnf->num_of_chan);

  for (i = 0; i < mph_power_cnf->num_of_chan AND i<10; i++)
    TRACE_EVENT_P3("[%u] std=%u rx_lev=%u",
      mph_power_cnf->arfcn[i]&ARFCN_MASK,
      STD_GET_FROM_ARFCN(mph_power_cnf->arfcn[i]),
      mph_power_cnf->rx_lev[i]);
#endif  /* TRACING */

  if ( IS_EXT_MEAS_RUNNING ) /*alr_data->cs_data.mph_ext_meas_req NEQ NULL */
  {
    D_OPC ( mph_power_cnf ) = MPH_EXT_MEAS_CNF;
  }

  PSENDX (RR, mph_power_cnf);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_cs_rxlev_req            |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal cs_rxlev_req from SDL process
            Cell_Selection.

*/

GLOBAL void ma_cs_rxlev_req (void)
{
  GET_INSTANCE_DATA;
  T_POWER_MEAS* power_meas = NULL;

  TRACE_FUNCTION ("ma_cs_rxlev_req()");

  switch (GET_STATE (STATE_CS))
  {
    case CS_INIT_L1:
      power_meas = cs_prepare_power_req();
      /* init radio band before measurement */
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
      ma_cs_init_l1_req();
#else
      ma_cs_init_l1_req(alr_data->cs_data.std);
#endif
      SET_STATE(STATE_CS, CS_INIT_ACTIVE);
      return; /* wait of MPHC_INIT_L1_CON */
    case CS_INIT_ACTIVE:
      return; /* wait of MPHC_INIT_L1_CON */
    case CS_INIT_DONE:
      /* go through and wait or start the first resp. next measurement */
    case CS_START_MEASURE:
      /* without or after configuration of radio band */
      if (IS_TIMER_ACTIVE(TIM_POWERMEAS))
      {
        /*
         * use time to spread power measurements also to write out
         * possible available DL offline traces
         */
#ifdef TI_PS_HCOMM_CHANGE
        PSIGNAL (_hCommDL, PH_TRACE_IND, NULL);
#else
        PSIGNAL (hCommDL, PH_TRACE_IND, NULL);
#endif /* TI_PS_HCOMM_CHANGE */
        return; /* do nothing and wait for timer delay */
      }
      break; /* OK start the first resp. next measurement */
    default:
      TRACE_EVENT_P1 ("wrong CS state (%u) in ma_cs_rxlev_req()", GET_STATE (STATE_CS));
      return;
  }

  power_meas = cs_prepare_power_req();
  if (power_meas)
  {
    PALLOC(rxlev_req, MPHC_RXLEV_REQ);
    rxlev_req->shared_ptr = (ULONG) power_meas;
    SET_STATE(STATE_CS, CS_ACTIVE_MEASURE);
    PSENDX(L1, rxlev_req);
    /* start timer new */
    TIMERSTART(TIM_POWERMEAS, alr_data->cs_data.c_tim_meas);

    ALR_EM_FIELDSTRENGTH_MEASUREMENT_REQUEST;

  }
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_cs_init_l1_req          |
+--------------------------------------------------------------------+

  PURPOSE : set the radio band configuration.
*/

#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
GLOBAL void ma_cs_init_l1_req ()
#else
GLOBAL void ma_cs_init_l1_req (UBYTE radio_band_config)
#endif
{
  PALLOC (init_l1_req, MPHC_INIT_L1_REQ); /* T_MPHC_INIT_L1_REQ */
/* No need to configure L1 for different bands. l1 is capable of scanning across different bands */  
#ifndef TI_PS_FF_QUAD_BAND_SUPPORT
  init_l1_req->radio_band_config = radio_band_config;
  TRACE_EVENT_P1 ("radio_band_config=%u", init_l1_req->radio_band_config);
#endif
  PSENDX(L1, init_l1_req);
  cs_set_wideband_sync();
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_cs_network_sync_req     |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal cs_network_sync_req from SDL process
            Cell_Selection.
*/

GLOBAL void ma_cs_network_sync_req (USHORT channel)
{
  GET_INSTANCE_DATA;
  PALLOC (network_sync_req, MPHC_NETWORK_SYNC_REQ);

  network_sync_req->radio_freq = channel;
  network_sync_req->fn_offset = 0;
  network_sync_req->time_alignment = 0;
  network_sync_req->timing_validity = TV_INVALID_TIMING_INFO;
  network_sync_req->search_mode = alr_data->cs_data.search_mode;
  alr_data->cs_data.sync_active = TRUE;
  PSENDX(L1, network_sync_req);

  TIMERSTART(TIM_NW_SYNC_GUARD, TIM_NW_SYNC_GUARD_VALUE);

}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_nc_rxlev_periodic_req   |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal nc_rxlev_periodic_req from SDL process
            Idle_Neighbour_Cell.

*/

GLOBAL void ma_nc_rxlev_periodic_req (T_MPHC_RXLEV_PERIODIC_REQ* update)
{
  GET_INSTANCE_DATA;
  switch (GET_STATE (STATE_MA))
  {
    case MA_CELL_RESELECTION:
    case MA_IDLE:
      PSENDX (L1, update);
      break;

    default:
      PFREE (update);
      break;
  }
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_nc_stop_ncell_bcch_req  |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal nc_stop_ncell_bcch_req from SDL process
            Idle_Neighbour_Cell.

*/

GLOBAL void ma_nc_stop_ncell_bcch_req (USHORT arfcn)
{
  PALLOC(stop_req, MPHC_STOP_NCELL_BCCH_REQ);

  memset (stop_req, 0, sizeof(T_MPHC_STOP_NCELL_BCCH_REQ));
  stop_req->radio_freq_array_size = 1;
  stop_req->radio_freq_array[0] = ARFCN_TO_L1(arfcn);

  PSENDX(L1, stop_req);

}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_nc_stop_ncell_bcch_req  |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal nc_stop_ncell_bcch_req from SDL process
            Idle_Neighbour_Cell.

*/

GLOBAL void ma_nc_stop_ncell_sync_req (USHORT arfcn)
{
  PALLOC (mphc_stop_ncell_sync_req, MPHC_STOP_NCELL_SYNC_REQ);

  mphc_stop_ncell_sync_req->radio_freq_array_size = 1;
  mphc_stop_ncell_sync_req->radio_freq_array[0] = ARFCN_TO_L1(arfcn);

  PSENDX(L1, mphc_stop_ncell_sync_req);
}
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_nc_sync_req             |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal nc_sync_req from SDL process
            Idle_Neighbour_Cell.

*/

GLOBAL void ma_nc_sync_req (T_MPHC_NCELL_SYNC_REQ *sync_req)
{
  PSENDX(L1, sync_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_nc_list_sync_req        |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal nc_list_sync_req from SDL process
            Idle_Neighbour_Cell.

*/

GLOBAL void ma_nc_list_sync_req (T_MPHC_NCELL_LIST_SYNC_REQ *list_sync_req)
{
  PSENDX(L1, list_sync_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_nc_bcch_req             |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal nc_bcch_req from SDL process
            Idle_Neighbour_Cell.

*/

GLOBAL void ma_nc_bcch_req (T_MPHC_NCELL_BCCH_REQ *bcch_req)
{

  ALR_EM_READ_NEIGHBOURCELL_BCCH;

  PSENDX(L1, bcch_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_nc_update_ba_list       |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal nc_update_ba_list from SDL process
            Idle_Neighbour_Cell.

*/

GLOBAL void ma_nc_update_ba_list (T_MPHC_UPDATE_BA_LIST *update_ba_list)
{
  GET_INSTANCE_DATA;
  switch (GET_STATE (STATE_MA))
  {
    case MA_DEDICATED:
      PSENDX (L1, update_ba_list);
      break;

    default:
      PFREE (update_ba_list);
      break;
  }
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_nc_report_res           |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal nc_report_res from SDL process
            Idle_Neighbour_Cell.

*/

GLOBAL void ma_nc_report_res (T_MPH_MEASUREMENT_IND *mph_measurement_ind)
{
  GET_INSTANCE_DATA;
  TRACE_ASSERT((GET_STATE(STATE_MA) NEQ MA_NULL) OR
               (GET_STATE(STATE_MA) NEQ MA_CELL_SELECTION));

  switch (GET_STATE (STATE_MA))
  {
    case MA_IDLE:
#ifdef GPRS
    case MA_PTM:
#endif
    case MA_CON_EST:
    case MA_CELL_RESELECTION:
    case MA_DEDICATED:
      PSENDX (RR, mph_measurement_ind);
      break;
    default:
      PFREE (mph_measurement_ind);
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_stop_req           |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_stop_req from SDL process
            Dedicated_Control.

*/

GLOBAL void ma_dedi_stop_req (void)
{
  PALLOC (stop_dedicated, MPHC_STOP_DEDICATED_REQ);
#if defined(DL_TRACE_ENABLED)
  DL_OFFLINE_TRACE ("MPHC_STOP_DEDICATED_REQ");
#endif  /* DL_TRACE_ENABLED */
  PSENDX (L1, stop_dedicated);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_cnf                |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_cnf from SDL process
            Dedicated_Control.

*/

GLOBAL void ma_dedi_cnf (UBYTE cause)
{
  PALLOC (dedicated_cnf, MPH_DEDICATED_CNF);

  dedicated_cnf->dedi_res = cause;
  PSENDX (RR, dedicated_cnf);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_chan_ass_req       |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_chan_ass_req from SDL process
            Dedi Control.

*/

GLOBAL void ma_dedi_chan_ass_req (T_MPHC_CHANNEL_ASSIGN_REQ *mphc_channel_assign_req)
{
#if defined(DL_TRACE_ENABLED)
  DL_OFFLINE_TRACE ("MPHC_CHANNEL_ASSIGN_REQ");
#else
  SYST_TRACE_P ((SYST, "dedi chan ass req %d",
    mphc_channel_assign_req->channel_desc_1.channel_type));
#endif  /* DL_TRACE_ENABLED */
  PSENDX (L1, mphc_channel_assign_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_async_ho_req       |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_async_ho_req from SDL process
            Dedi Control.

*/

GLOBAL void ma_dedi_async_ho_req (T_MPHC_ASYNC_HO_REQ *async_ho_req)
{
  PSENDX (L1, async_ho_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_sync_ho_req        |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_sync_ho_req from SDL process
            Dedi Control.

*/

GLOBAL void ma_dedi_sync_ho_req (T_MPHC_SYNC_HO_REQ * sync_ho_req)
{
  PSENDX (L1, sync_ho_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_pre_sync_ho_req    |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_pre_sync_ho_req from
            SDL process Dedi Control.

*/

GLOBAL void ma_dedi_pre_sync_ho_req (T_MPHC_PRE_SYNC_HO_REQ *pre_sync_ho_req)
{
  PSENDX (L1, pre_sync_ho_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_fail_cnf           |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_fail_cnf from SDL process
            Dedicated_Control.

*/

GLOBAL void ma_dedi_fail_cnf (void)
{
  PALLOC (mph_dedicated_fail_cnf, MPH_DEDICATED_FAIL_CNF);
  PSENDX (RR, mph_dedicated_fail_cnf);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_ho_fail_req        |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_ho_fail_req from SDL process
            Dedicated_Control.

*/

GLOBAL void ma_dedi_ho_fail_req (void)
{
  PALLOC (handover_fail_req, MPHC_HANDOVER_FAIL_REQ);
  PSENDX (L1, handover_fail_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_imm_ass_req        |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_imm_ass_req from SDL process
            Dedicated_Control.

*/

GLOBAL void ma_dedi_imm_ass_req (T_MPHC_IMMED_ASSIGN_REQ *immed_assign_req)
{
#if defined(DL_TRACE_ENABLED)
  DL_OFFLINE_TRACE ("MPHC_IMMED_ASSIGN_REQ");
#else
  SYST_TRACE_P ((SYST, "dedi imm ass req %d",
    immed_assign_req->channel_desc.channel_type));
#endif  /* DL_TRACE_ENABLED */
  PSENDX (L1, immed_assign_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_change_freq_req    |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_change_freq_req from
            SDL process Dedicated_Control.

*/

GLOBAL void ma_dedi_change_freq_req (T_MPHC_CHANGE_FREQUENCY *change_frequency)
{
  PSENDX (L1, change_frequency);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_chan_mode_req      |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_chan_mode_req from
            SDL process Dedicated_Control.

*/

GLOBAL void ma_dedi_chan_mode_req (T_MPHC_CHANNEL_MODE_MODIFY_REQ *channel_mode_modify_req)
{
  PSENDX (L1, channel_mode_modify_req);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_ciph_req           |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_ciph_req from
            SDL process Dedicated_Control.

*/

GLOBAL void ma_dedi_ciph_req (T_MPHC_SET_CIPHERING_REQ *set_ciphering_req)
{
  PSENDX (L1, set_ciphering_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_data_out           |
+--------------------------------------------------------------------+

  PURPOSE : Acknowledged frame or short PD header (format type Bter)
            Forward the message to DL. Uses the original primitive format.

*/

LOCAL void ma_dedi_data_out (T_PH_DATA_IND *data_ind)
{
  PPASS (data_ind, ph_data_ind, PH_DATA_IND);
  PSENDX (DL, ph_data_ind);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_send_dedi_unitdata      |
+--------------------------------------------------------------------+

  PURPOSE : Sends an unacknowledged message on SACCH to RR.

*/

LOCAL void ma_send_dedi_unitdata (T_MPHC_DATA_IND *data_ind)
{
  USHORT len_in_bits = 19 * 8;
  PALLOC_SDU (data_out, MPH_UNITDATA_IND, len_in_bits);

  data_out->sdu.l_buf = 18 * 8;
  data_out->sdu.o_buf = 8;
  data_out->sdu.buf[0] = 0;
  /*lint -e{419} (Warning -- Apparent data overrun) */
  memcpy (&data_out->sdu.buf[1], &data_ind->l2_frame.content[5], 18);
  data_out->arfcn = ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK;
  data_out->fn = data_ind->fn;

  PSENDX (RR, data_out);
}
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_open_tch_loop_req  |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_open_tch_loop_req from
            SDL process Dedicated_Control.

*/

GLOBAL void ma_dedi_open_tch_loop_req (void)
{
  PALLOC (oml1_open_tch_loop_req, OML1_OPEN_TCH_LOOP_REQ);
  PSENDX (L1, oml1_open_tch_loop_req);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_stop_dai_req       |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_stop_dai_req from
            SDL process Dedicated_Control.

*/
GLOBAL void ma_dedi_stop_dai_req (void)
{
  PALLOC (oml1_stop_dai_test_req, OML1_STOP_DAI_TEST_REQ);
  PSENDX (L1, oml1_stop_dai_test_req);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_close_tch_loop_req |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_close_tch_loop_req from
            SDL process Dedicated_Control.

*/

GLOBAL void ma_dedi_close_tch_loop_req (T_OML1_CLOSE_TCH_LOOP_REQ *oml1_close_tch_loop_req)
{
  PSENDX (L1, oml1_close_tch_loop_req);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_dedi_start_dai_req      |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_dedi_start_dai_req from
            SDL process Dedicated_Control.

*/

GLOBAL void ma_dedi_start_dai_req (T_OML1_START_DAI_TEST_REQ *oml1_start_dai_test_req)
{
  PSENDX (L1, oml1_start_dai_test_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_rach_stop_ra_req        |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal rach_stop_ra_req from SDL process
            RACH_Control.

*/

GLOBAL void ma_rach_stop_ra_req (void)
{
  PALLOC (stop_ra_req, MPHC_STOP_RA_REQ);

  PSENDX (L1, stop_ra_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_pch_start_ccch_req      |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal pch_start_ccch_req from SDL process
            PCH_Control.

*/

GLOBAL void ma_pch_start_ccch_req (T_MPHC_START_CCCH_REQ *pl_idle)
{
  GET_INSTANCE_DATA;
  if (memcmp ( &(alr_data->pch_data.last_start_ccch_req),
               pl_idle,
               sizeof(T_MPHC_START_CCCH_REQ) ) NEQ 0)
  {
    memcpy ( &(alr_data->pch_data.last_start_ccch_req),
             pl_idle,
             sizeof(T_MPHC_START_CCCH_REQ));
    PSENDX (L1, pl_idle);
  }
  else
  {
    PFREE(pl_idle);
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_rach_random_cnf         |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal rach_random_cnf from SDL process
            RACH_Control.

*/

GLOBAL void ma_rach_random_cnf (T_MPH_RANDOM_ACCESS_CNF * mph_random_access_cnf)
{
  GET_INSTANCE_DATA;
  switch (GET_STATE (STATE_MA))
  {
    case MA_CON_EST:
      ALR_TRACE_MAIN_RA_CNF(mph_random_access_cnf->frame_no.t1,
                            mph_random_access_cnf->frame_no.t2,
                            mph_random_access_cnf->frame_no.t3);

#if !defined (NCONFIG)
      if(v_cfg_rach_failure)
        memset(mph_random_access_cnf,0, sizeof(T_MPH_RANDOM_ACCESS_CNF));
#endif

      PSENDX (RR, mph_random_access_cnf);
      break;

    default:
      PFREE (mph_random_access_cnf);
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_PCH                    |
| STATE   : code                ROUTINE : ma_pch_paging_ind          |
+--------------------------------------------------------------------+

  PURPOSE : Sends a paging indication to RR.

*/

GLOBAL void ma_pch_paging_ind (UBYTE id_type, UBYTE channel_needed)
{
  PALLOC (mph_paging_ind, MPH_PAGING_IND);

  ALR_EM_PAGING_DETECTED;

  mph_paging_ind->identity_type = id_type;
  mph_paging_ind->channel_needed = channel_needed;

//  vsi_o_ttrace(VSI_CALLER 0xFFFF, "PAG IND ch=%x", channel_needed);
#if defined(DL_TRACE_ENABLED)
  {
    sprintf (dl_trace_buf, "PAG%u ch=%u", id_type,channel_needed);
    DL_OFFLINE_TRACE (dl_trace_buf);
  }
#else  /* DL_TRACE_ENABLED */
  SYST_TRACE_P ((SYST, "PAG%u ch=%u", id_type,channel_needed));
#endif  /* DL_TRACE_ENABLED */

  
  PSENDX (RR, mph_paging_ind);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_pch_stop                |
+--------------------------------------------------------------------+

  PURPOSE : Stop CCCH reading.
*/

GLOBAL void ma_pch_stop(void)
{
  GET_INSTANCE_DATA;
  PALLOC(stop_req, MPHC_STOP_CCCH_REQ);
  alr_data->pch_data.last_start_ccch_req.bs_pa_mfrms = NOT_PRESENT_8BIT;
  PSENDX(L1, stop_req);
}



/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mmi_cbch_req            |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MMI_CBCH_REQ.

*/

GLOBAL void ma_mmi_cbch_req (T_MMI_CBCH_REQ *cbch_req)
{
  TRACE_EVENT ("MMI_CBCH_REQ");
  cb_mmi_cbch_req (cbch_req);
  PFREE (cbch_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mmi_cbch_req            |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MMI_CBCH_REQ.

*/

GLOBAL void ma_mmi_sat_cbch_dwnld_req (T_MMI_SAT_CBCH_DWNLD_REQ *cbch_req)
{
  TRACE_EVENT ("MMI_SAT_CBCH_DWNLD_REQ");
  cb_mmi_sat_cbch_req (cbch_req);
  PFREE (cbch_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_cb_stop_cbch_req        |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_cb_stop_cbch_req.

*/
GLOBAL void ma_cb_stop_cbch_req (void)
{
  PALLOC(stop_cbch_req, MPHC_STOP_CBCH_REQ);

  stop_cbch_req->normal_cbch = CBCH_STOP;
  stop_cbch_req->extended_cbch = CBCH_STOP;
  TRACE_EVENT ("MPHC_STOP_CBCH_REQ");
  PSENDX(L1, stop_cbch_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_cb_sched_req            |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_cb_sched_req.

*/
GLOBAL void ma_cb_sched_req (T_MPHC_CBCH_SCHEDULE_REQ *sched_req)
{
  /*
  TRACE_EVENT ("MPHC_CBCH_SCHEDULE_REQ");
  */
  PSENDX (L1, sched_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_cb_config_cbch          |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_cb_config_cbch.

*/
GLOBAL void ma_cb_config_cbch (T_MPHC_CONFIG_CBCH_REQ *config_cbch)
{
  TRACE_EVENT ("MPHC_CONFIG_CBCH_REQ");
  PSENDX(L1, config_cbch);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_cb_mmi_cbch_ind         |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_cb_mmi_cbch_ind.

*/
GLOBAL void ma_cb_mmi_cbch_ind (T_MMI_CBCH_IND *mmi_cbch_ind)
{
  TRACE_EVENT ("MMI_CBCH_IND");
  PSENDX (MMI, mmi_cbch_ind);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_cb_info_req             |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_cb_info_req.

*/
GLOBAL void ma_cb_info_req (UBYTE bitmap)
{
  PALLOC(info_req, MPHC_CBCH_INFO_REQ);

  info_req->tb_bitmap = bitmap;
  TRACE_EVENT ("MPHC_CBCH_INFO_REQ");
  PSENDX (L1, info_req);
}
/*====================================================================
 *Functions used by more than one process
 *====================================================================

+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_scell_nbcch_req         |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal ma_scell_nbcch_req .

*/

GLOBAL void ma_scell_full_nbcch (void)
{
  GET_INSTANCE_DATA;
  PALLOC(scell_nbcch_req, MPHC_SCELL_NBCCH_REQ);

  ALR_TRACE_MAIN ("start full sc bcch");

  switch(GET_STATE(STATE_MA))
  {
    case MA_CELL_SELECTION:
    case MA_CELL_RESELECTION:
      alr_data->cs_data.si_bitmap = 0;
      break;
  }
  scell_nbcch_req->schedule_array_size = 1;
  scell_nbcch_req->schedule_array[0].modulus = 1;
  scell_nbcch_req->schedule_array[0].relative_position = 0;
  ma_scell_nbcch_req(scell_nbcch_req);
}

GLOBAL void ma_scell_nbcch_req (T_MPHC_SCELL_NBCCH_REQ *nbcch_req)
{
  ALR_TRACE_MAIN ("start sc bcch");

  PSENDX (L1, nbcch_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_scell_ebcch_req         |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal cs_scell_nbcch_req from SDL process
            Cell_Selection.
*/

GLOBAL void ma_scell_ebcch_req (T_MPHC_SCELL_EBCCH_REQ *ebcch_req)
{
  PSENDX (L1, ebcch_req);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_stop_active_procs       |
+--------------------------------------------------------------------+

  PURPOSE : Stop all active procedures.
*/
GLOBAL void ma_stop_active_procs (UBYTE flags)
{
  GET_INSTANCE_DATA;
  if (flags & STOP_PCH_READING)
  {
    pch_stop();
  }

  if (flags & STOP_MEASUREMENTS)
  {
    ma_stop_rxlev_periodic_req();
  }

  switch (GET_STATE(STATE_MA))
  {
    case MA_CELL_SELECTION:
      /*
       * if we are doing measurements or synchronising or
       * reading the BCCH of a cell, stop the process
       */
      cs_stop();
      break;
    case MA_CELL_RESELECTION:
      ma_stop_scell_bcch_req ();
      break;
    case MA_CON_EST:
      /*
       * Stop Uplink Random Burst Sending
       */
      rach_stop();
      break;
    case MA_DEDICATED:
      dedi_stop();
      break;
    case MA_IDLE:
      /* if we are reading the FCH or SCH of a ncell
         or reading its BCCH, stop it */
      nc_suspend();
#if defined (REL99) && defined (TI_PS_FF_EMR)
      /* before stop reading the scell BCCH reset the SIq_status to configure 
         when it is in pending state, so that it is easy to reconfigure again*/
      if((alr_data->nc_data.si2quater_status EQ SI2QUATER_ACQ_PENDING) OR 
            (alr_data->nc_data.si2quater_status EQ SI2QUATER_ACQ_FULL_BCCH))
      {
        alr_data->nc_data.si2quater_status = SI2QUATER_CONFIGURE;
      }
#endif
      /* if we are reading the BCCH of the serving cell,
         stop it */
      ma_stop_scell_bcch_req();
      /* if we are reading the CBCH, stop it */
      cb_stop();
      break;
#ifdef GPRS
    case MA_PTM:
      /* if we are reading the FCH or SCH of a ncell
         or reading its BCCH, stop it */
      nc_suspend();
      /* if we are reading the BCCH of the serving cell,
         stop it */
      /*
      ma_stop_scell_bcch_req();
      */
      break;
#endif  /* GPRS */
  };
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_send_unitdata           |
+--------------------------------------------------------------------+

  PURPOSE : Cut pseudo length and send data directly to RR.

*/

GLOBAL void ma_send_unitdata (T_MPHC_DATA_IND * data_ind)
{
#define SYS_INFO_LEN 24

  USHORT len_in_bits = SYS_INFO_LEN * BITS_PER_BYTE;

  PALLOC_SDU (data_out, MPH_UNITDATA_IND, len_in_bits);

  /* No IE and Pseudo Length */
  data_out->sdu.l_buf = (SYS_INFO_LEN - 2) * BITS_PER_BYTE;
  /* Pseudo Length */
  data_out->sdu.o_buf = 1 * BITS_PER_BYTE;
  /* No IE */
  /*lint -e{419} (Warning -- Apparent data overrun) */
  memcpy (data_out->sdu.buf, &data_ind->l2_frame, SYS_INFO_LEN - 1);
  data_out->arfcn = ARFCN_TO_G23(data_ind->radio_freq)&ARFCN_MASK;
  data_out->fn    = data_ind->fn;

#if 0 && defined(DL_TRACE_ENABLED)
  {
    sprintf (dl_trace_buf, "DATA ind msg=%u", msg_t);
    DL_OFFLINE_TRACE (dl_trace_buf);
  }
#endif  /* DL_TRACE_ENABLED */

  PSENDX (RR, data_out);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_error_ind               |
+--------------------------------------------------------------------+

  PURPOSE : send a MPH_ERROR_IND to RR.

*/

GLOBAL void ma_error_ind (UBYTE cause, USHORT arfcn)
{
  PALLOC (error_ind, MPH_ERROR_IND);

  ALR_TRACE_MAIN ("err ind");

  ALR_EM_ERROR_IND(cause, arfcn);

  error_ind->cs = cause;
  error_ind->arfcn = arfcn;

  PSENDX (RR, error_ind);
  /*
   * These errors could mean that the AFC value in L1 might be srewed
   * up somehow. So go back to wide band search mode for next CS to be
   * safe.
   */
  if( (cause EQ CS_DOWN_LINK_FAIL) OR (cause EQ CS_RADIO_LINK_FAIL))
    cs_set_wideband_sync();
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_sync_ind                |
+--------------------------------------------------------------------+

  PURPOSE : Send a synchronisation primitive to RR.

*/

LOCAL void ma_sync_ind (UBYTE       cause,
                        USHORT      arfcn)
{
  PALLOC (sync_ind, MPH_SYNC_IND);

  TRACE_FUNCTION ("ma_sync_ind()");

  sync_ind->cs = cause;
  sync_ind->arfcn = arfcn;
  PSENDX (RR, sync_ind);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_stop_scell_bcch_req     |
+--------------------------------------------------------------------+

  PURPOSE : Process the signal cs_stop_bcch_reading from SDL processes
            Cell_Selection or Serving_Cell.

*/

GLOBAL void ma_stop_scell_bcch_req (void)
{
  PALLOC (stop_bcch_req, MPHC_STOP_SCELL_BCCH_REQ);

  ALR_TRACE_MAIN ("stop sc bcch");

  PSENDX (L1, stop_bcch_req);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_stop_rxlev_periodic_req |
+--------------------------------------------------------------------+

  PURPOSE : Stops the periodic fieldstrength measurements during
            idle mode.

*/


LOCAL void ma_stop_rxlev_periodic_req (void)
{
  PALLOC (stop_rxlev_req, MPHC_STOP_RXLEV_PERIODIC_REQ);

  ALR_TRACE_MAIN ("stop rxlev perio.");

  PSENDX (L1, stop_rxlev_req);
}



/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_bsic_cnf                |
+--------------------------------------------------------------------+

  PURPOSE : Sends the synchronisation result to RR.

*/

GLOBAL void ma_bsic_cnf (T_MPH_BSIC_CNF* mph_bsic_cnf)
{
  PSENDX (RR, mph_bsic_cnf);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_new_scell_req           |
+--------------------------------------------------------------------+

  PURPOSE : Sends a new scell request to layer 1.

*/

GLOBAL void ma_new_scell_req(T_MPHC_NEW_SCELL_REQ *new_scell)
{
  GET_INSTANCE_DATA;
  alr_data->bsic = new_scell->tsc;
  PSENDX(L1, new_scell);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_init_l1_cnf        |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_INIT_L1_CON.

*/

GLOBAL void ma_mphc_init_l1_cnf (T_MPHC_INIT_L1_CON *init_l1_cnf)
{
  GET_INSTANCE_DATA;
  
  switch (GET_STATE (STATE_CS))
  {
  case CS_INIT_ACTIVE:
    SET_STATE (STATE_CS, CS_INIT_DONE);
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
    compare_l1_frequency_band_with_ffs (init_l1_cnf);
#endif
    ma_cs_rxlev_req ();
    break;
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
  default :
    TRACE_EVENT_P1 ("MPHC_INIT_L1_CON received in the wrong CS state %d", GET_STATE (STATE_CS));
    break;
#else
  case CS_INIT_SYNC:
    SET_STATE (STATE_CS, CS_INIT_DONE);
    cs_bsic_req (NULL);
#endif
  }
  PFREE (init_l1_cnf);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6302)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mphc_stop_dedi_con        |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPHC_STOP_DEDICATED_CON.

*/

GLOBAL void ma_mphc_stop_dedi_con (T_MPHC_STOP_DEDICATED_CON *stop_cnf)
{
#ifdef GPRS
  GET_INSTANCE_DATA;
#endif
  PFREE (stop_cnf);

#ifdef GPRS
  if(alr_data->dedi_data.act_mode EQ MODE_PDCH_ASSIGN)
  {
    /*
     * Notify RR about the actions performed due to PDCH Assignment.
     * Note that MPH_DEDICATED_CNF is misleading as L1 is in Idle Mode now.
     */
    ma_dedi_cnf (DEDI_RES_OK);
    trc_state_transition(0, MA_IDLE);
    SET_STATE(STATE_MA, MA_IDLE); /* allow PTM with next MPH_IDLE_REQ(PTM) */
    return;
  }
#endif
  {
    PALLOC(mph_dedi_cnf, MPH_STOP_DEDICATED_CNF);
    PSENDX ( RR, mph_dedi_cnf );
  }
}

/*
 * The following two functions convert ARFCNs between the official GSM
 * spec notation and the numbering scheme used by TI's L1.  The latter
 * scheme changed with the new way of multiband handling found in the
 * LoCosto source, but not in TCS211.
 *
 * The original L1 frequency channel numbering scheme (used in TCS211)
 * looks like this:

            Frequency Band    config.       ETSI GSM spec.  coding used in L1
            GSM 900           STD_900       1-124           1-124
            E-GSM             STD_EGSM      1-124,          1-124,
                                            975-1023, 0     125-174
            PCS 1900          STD_1900      512-810         512-810
            DCS 1800          STD_1800      512-885         512-885
            GSM 900/DCS 1800  STD_DUAL      1-124,          1-124,
                                            512-885         125-498
            E-GSM/DCS 1800    STD_DUAL_EGSM 1-124,          1-124,
                                            975-1023,0      125-174,
                                            512-885         175-548
            GSM 850           STD_850       128-251         128-251
            GSM 850/PCS 1900  STD_DUAL_US   128-251,        1-124,
                                            512-810         125-424

 * The new-fangled scheme found in the LoCosto source looks like this:

            Frequency Band    config.       ETSI GSM spec.  coding used in L1
            GSM 900           STD_900       1-124           1-124
            E-GSM             STD_EGSM      1-124,          1-124,
                                            975-1023, 0     975-1023, 0
            PCS 1900          STD_1900      512-810         1024-1322
            DCS 1800          STD_1800      512-885         512-885
            GSM 900/DCS 1800  STD_DUAL      1-124,          1-124,
                                            512-885         512-885
            E-GSM/DCS 1800    STD_DUAL_EGSM 1-124,          1-124,
                                            975-1023,0      975-1023,0
                                            512-885         512-885
            GSM 850           STD_850       128-251         128-251
            GSM 850/PCS 1900  STD_DUAL_US   128-251,        128-251,
                                            512-810         1024-1322
            GSM 850/DCS 1800  STD_850_1800  128-251,        128-251,
                                            512-885         512-885
            GSM 900/PCS 1900  STD_900_1900  1-124,          1-124,
                                            512-810         1024-1322

 * The implementation of the two functions below, taken from the
 * LoCosto source, has interspersed #ifdef TI_PS_FF_QUAD_BAND_SUPPORT
 * conditionals, selecting between the two possible configurations.
 */

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : convert_arfcn_to_l1        |
+--------------------------------------------------------------------+

  PURPOSE : Convert_arfcn_to_l1 converts the arfcn given by the upper
            layer (ETSI GSM spec.) to the internal format of layer 1.

*/

GLOBAL USHORT convert_arfcn_to_l1 (USHORT arfcn, UBYTE local_std)
{
#ifdef WIN32
  GET_INSTANCE_DATA;
  if (!alr_data->mb_testing)
    arfcn = arfcn&ARFCN_MASK;
  else
  {
#endif
  if (local_std EQ 0)
    local_std = std;
  arfcn &= ARFCN_MASK;
  switch (local_std)
  {
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT  
    case STD_1900:
    case STD_DUAL_US:
    case STD_900_1900:
    case STD_850_900_1900:
      if ((arfcn >= LOW_CHANNEL_1900) AND (arfcn <= HIGH_CHANNEL_1900))
        arfcn += LOW_CHANNEL_1900;
      break;
#else
    case STD_DUAL:
      if (arfcn >= LOW_CHANNEL_1800)
        arfcn -= (LOW_CHANNEL_1800-125);
      break;

    case STD_EGSM:
    case STD_DUAL_EGSM:
      if (arfcn >= LOW_CHANNEL_EGSM)
        arfcn -= (LOW_CHANNEL_EGSM-125);
      else if (arfcn >= LOW_CHANNEL_1800)
        arfcn -= (LOW_CHANNEL_1800-175);
      else if (arfcn EQ CHANNEL_0)
        arfcn = 174;
      break;

    case STD_DUAL_US:
      if (arfcn >= LOW_CHANNEL_1900)
        arfcn -= (LOW_CHANNEL_1900-125);
      else
        arfcn -= (LOW_CHANNEL_850-1);
      break;
#endif
    default:
      break;
  }
#ifdef WIN32
  }
#endif
  return arfcn;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : convert_arfcn_to_g23       |
+--------------------------------------------------------------------+

  PURPOSE : Convert_arfcn_to_g23 converts the radio frequence given by
            layer 1 to the common format of the upper layer (ETSI GSM spec.).

*/

GLOBAL USHORT convert_arfcn_to_g23 (USHORT arfcn, UBYTE local_std)
{
#ifdef WIN32
  GET_INSTANCE_DATA;
  if (!alr_data->mb_testing)
    arfcn = arfcn&ARFCN_MASK;
  else
  {
#endif
  if (local_std EQ 0)
    local_std = std;
  arfcn &= ARFCN_MASK;
  switch (local_std)
  {
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT  
    case STD_1900:
    case STD_DUAL_US:
    case STD_900_1900:
    case STD_850_900_1900:
      if (arfcn >= LOW_CHANNEL_1900_INTERNAL)
        arfcn -= LOW_CHANNEL_1900;
      break;
#else
    case STD_DUAL:
      if (arfcn >=125)
        arfcn += (LOW_CHANNEL_1800-125);
      break;

    case STD_EGSM:
    case STD_DUAL_EGSM:
      if (arfcn >= 175)
        arfcn += (LOW_CHANNEL_1800-175);
      else if (arfcn EQ 174)
        arfcn = CHANNEL_0;
      else if (arfcn >= 125)
        arfcn += (LOW_CHANNEL_EGSM-125);
      break;

    case STD_DUAL_US:
      if (arfcn >= 125)
        arfcn += (LOW_CHANNEL_1900-125);
      else
        arfcn += (LOW_CHANNEL_850-1);
      /*lint -fallthrough*/
    case STD_850:
    case STD_1900:
      /* only for MPH_POWER_CNF and MPH_BSIC_CNF
      arfcn |= US_BIT;
       */
      break;
#endif
    default:
      break;
  }
#ifdef WIN32
  }
#endif
  return arfcn;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_clean_dedi_sys_buffer   |
+--------------------------------------------------------------------+

  PURPOSE : Cleans System Information Message from SACCH.

*/

GLOBAL void ma_clean_dedi_sys_buffer (void)
{
  GET_INSTANCE_DATA;
  memset (alr_data->ma_data.sys_info_5, 0, 18);
  memset (alr_data->ma_data.sys_info_5bis, 0, 18);
  memset (alr_data->ma_data.sys_info_5ter, 0, 18);
  memset (alr_data->ma_data.sys_info_6, 0, 18);
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_set_si_bitmap         |
+--------------------------------------------------------------------+

  PURPOSE : Updates the si_bitmap.

*/

LOCAL void ma_set_si_bitmap (UBYTE msg_t)
{
  GET_INSTANCE_DATA;
  switch(msg_t)
  {
     case D_SYS_INFO_1:
        alr_data->cs_data.si_bitmap |= SI_1_READ;
        break;
     case D_SYS_INFO_2:
        alr_data->cs_data.si_bitmap |= SI_2_READ;
        break;
     case D_SYS_INFO_3:
        alr_data->cs_data.si_bitmap |= SI_3_READ;
        break;
     case D_SYS_INFO_4:
        alr_data->cs_data.si_bitmap |= SI_4_READ;
        break;
     case D_SYS_INFO_2BIS:
        alr_data->cs_data.si_bitmap |= SI_2BIS_READ;
        break;
     case D_SYS_INFO_2TER:
        alr_data->cs_data.si_bitmap |= SI_2TER_READ;
        break;
     default:
        break;
  }
}
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_fill_sys_buffer         |
+--------------------------------------------------------------------+

  PURPOSE : Stores a System Information Message.

*/

LOCAL void ma_fill_sys_buffer (T_MPHC_DATA_IND* data_ind, UBYTE msg_t)
{
  GET_INSTANCE_DATA;
  switch (msg_t)
  {
    case D_SYS_INFO_1:
      memcpy (alr_data->ma_data.sys_info_1,
              &data_ind->l2_frame.content[1], 22);
      break;
    case D_SYS_INFO_2:
      memcpy (alr_data->ma_data.sys_info_2,
              &data_ind->l2_frame.content[1], 22);
      break;
    case D_SYS_INFO_2BIS:
      memcpy (alr_data->ma_data.sys_info_2bis,
              &data_ind->l2_frame.content[1], 22);
      break;
    case D_SYS_INFO_2TER:
      memcpy (alr_data->ma_data.sys_info_2ter,
              &data_ind->l2_frame.content[1], 22);
      break;
#if defined (REL99) && defined (TI_PS_FF_EMR)
    case D_SYS_INFO_2QUATER:
      memcpy (alr_data->ma_data.sys_info_2quater,
              &data_ind->l2_frame.content[1], 22);
      break;
#endif
    case D_SYS_INFO_3:
      memcpy (alr_data->ma_data.sys_info_3,
              &data_ind->l2_frame.content[1], 22);
      break;
    case D_SYS_INFO_4:
      memcpy (alr_data->ma_data.sys_info_4,
              &data_ind->l2_frame.content[1], 22);
      break;
#ifdef GPRS
    case D_SYS_INFO_13:
      memcpy (alr_data->ma_data.sys_info_13,
              &data_ind->l2_frame.content[1], 22);
      break;
#endif  /* GPRS */
    default:
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_compare_sys_buffer      |
+--------------------------------------------------------------------+

  PURPOSE : Compares a System Information Message.

*/
LOCAL BOOL ma_compare_sys_buffer (T_MPHC_DATA_IND *mphc_data_ind,
                                  UBYTE msg_t)
{
  GET_INSTANCE_DATA;
  switch (msg_t)
  {
    case D_SYS_INFO_1:
      return (!memcmp (alr_data->ma_data.sys_info_1,
                       &mphc_data_ind->l2_frame.content[1], 22));
      /*break;*/
    case D_SYS_INFO_2:
      return (!memcmp (alr_data->ma_data.sys_info_2,
                       &mphc_data_ind->l2_frame.content[1], 22));
      /*break;*/
    case D_SYS_INFO_2BIS:
      return (!memcmp (alr_data->ma_data.sys_info_2bis,
                       &mphc_data_ind->l2_frame.content[1], 22));
      /*break;*/
    case D_SYS_INFO_2TER:
      return (!memcmp (alr_data->ma_data.sys_info_2ter,
                       &mphc_data_ind->l2_frame.content[1], 18));/* Ignore si2ter_rest_octets changes */
      /*break;*/
#if defined (REL99) && defined (TI_PS_FF_EMR)
    case D_SYS_INFO_2QUATER:
      return 0;
      /*break;*/
#endif
    case D_SYS_INFO_3:
      return (!memcmp (alr_data->ma_data.sys_info_3,
                       &mphc_data_ind->l2_frame.content[1], 22));
      /*break;*/
    case D_SYS_INFO_4:
      return (!memcmp (alr_data->ma_data.sys_info_4,
                       &mphc_data_ind->l2_frame.content[1], 22));
      /*break;*/
#ifdef GPRS
    case D_SYS_INFO_13:
      return (!memcmp (alr_data->ma_data.sys_info_13,
                       &mphc_data_ind->l2_frame.content[1], 22));
      /*break;*/
#endif  /* GPRS */
    default:
      break;
  }
  return 0;
}


GLOBAL void sc_start_periodic (void)
{
  GET_INSTANCE_DATA;
#ifdef GPRS
  if(gprs_check_read_si13_only())
#endif /* GPRS */
  {
    USHORT i;
    UBYTE k, si_bitmap = alr_data->cs_data.si_bitmap;
    PALLOC(scell_bcch_req, MPHC_SCELL_NBCCH_REQ);

    /* 3GPP TS 05.02 Section 6.3.1.3: If only one of SI2bis and 
     * SI2ter is there it will be sent when TC=5
     */
    if((si_bitmap&SI_2BIS_READ) EQ 0 AND
       (si_bitmap&SI_2TER_READ) NEQ 0)
        si_bitmap = (si_bitmap & ~(SI_2TER_READ)) | SI_2BIS_READ;
    
    /* we want to read all SYSTEM INFO's broadcasted, TC=0..7 */
    for (i=0,k=0; i < 8; i++ )
    {
      if( (si_bitmap&(1<<i)) != 0)
      {
        scell_bcch_req->schedule_array[k].modulus = THIRTY_SECONDS_SCELL_BCCH;
        scell_bcch_req->schedule_array[k].relative_position = i;
        k++;
      }
    }
    scell_bcch_req->schedule_array_size = k;
    ma_scell_nbcch_req(scell_bcch_req);
  }

}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : alr_MAIN                   |
| STATE   : code                ROUTINE : ma_is_ptm	             |
+--------------------------------------------------------------------+

PURPOSE : Returns True if the current state is MA_PTM,
	  otherwise returns FALSE.

*/


#ifdef GPRS
GLOBAL BOOL ma_is_ptm(void)
{
  GET_INSTANCE_DATA;
  if(GET_STATE(STATE_MA) EQ MA_PTM)
    return TRUE;
  else
    return FALSE;
}
#endif  /* GPRS */

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : alr_MAIN                   |
| STATE   : code                ROUTINE : ma_nc_rxlev_sc_req         |
+--------------------------------------------------------------------+

PURPOSE : A new RXLEV value of the serving cell has been measured.
          Inform GPL in case it is necessary.

*/
#ifdef GPRS

GLOBAL void ma_nc_rxlev_sc_req (T_TB_RXLEV_SC_REQ *rxlev_sc_req)
{
  GET_INSTANCE_DATA;
  if(GET_STATE (STATE_MA)     EQ MA_IDLE AND
     gprs_alr_is_supported( ) EQ TRUE        )
  {
    PSENDX (GPL, rxlev_sc_req);
  }
  else
  {
    PFREE (rxlev_sc_req);
  }
}

#endif /* #ifdef GPRS */

/*
 *--------------------------------------------------------------------
 * helper functions for main process
 * these should all be LOCAL
 *--------------------------------------------------------------------
 */

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_clean_sys_buffer        |
+--------------------------------------------------------------------+

  PURPOSE : Cleans System Information Message from BCCH.

*/

GLOBAL void ma_clean_sys_buffer (USHORT si_mask)
{
  GET_INSTANCE_DATA;
  if ( si_mask & IND_SI_1    ) memset (alr_data->ma_data.sys_info_1,    0, 22);
  if ( si_mask & IND_SI_2    ) memset (alr_data->ma_data.sys_info_2,    0, 22);
  if ( si_mask & IND_SI_2BIS ) memset (alr_data->ma_data.sys_info_2bis, 0, 22);
  if ( si_mask & IND_SI_3    ) memset (alr_data->ma_data.sys_info_3,    0, 22);
  if ( si_mask & IND_SI_4    ) memset (alr_data->ma_data.sys_info_4,    0, 22);
  if ( si_mask & IND_SI_2TER ) memset (alr_data->ma_data.sys_info_2ter, 0, 22);
#if defined (REL99) && defined (TI_PS_FF_EMR)
  if ( si_mask & IND_SI_2QUATER ) memset (alr_data->ma_data.sys_info_2quater, 0, 22);
#endif
#ifdef GPRS
  if ( si_mask & IND_SI_13   ) memset (alr_data->ma_data.sys_info_13,   0, 22);
#endif
  if ( si_mask & IND_SI_5    ) memset (alr_data->ma_data.sys_info_5,    0, 18);
  if ( si_mask & IND_SI_5BIS ) memset (alr_data->ma_data.sys_info_5bis, 0, 18);
  if ( si_mask & IND_SI_5TER ) memset (alr_data->ma_data.sys_info_5ter, 0, 18);
  if ( si_mask & IND_SI_6    ) memset (alr_data->ma_data.sys_info_6,    0, 18);
}



/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_fill_dedi_sys_buffer    |
+--------------------------------------------------------------------+

  PURPOSE : Stores a System Information Message from SACCH.

*/
LOCAL void ma_fill_dedi_sys_buffer (T_MPHC_DATA_IND * mphc_data_ind,
                                    UBYTE msg_t)
{
  GET_INSTANCE_DATA;
  switch (msg_t)
  {
    case D_SYS_INFO_5:
      memcpy (alr_data->ma_data.sys_info_5,
              &mphc_data_ind->l2_frame.content[5], 18);
      break;
    case D_SYS_INFO_5BIS:
      memcpy (alr_data->ma_data.sys_info_5bis,
              &mphc_data_ind->l2_frame.content[5], 18);
      break;
    case D_SYS_INFO_5TER:
      memcpy (alr_data->ma_data.sys_info_5ter,
              &mphc_data_ind->l2_frame.content[5], 18);
      break;
    case D_SYS_INFO_6:
      memcpy (alr_data->ma_data.sys_info_6,
              &mphc_data_ind->l2_frame.content[5], 18);
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : alr_MAIN                   |
| STATE   : code                ROUTINE : ma_compare_dedi_sys_buffer |
+--------------------------------------------------------------------+

  PURPOSE : Compares a System Information Message on SACCH.

*/

LOCAL BOOL ma_compare_dedi_sys_buffer (T_MPHC_DATA_IND * mphc_data_ind,
                                       UBYTE msg_t)
{
  GET_INSTANCE_DATA;
  switch (msg_t)
  {
    case D_SYS_INFO_5:
      return (!memcmp (alr_data->ma_data.sys_info_5,
                       &mphc_data_ind->l2_frame.content[5], 18));
      /*break;*/
    case D_SYS_INFO_5BIS:
      return (!memcmp (alr_data->ma_data.sys_info_5bis,
                       &mphc_data_ind->l2_frame.content[5], 18));
      /*break;*/
    case D_SYS_INFO_5TER:
      return (!memcmp (alr_data->ma_data.sys_info_5ter,
                       &mphc_data_ind->l2_frame.content[5], 18));
      /*break;*/
    case D_SYS_INFO_6:
      return (!memcmp (alr_data->ma_data.sys_info_6,
                       &mphc_data_ind->l2_frame.content[5], 18));
      /*break;*/
    default:
      break;
  }
  return FALSE;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)      MODULE  : RR_ATT                      |
| STATE   : code               ROUTINE : tim_stop_sync_to_nw         |
+--------------------------------------------------------------------+

  PURPOSE : Timeout of TIM_NW_SYNC_GUARD - Time to cancel Nw
            search as it is taking too long

*/
GLOBAL void tim_stop_sync_to_nw( void )
{
  GET_INSTANCE_DATA;
  /* Change the CS State to CS_NW_SYNC_TIMEOUT only if NW Sync is active */
  if(alr_data->cs_data.sync_active)
  {
    SET_STATE(STATE_CS, CS_NW_SYNC_TIMEOUT);
    ma_cs_stop_network_sync_req();
  }
}

#ifdef _TARGET_
#ifndef FAX_AND_DATA
/*
 * Dummy functions for RA (needed when building voice-only PS w/ F&D TI
 * layer 1 libs).
 */
GLOBAL void dll_data_ul
            (
              USHORT *_ul_buffer_address,
              USHORT *_d_ra_conf,
              USHORT *_d_ra_act,
              USHORT *_d_ra_test,
              USHORT *_d_ra_statu,
              USHORT *_d_fax
            )
{
  /* do nothing */
}

GLOBAL void dll_data_dl
            (
              USHORT *_dl_buffer_address,
              USHORT *_d_ra_act,
              USHORT *_d_ra_statd
            )
{
  /* do nothing */
}
#endif /* !_FAX_AND_DATA_ */

#ifndef GPRS
/*
 * Dummy functions for GRR (needed when building non-GPRS PS w/ GPRS TI
 * layer 1 libs).
 */
typedef void  T_ul_poll_resp;
typedef void  T_ul_data;
typedef void  T_dl_struct;
typedef UBYTE UWORD8;
typedef ULONG UWORD32;
#define WORD8     UBYTE
#define UWORD16   USHORT

GLOBAL void maca_power_control ( UWORD8  assignment_id,
                                 BOOL    crc_error,
                                 WORD8   bcch_level,
                                 UWORD16 *radio_freq,
                                 WORD8  *burst_level,
                                 UWORD8 *pch )
{
  /* do nothing */
}

GLOBAL void rlc_uplink ( UWORD8   assignment_id,
                         UWORD8   tx_data_no,
                         UWORD32  fn,
                         UWORD8   timing_advance_value,
                         T_ul_poll_resp    * ul_poll_response,
                         T_ul_data         * ul_data,
                         BOOL      allocation_exhausted)
{
  /* do nothing */
}

GLOBAL void rlc_downlink ( UWORD8        assignment_id,
                           UWORD32       fn,
                           T_dl_struct   *data_ptr,
                           UWORD8        rlc_blocks_sent,
                           UWORD8        last_poll_response)
{
  /* do nothing */
}
#endif /* !GPRS */
#endif /* _TARGET_ */
#if defined (REL99) && defined (TI_PS_FF_EMR)
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_enhpara_update_req  |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_ENHPARA_UPDATE_REQ.

*/

GLOBAL void ma_mph_enhpara_update_req (T_MPH_ENHPARA_UPDATE_REQ* p_enh)
{
  GET_INSTANCE_DATA;
  /*UBYTE     i=0;*/

  alr_data->nc_data.emr_data.rep_type = p_enh->rep_type;
  alr_data->nc_data.emr_data.enh_para = p_enh->enh_para;
  PFREE(p_enh);
  return;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_mph_mon_ctrl_req        |
+--------------------------------------------------------------------+

  PURPOSE : Process the primitive MPH_MON_CTRL_REQ.

*/
GLOBAL void ma_mph_mon_ctrl_req(T_MPH_MON_CTRL_REQ* ctrl_req)
{
  GET_INSTANCE_DATA;
  TRACE_EVENT ("ma_mph_mon_ctrl_req");
  /*Note: Request for monitoring SI-2quater will always be
    given for serving cell and when it is in stable IDLE state
    So, no need to check for MA_STATE here*/
  if ( (ctrl_req->action EQ START_MON_NBCCH ) AND
    (ctrl_req->si_to_read EQ UPDATE_SI2QUATER ) )
  {
    if(alr_data->ma_data.sys_info_2quater[1] EQ D_SYS_INFO_2QUATER)
    {
      ma_send_stored_SI2qtr(&alr_data->ma_data.sys_info_2quater[0]);
      memset (alr_data->ma_data.sys_info_2quater,    0, 22);
    }
    ma_scell_mon_si2quater_nbcch();
  }
  else if ( (ctrl_req->action EQ START_MON_EBCCH ) AND
    (ctrl_req->si_to_read EQ UPDATE_SI2QUATER ) )
  {
    if(alr_data->ma_data.sys_info_2quater[1] EQ D_SYS_INFO_2QUATER)
    {
      ma_send_stored_SI2qtr(&alr_data->ma_data.sys_info_2quater[0]);
      memset (alr_data->ma_data.sys_info_2quater,    0, 22);
    }
    ma_scell_mon_si2quater_ebcch();
  }
  else if((ctrl_req->si_to_read EQ UPDATE_SI2QUATER_AGAIN) AND
           (ctrl_req->action EQ START_MON_EBCCH ))
  {
     ma_scell_mon_si2quater_ebcch();
  }
  else if((ctrl_req->si_to_read EQ UPDATE_SI2QUATER_AGAIN) AND
           (ctrl_req->action EQ START_MON_NBCCH ))
    {
       ma_scell_mon_si2quater_nbcch();
    }
  
  else if ( (ctrl_req->action EQ STOP_MON_BCCH)AND
    (ctrl_req->si_to_read EQ UPDATE_SI2QUATER ) )
  {
    if ( alr_data->nc_data.si2quater_status EQ SI2QUATER_ACQ_PENDING)
    {
      if(alr_data->nc_data.si2quater_pos EQ SI2QUATER_ON_EBCCH)
      {
        ma_stop_scell_bcch_req();
      }
      sc_start_periodic();
    }
    alr_data->nc_data.si2quater_status = SI2QUATER_ACQ_COMP;
  }
  else if((ctrl_req->action EQ STOP_MON_BCCH)AND
    (ctrl_req->si_to_read EQ UPDATE_SI2QUATER_AGAIN) )
    {
    if (alr_data->nc_data.si2quater_status EQ SI2QUATER_ACQ_PENDING)
    {
      if(alr_data->nc_data.si2quater_pos EQ SI2QUATER_ON_EBCCH)
      {
        ma_stop_scell_bcch_req();
      }
      sc_start_periodic();
    }
    alr_data->nc_data.si2quater_status = SI2QUATER_ACQ_WRONG_BAIND;
    }
  
#ifdef GPRS
  else
  {
    gprs_alr_mon_ctrl_req(ctrl_req);
    return;
  }
#endif

#ifdef _SIMULATION_
    switch(alr_data->nc_data.si2quater_status) {
    case SI2QUATER_ACQ_PENDING:
      TRACE_EVENT ("Status of SI-2quater : SI2QUATER_ACQ_PENDING");
    	break;
    case SI2QUATER_ACQ_FULL_BCCH:
      TRACE_EVENT ("Status of SI-2quater : SI2QUATER_ACQ_FULL_BCCH");
      break;
    case SI2QUATER_ACQ_COMP:
      TRACE_EVENT ("Status of SI-2quater : SI2QUATER_ACQ_COMP");
      break;
    case SI2QUATER_ACQ_WRONG_BAIND:
      TRACE_EVENT ("Status of SI-2quater : SI2QUATER_ACQ_WRONG_BAIND");
      break;
    default:
      TRACE_EVENT ("Status of SI-2quater : SI2QUATER_ABSENT");
    }
#endif
    PFREE(ctrl_req);
  return;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_scell_mon_si2quater_ebcch   |
+--------------------------------------------------------------------+

  PURPOSE : configure L1 for monitoring SI-2quater on EBCCH.

*/
GLOBAL void ma_scell_mon_si2quater_ebcch(void)
{
  GET_INSTANCE_DATA;
  PALLOC(req, MPHC_SCELL_EBCCH_REQ);
  TRACE_EVENT ("ma_scell_mon_si2quater_ebcch");
  req->schedule_array_size                 = 1;
  req->schedule_array[0].relative_position = 5;
  req->schedule_array[0].modulus           = 8;
  ma_scell_ebcch_req(req);
  alr_data->nc_data.si2quater_status = SI2QUATER_ACQ_PENDING;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_scell_mon_si2quater_nbcch   |
+--------------------------------------------------------------------+

  PURPOSE : configure L1 for monitoring SI-2quater on NBCCH.

*/
GLOBAL void ma_scell_mon_si2quater_nbcch(void)
{
  GET_INSTANCE_DATA;
  PALLOC(req, MPHC_SCELL_NBCCH_REQ);
  TRACE_EVENT ("ma_scell_mon_si2quater_nbcch");
  /*on N-BCCH, SI-2quater can be received on either
  TC = 5 or 4 depending on scheduling of SI-2bis/ter */
  req->schedule_array_size                 = 2;
  req->schedule_array[0].relative_position = 5;
  req->schedule_array[0].modulus           = 8;
  req->schedule_array[1].relative_position = 4;
  req->schedule_array[1].modulus           = 8;
  ma_scell_nbcch_req(req);
  alr_data->nc_data.si2quater_status = SI2QUATER_ACQ_PENDING;
  return;
}

/*                      BCCH MAPPING
====================================================================
System Information Message | Sent when TC = |     Allocation
====================================================================
      Type 1	                    0	               BCCH Norm
-----------------------------------------------------------------
      Type 2	                    1	               BCCH Norm
-----------------------------------------------------------------
      Type 2 bis                    5	               BCCH Norm
-----------------------------------------------------------------
      Type 2 ter                 5 or 4	               BCCH Norm
-----------------------------------------------------------------
      Type 2 quater                 5                  BCCH Norm
                                   or
                                  4or5                 BCCH Ext
-----------------------------------------------------------------
      Type 3	                  2 and 6              BCCH Norm
-----------------------------------------------------------------
      Type 4	                  3 and 7              BCCH Norm
-----------------------------------------------------------------
      Type 7	                    7	               BCCH Ext
-----------------------------------------------------------------
      Type 8	                    3	               BCCH Ext
-----------------------------------------------------------------
      Type 9	                    4	               BCCH Norm
-----------------------------------------------------------------
      Type 13	                    4                  BCCH Norm
                                    or
                                    0                  BCCH Ext
-----------------------------------------------------------------
      Type 16	                    6	               BCCH Ext
-----------------------------------------------------------------
      Type 17	                    2	               BCCH Ext
-----------------------------------------------------------------
*/

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6103)       MODULE  : ALR_MAIN                   |
| STATE   : code                ROUTINE : ma_send_stored_SI2qtr      |
+--------------------------------------------------------------------+

  PURPOSE : Cut pseudo length and send the stored SI2qtr data to RR.

*/
GLOBAL void ma_send_stored_SI2qtr(UBYTE* si_2quater)
{
  GET_INSTANCE_DATA;
  USHORT len_in_bits = 22 * BITS_PER_BYTE;
  PALLOC_SDU (data_out, MPH_UNITDATA_IND, len_in_bits);

  /* No IE and Pseudo Length */
  data_out->sdu.l_buf = (22 ) * BITS_PER_BYTE;
  /* Pseudo Length */
  data_out->sdu.o_buf = 0;
  /* No IE */
  /*lint -e{419} (Warning -- Apparent data overrun) */
  memcpy (data_out->sdu.buf, &si_2quater[0], 22 );
  data_out->arfcn = alr_data->serving_cell;
  TRACE_EVENT("SI2qtr sent from the function ma_send_stored_SI2qtr");
  PSENDX (RR, data_out);
}
#endif

#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
LOCAL void compare_l1_frequency_band_with_ffs (T_MPHC_INIT_L1_CON *init_l1_cnf)
{
  GET_INSTANCE_DATA;
  int i;
  U16 freq_band ;

  PALLOC(mph_init_rr_ind, MPH_INIT_RR_IND);

  for (i=0; i<NB_MAX_GSM_BANDS; i++)
  {
    if (init_l1_cnf->multiband_power_class[i].radio_band == RADIO_BAND_PGSM900)
    {
      freq_band |= BAND_GSM_900;
      mph_init_rr_ind->pclass_900 = init_l1_cnf->multiband_power_class[i].power_class;
    }
    else if (init_l1_cnf->multiband_power_class[i].radio_band == RADIO_BAND_GSM850)
    {
      freq_band |= BAND_GSM_850;
      mph_init_rr_ind->pclass_850 = init_l1_cnf->multiband_power_class[i].power_class;
    }
    else if (init_l1_cnf->multiband_power_class[i].radio_band == RADIO_BAND_PCS1900)
    {
      freq_band |= BAND_PCS_1900;
      mph_init_rr_ind->pclass_1900 = init_l1_cnf->multiband_power_class[i].power_class;
    }
    else if (init_l1_cnf->multiband_power_class[i].radio_band == RADIO_BAND_DCS1800)
    {
      freq_band |= BAND_DCS_1800;
      mph_init_rr_ind->pclass_1800 = init_l1_cnf->multiband_power_class[i].power_class;
    }
    else if (init_l1_cnf->multiband_power_class[i].radio_band == RADIO_BAND_GSM480)
    {
      freq_band |= BAND_GSM_480;
    }
    else if (init_l1_cnf->multiband_power_class[i].radio_band == RADIO_BAND_GSM450)
    {
      freq_band |= BAND_GSM_450;
    }
    else if (init_l1_cnf->multiband_power_class[i].radio_band == RADIO_BAND_EGSM900)
    {
      freq_band |= BAND_E_GSM;
      mph_init_rr_ind->pclass_900 = init_l1_cnf->multiband_power_class[i].power_class;
    }
    else if (init_l1_cnf->multiband_power_class[i].radio_band == RADIO_BAND_RGSM900)
    {
      freq_band |= BAND_R_GSM;
    }
  }
  
  mph_init_rr_ind->freq_bands = freq_band;
  PSENDX (RR, mph_init_rr_ind);
/*
  if (freq_band NEQ alr_data->cs_data.freq_bands)
  {
    TRACE_EVENT_P2 ("FFS data %x, doen't match L1 compilation flag %x", alr_data->cs_data.freq_bands, freq_band);
    TRACE_ERROR ("FFS data doesn't match L1 compilation flag");
    TRACE_ASSERT (freq_band NEQ alr_data->cs_data.freq_bands);
  }*/
}
#endif

#endif  /* ALR_MAIN_C */