view src/g23m-gsm/alr2/alr.h @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents 3a14ee9a9843
children
line wrap: on
line source

/*
+-----------------------------------------------------------------------------
|  Project :  GSM-PS
|  Modul   :  ALR
+-----------------------------------------------------------------------------
|  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 :  Definitions for the Protocol Stack Entity ALR
+-----------------------------------------------------------------------------
*/

#ifndef ALR_H
#define ALR_H

#define STOP_SYNC_TASK          /* stop always any sync tasks before start a new one */
#if 0
#define DL_TRACE_ENABLED        /* use DL offline trace */
#define TRACE_STATE_TRANSITION  /* trace some state transitions */
#endif /* 0 */

#if !defined(_SIMULATION_) && defined(WIN32)
#define _SIMULATION_
#endif  /* !_SIMULATION_ && WIN32 */

#if defined(_SIMULATION_)
#undef  DL_TRACE_ENABLED  /* no _SYST trace during simulation */
#endif  /* WIN32 */

#define SYST_TRACE(a) vsi_o_ttrace(0, 0xFFFF,a)
#define SYST           0, 0xffff
#define SYST_TRACE_P(a) vsi_o_ttrace a
/*
 * use it as showed next line...
 * SYST_TRACE_P((SYST, "e.g. two parameter: %d %d", p1, p2));
 */


#if !defined(ELEMENTS)
#define ELEMENTS(array) (sizeof(array)/sizeof(array[0]))
#endif  /* !ELEMENTS */

/*
 * for voice memo
 */
#include "p_cst.h"

/* Bitoffset for Message Buffer allocation */
#define ENCODE_OFFSET             24

/*
 * Bitmasks
 */
#define BIT_0                     0x01
#define BIT_1                     0x02
#define BIT_2                     0x04
#define BIT_3                     0x08
#define BIT_4                     0x10
#define BIT_5                     0x20
#define BIT_6                     0x40
#define BIT_7                     0x80
#define BIT_012                   0x07

#include "p_ph.h"
#include "p_mph.h"

/* First 40 carriers per band will be added at top of the MPH_POWER_CNF
 * and the next 20 Carriers (40 to 60) will be added at the bottom.
 * Remaining carriers needs to be ignored.
 */

#define ADD_AT_THE_TOP       0x01   /* first 40 carrier */
#define ADD_AT_THE_BOTTOM    0x02   /* already 40 carriers were added */
#define REACHED_THE_MAXIMUM  0x04   /* already 60 carriers were added */
#define DO_NOT_ADD           0x08   /* wrong carrier */


/* Private modes */
#define MODE_CHAN_ASS_FAIL   16
#define MODE_HANDOVER_FAIL   17

/* Results of configuration dedicated mode */
#define DEDICATED_SUCCESS    0

#define  ALR_ALLOCATE_NEW_BA(v)             ((((v)+1) % (ALR_BA_HIGH-ALR_BA_LOW+1)) + ALR_BA_LOW)
#define  IS_EXT_MEAS_RUNNING                (alr_data->cs_data.mph_ext_meas_req NEQ NULL)

/*
 * Dynamic Configurations
 */
#define ID_STD               1
#define ID_CONFIG            2
#define ID_MON_COUNTER_IDLE  3
#define ID_MON_COUNTER_DEDI  4
#define ID_TRC_DATA_IND      5
#define ID_RACH_FAILURE      6
#define ID_EOTD              7

#define ID_TRC_DATA_IND_ALL     0xff
#define ID_TRC_DATA_IND_VALID   0x7f
#define ID_TRC_DATA_IND_INVALID 0x80
#define ID_TRC_DATA_IND_BCCH    0x01  /* normal and extended BCCH */
#define ID_TRC_DATA_IND_PCH     0x02  /* normal and extended PCH */
#define ID_TRC_DATA_IND_CCCH    0x04
#define ID_TRC_DATA_IND_CBCH    0x08
#define ID_TRC_DATA_IND_SCCH    0x10  /* SACCH and SDCCH */
#define ID_TRC_DATA_IND_FCCH    0x20  /* full and half rate FACCH */
#define ID_TRC_DATA_IND_STATE   0x40  /* MA status */
#define ID_TRC_DATA_IND_INIT    0x3f  /* all valid frames without stati */
#define ID_TRC_DATA_IND_INIT2   0x1f  /* ... without FACCH */

EXTERN  UBYTE v_mon_trc_data_ind;
EXTERN  UBYTE v_cfg_rach_failure;

/* In addition to normal page modes defined in SAP */
#define PGM_REORG_CS         3
#define NO_PGM_CHANGE        4
#define SAVED_PGM            0xff

/*If page mode is set to REORG and a HPLMN search is performed, L1 cannot
synchronize to NC's. Therefore NORMAL page mode is started. This state
defines that the mobile should be in REORG, but actual is in NORMAL.*/
#define PGM_REORG_NC_SYNC    5
EXTERN  UBYTE page_mode_before_hplmn_search;/*to distinguish PGM_REORG and PGM_REORG_CS */

/* Page Mode Changes */
#define NONE                 0
#define SWAP_TO_EXTEND       1
#define SWAP_TO_REORG        2
#define SWAP_TO_NORMAL       3

#define MAX_GSM_CHANNEL_ATTEMPTS  40   /* GSM says 30, but this is done in the field */
#define MAX_DPCS_CHANNEL_ATTEMPTS  40

/* Band Limitations for multiband reporting */
#define NO_BAND_LIMITATION   0
#define EXCLUDE_SC_BAND      1
#define ONLY_SC_BAND         2

#define IMSI_LEN                  9
#define SI_CONTENTS_MSG_T         2
#define SI_CONTENTS_CS2           9
#define ONLY_ACS                  0x80
#define STOP_PCH_READING          1
#define DONT_STOP_PCH_READING     0
#define STOP_MEASUREMENTS         2

/*
 * Neighbour cell status
 */
/* #define DEFINE_OLD_NC_STATUS */
#if !defined(DEFINE_OLD_NC_STATUS)
/* neighbour cell base stati */
#define  NCS_INACTIVE                       0x00
#define  NCS_IDLE                           0x01
#define  NCS_FB_SB                          0x02
#define  NCS_SB                             0x03
/* neighbour cell bit masks */
#define  NCB_BCCH                           0x04
#define  NCB_READ                           0x08
#define  NCB_PENDING                        0x10
#define  NCB_SYNC                           0x20
#define  NCB_RR_NOT_INFORMED                0x40
#define  NCB_FAILED                         0x80

/* neighbour cell stati */
/* 1of<n> n = 6,12 means that the cell belongs to the n strongest */
/* RLA_C means Received Level Averages according GSM 05.08 seciton 6.1 */

                                            /* (1) no PERIODIC measurement received; cell is excluded from all activities except rxlev measurement */
#define  INACTIVE                           (NCS_INACTIVE)

                                            /* (2) PERIODIC measurement received; not synchronized; BCCH data unknown */
#define  IDLE                               (NCS_IDLE)

                                            /* (11a) not a 1of12 cell any more; synchronized */
#define  IDLE_SYNC                          (NCS_IDLE|NCB_SYNC)

                                            /* (3) strong cell(1of12); not synchronized yet; need first FB and SB synchronization */
#define  READ_FB_SB                         (NCS_FB_SB|NCB_READ)

                                            /* (4) first FB and SB synchronization ongoing */
#define  READ_FB_SB_PENDING                 (NCS_FB_SB|NCB_READ|NCB_PENDING)

                                            /* (9) synchronized; need re-synchronization of SB (10/30 sec); no need to read BCCH */
#define  READ_SB                            (NCS_SB|NCB_READ)

                                            /* (10) re-synchronization of SB ongoing (10/30 sec); no reading of BCCH */
#define  READ_SB_PENDING                    (NCS_SB|NCB_READ|NCB_PENDING)

                                            /* (9a) synchronized; need re-synchronization of SB and re-reading of BCCH (5 min) */
#define  READ_SB_BCCH                       (NCS_SB|NCB_READ|NCB_BCCH)

                                            /* (10a) re-synchronization of SB ongoing (5 min) */
#define  READ_SB_BCCH_PENDING               (NCS_SB|NCB_READ|NCB_BCCH|NCB_PENDING)

                                            /* (11a) re-synchronization of SB finished; need re-reading of BCCH (5 min) */
#define  READ_BCCH                          (NCS_SB|NCB_READ|NCB_BCCH|NCB_SYNC)

                                            /* (12a) re-reading of BCCH ongoing (5 min) */
#define  READ_BCCH_PENDING                  (NCS_SB|NCB_READ|NCB_BCCH|NCB_SYNC|NCB_PENDING)

                                            /* (5) 1of6 cell; synchronized; BCCH data unknown; need to read BCCH, but to notify RR after a measurement ind only */
#define  READ_BCCH_RR_NOT_INFORMED          (NCS_SB|NCB_READ|NCB_BCCH|NCB_SYNC|NCB_RR_NOT_INFORMED)

                                            /* (6) 1of6 cell; reading of BCCH ongoing  */
#define  READ_BCCH_PENDING_RR_NOT_INFORMED  (NCS_SB|NCB_READ|NCB_BCCH|NCB_SYNC|NCB_RR_NOT_INFORMED|NCB_PENDING)

                                            /* (8) 1of12 cell; synchronized; in case 1of6: BCCH data known; RR is notified; subsequent RLA_Cs being computed */
#define  FB_SB_SYNC                         (NCS_FB_SB|NCB_SYNC)

                                            /* (7) 1of6 cell; synchronized; BCCH data known; RR not yet notified; first RLA_C being computed */
#define  FB_SB_SYNC_RR_NOT_INFORMED         (NCS_FB_SB|NCB_SYNC|NCB_RR_NOT_INFORMED)

                                            /* (13) 1of<n> cell state questionable; FB/SB sync or BCCH reading failed 1 thru 8 times */
#define  FB_SB_FAILED                       (NCS_FB_SB|NCB_FAILED)

                                            /* (14) 1of<n> cell; synchronization of FB/SB or reading of BCCH failed > 8 times; NCC check failed; */
#define  EXCLUDED                           (NCB_FAILED)

#else /* !DEFINE_OLD_NC_STATUS */
#define INACTIVE                            0
#define IDLE                                1
#define READ_BCCH                           2
#define FB_SB_SYNC                          3
#define FB_SB_FAILED                        4
#define READ_FB_SB                          5
#define READ_SB                             6
#define IDLE_SYNC                           7
#define EXCLUDED                            8
#define FB_SB_SYNC_RR_NOT_INFORMED          9
#define READ_SB_BCCH                       10
#define READ_BCCH_PENDING                  11
#define READ_FB_SB_PENDING                 12
#define READ_SB_PENDING                    13
#define READ_SB_BCCH_PENDING               14
#define READ_BCCH_RR_NOT_INFORMED          15
#define READ_BCCH_PENDING_RR_NOT_INFORMED  16
#endif /* !DEFINE_OLD_NC_STATUS */

/*
 * states of a neighbour cell with respect to the BA list
 * in the last MPH_NEIGHBOURCELL_REQ.
 */
#define IN_BA              0   /* NCell was in last MPH_NEIGHBOURCELL_REQ */
#define NOT_IN_BA_SHORT    1   /* NCell wasn't in last MPH_NEIGHBOURCELL_REQ but at last confirmation it had state IN_BA (not in BA for a short time) */
#define NOT_IN_BA_LONG     2   /* NCell wasn't in last MPH_NEIGHBOURCELL_REQ and at last confirmation it hadn't state IN_BA (not in BA for a long time) */
/*
*  Definitions for AMR
*/
#define CM_AMR             0x41

/*
 * The times are given in number of multiframes. Each multiframe is
 * equal to circa 217 milliseconds.
 */
#define THIRTY_SECONDS_SCELL_BCCH   128

/*
 * States Main Control
 */
#define MA_NULL              0
#define MA_CELL_SELECTION    1
#define MA_IDLE              2
#define MA_CON_EST           3
#define MA_DEDICATED         4
#define MA_CELL_RESELECTION  5

#ifdef GPRS
#define MA_PTM               6
#endif

EXTERN  const char * const
        STATE_MA_NAME[];
#ifndef GPRS
#define STATE_MA_NAME_INIT   \
       "MA_NULL"            ,\
       "MA_CELL_SELECTION"  ,\
       "MA_IDLE"            ,\
       "MA_CON_EST"         ,\
       "MA_DEDICATED"       ,\
       "MA_CELL_RESELECTION"
#else  /* !GPRS */
#define STATE_MA_NAME_INIT   \
       "MA_NULL"            ,\
       "MA_CELL_SELECTION"  ,\
       "MA_IDLE"            ,\
       "MA_CON_EST"         ,\
       "MA_DEDICATED"       ,\
       "MA_CELL_RESELECTION",\
       "MA_PTM"
#endif  /* !GPRS */
/*
 * States Idle Neighbour Cell
 */
#define NC_NULL              0
#define NC_IDLE              1
#define NC_DEDICATED         2
#define NC_CON_EST           3
#ifdef GPRS
#define NC_PIM_PBCCH         4
#define NC_PTM_PBCCH         5

EXTERN  const char * const
        STATE_NC_NAME[];
#define STATE_NC_NAME_INIT   \
       "NC_NULL"            ,\
       "NC_IDLE"            ,\
       "NC_DEDICATED"       ,\
       "NC_CON_EST"         ,\
       "NC_PIM_PBCCH"       ,\
       "NC_PTM_PBCCH"
#else
EXTERN  const char * const
        STATE_NC_NAME[];
#define STATE_NC_NAME_INIT   \
       "NC_NULL"            ,\
       "NC_IDLE"            ,\
       "NC_DEDICATED"       ,\
       "NC_CON_EST"
#endif

/*
 * States Dedicated Control
 */
#define DEDI_INACTIVE        0
#define DEDI_IMM_ASS         1
#define DEDI_IMM_ASS_RECONN  2
#define DEDI_ACTIVE          3

EXTERN  const char * const
        STATE_DEDI_NAME[];
#define STATE_DEDI_NAME_INIT \
       "DEDI_INACTIVE"      ,\
       "DEDI_IMM_ASS"       ,\
       "DEDI_IMM_ASS_RECONN",\
       "DEDI_ACTIVE"

/*
 * States Cell Selection
 */
#define CS_NULL              0
#define CS_INIT_L1           1  /* start with configuration of the radio band */
#define CS_INIT_ACTIVE       2  /* configuration of the radio band is active */
#define CS_INIT_DONE         3  /* configuration has done */
#define CS_START_MEASURE     4  /* start measurement with preceding configuration */
#define CS_ACTIVE_MEASURE    5  /* power measurement step is active */
#define CS_MEASURED          6  /* power measurement step has finished */
#define CS_INIT_SYNC         7  /* configuration of the radio band before SYNC */
#define CS_STOP_SYNC         8  /* stop any sync task */
#define CS_STOP_SYNC_DONE    9  /* no sync task active */
#define CS_ACTIVE_SYNC      10
#define CS_ACTIVE_BCCH      11
#define CS_NW_SYNC_TIMEOUT  12  /* ALR has timed out whilst attempting to sync to a nw */

EXTERN  const char * const
        STATE_CS_NAME[];
#define STATE_CS_NAME_INIT\
       "CS_NULL"            ,\
       "CS_INIT_L1"         ,\
       "CS_INIT_ACTIVE"     ,\
       "CS_INIT_DONE"       ,\
       "CS_START_MEASURE"   ,\
       "CS_ACTIVE_MEASURE"  ,\
       "CS_MEASURED"        ,\
       "CS_INIT_SYNC"       ,\
       "CS_STOP_SYNC"       ,\
       "CS_STOP_SYNC_DONE"  ,\
       "CS_ACTIVE_SYNC"     ,\
       "CS_ACTIVE_BCCH"     ,\
       "CS_NW_SYNC_TIMEOUT"

/*
 * States PCH Control
 */
#define PCH_NULL           0
#define PCH_ACTIVE         1

EXTERN  const char * const
        STATE_PCH_NAME[];
#define STATE_PCH_NAME_INIT\
       "PCH_NULL"         ,\
       "PCH_ACTIVE"

/*
 * States RACH Control
 */
#define RA_NULL            0
#define RA_ACTIVE          1
#define RA_LISTEN_TO_CCCH  2

EXTERN  const char * const
        STATE_RA_NAME[];
#define STATE_RA_NAME_INIT \
       "RA_NULL"          ,\
       "RA_ACTIVE"        ,\
       "RA_LISTEN_TO_CCCH"

/*
 * States CBCH Control
 */
#define CBCH_NULL          0
#define CBCH_IDLE          1
#define CBCH_NO_DRX        2
#define CBCH_DRX           3

#define CBCH_HZ_OFF        0
#define CBCH_HZ_IDLE        5
#define CBCH_HZ_PENDING     6
#define CBCH_HZ_RECEIVED    7


EXTERN  const char * const STATE_NORMAL_CBCH_NAME[];
EXTERN  const char * const STATE_EXT_CBCH_NAME[];

#define STATE_CBCH_NAME_INIT\
       "CBCH_NULL"         ,\
       "CBCH_IDLE"         ,\
       "CBCH_NO_DRX"       ,\
       "CBCH_DRX"

/*
 * States Idle Mode Serving Cell
 */
#define SC_NULL            0
#define SC_IDLE_INITIAL    1
#define SC_IDLE            2

EXTERN  const char * const
        STATE_SC_NAME[];
#define STATE_SC_NAME_INIT \
       "SC_NULL"          ,\
       "SC_IDLE_INITIAL"  ,\
       "SC_IDLE"

/*
 * States Idle Mode Serving Cell
 */

typedef enum {
  NC_ACQUIRE=0,
  NC_CONFIRM
} T_NCELL_PROC;

EXTERN  const char * const
        STATE_NC_PROC_NAME[];
#define STATE_NC_PROC_NAME_INIT \
       "NC_ACQUIRE"          ,\
       "NC_CONFIRM"


/*
 * ALR manages 9 (MAX_STATE) states: CBCH,CS,MA,NC,PCH,RA,SC,DEDI,NC_PROC
 */

#define STATE_CS                  0
#define STATE_MA                  1
#define STATE_NC                  2
#define STATE_PCH                 3
#define STATE_RA                  4
#define STATE_SC                  5
#define STATE_DEDI                6
#define STATE_NC_PROC             7
#define STATE_NORMAL_CBCH         8
#define STATE_EXT_CBCH            9
#define MAX_STATE                 10

/*
 * A definition is provided in ALR_PEI.C
 */
#ifdef ALR_PEI_C
  GLOBAL const char * const    STATE_NORMAL_CBCH_NAME[] = {    STATE_CBCH_NAME_INIT };
  GLOBAL const char * const    STATE_EXT_CBCH_NAME[] = {    STATE_CBCH_NAME_INIT };
  GLOBAL const char * const    STATE_CS_NAME  [] = {    STATE_CS_NAME_INIT   };
  GLOBAL const char * const    STATE_MA_NAME  [] = {    STATE_MA_NAME_INIT   };
  GLOBAL const char * const    STATE_NC_NAME  [] = {    STATE_NC_NAME_INIT   };
  GLOBAL const char * const    STATE_PCH_NAME [] = {    STATE_PCH_NAME_INIT  };
  GLOBAL const char * const    STATE_RA_NAME  [] = {    STATE_RA_NAME_INIT   };
  GLOBAL const char * const    STATE_SC_NAME  [] = {    STATE_SC_NAME_INIT   };
  GLOBAL const char * const    STATE_DEDI_NAME[] = {    STATE_DEDI_NAME_INIT };
  GLOBAL const char * const    STATE_NC_PROC_NAME[]={ STATE_NC_PROC_NAME_INIT };
#endif  /* ALR_PIC_C */

/*==== MACROS =====================================================*/

/*

   This macros convert channel numbers from and to the layer 1 specific
   representation for the target version.

   For the single bands GSM900, DCS1800 and PCS1900 the macro is removed
   at compile time.

   For dualband (STD==5,STD==6) a DCS1800 channel number is converted
   using the convert function located at the end of alr_main.c

   In the windows variant no change occurs.

*/

EXTERN USHORT convert_arfcn_to_l1  (USHORT arfcn, UBYTE local_std);
EXTERN USHORT convert_arfcn_to_g23 (USHORT arfcn, UBYTE local_std);

/* range check with the fastest way for ARM */
/* corresponds with ((min <= x) AND (x <= max)) */
#define INRANGE(min, x, max)  ((unsigned)(x-min) <= (max-min))

#if defined (WIN32)
  #define ARFCN_TO_L1(a)          ((USHORT)((a)&ARFCN_MASK))
  #define ARFCN_TO_G23(a)         ((USHORT)((a)&ARFCN_MASK))
  #define ARFCN_STD_TO_L1(a,std)  ((USHORT)((a)&ARFCN_MASK))
  #define ARFCN_STD_TO_G23(a,std) ((USHORT)((a)&ARFCN_MASK))
#else
  /*
   * target version
   */
  #define ARFCN_TO_L1(a)          convert_arfcn_to_l1((USHORT)(a),std)
  #define ARFCN_TO_G23(a)         convert_arfcn_to_g23((USHORT)(a),std)
  #define ARFCN_STD_TO_L1(a,std)  convert_arfcn_to_l1((USHORT)(a),std)
  #define ARFCN_STD_TO_G23(a,std) convert_arfcn_to_g23((USHORT)(a),std)
#endif

/* add resp. get the std value to resp. from arfcn */
#define STD_ADD_TO_ARFCN(a,std)  (((a)&~STD_BIT_MASK) | ((std)<<STD_BIT_SHIFT))
#define STD_GET_FROM_ARFCN(a)    ((((a)&STD_BIT_MASK)>>STD_BIT_SHIFT))

/* find the frequency band index to which the given arfcn belongs. */
EXTERN const int array_band_index[];
#define get_band_index_from_arfcn(arfcn, idx, std)\
{\
   UBYTE local_std = STD_GET_FROM_ARFCN(arfcn);\
   if( !local_std )\
      	local_std = std;\
    idx = local_std;\
    if( local_std ==  STD_DUAL ) {\
            if (arfcn >= LOW_CHANNEL_1800)\
            idx = STD_1800;\
            else\
            idx = STD_900;\
    }\
    else if ( local_std EQ  STD_DUAL_EGSM ) {\
            if (arfcn >= LOW_CHANNEL_EGSM)\
                idx = BAND_E_GSM;\
            else if (arfcn >= LOW_CHANNEL_1800)\
                idx = STD_1800;\
            else if (arfcn EQ CHANNEL_0)\
                idx = STD_EGSM;\
            else\
                idx = STD_900;\
    }\
    else if( local_std EQ  STD_DUAL_US ) {\
            if (arfcn >= LOW_CHANNEL_1900)\
                idx = STD_1900;\
            else\
                idx = STD_850;\
    }\
    (local_std<=STD_DUAL_US)?(idx=array_band_index[idx-1]):(idx=MAX_NUM_BANDS) ;\
}

/*==== TYPES ======================================================*/

EXTERN UBYTE std;       									/*lint -esym(526,std)        : not defined | defined in other entity */
EXTERN UBYTE test_house;									/*lint -esym(526,test_house) : not defined | defined in other entity */

typedef struct {
  USHORT  radio_freq;
  SHORT   accum_power_result;
} T_POWER_ARRAY;

typedef struct {
  USHORT        power_array_size;
  T_POWER_ARRAY power_array[MAX_CARRIERS];
} T_POWER_MEAS;

typedef struct {
  USHORT        power_array_size;
  T_POWER_ARRAY power_array[MAX_CARRIERS_DUAL_EGSM];
} T_POWER_MEAS1;

typedef struct {
  USHORT        power_array_size;
  T_POWER_ARRAY power_array[MAX_CARRIERS_DUAL_US];
} T_POWER_MEAS2;

EXTERN T_POWER_MEAS1  alr_power_meas_result1;
EXTERN T_POWER_MEAS2  alr_power_meas_result2;

#define CS_SYNC_FAIL_COUNT_MAX 5
#define CS_BCCH_FAIL_COUNT_MAX 10

typedef struct {
  T_POWER_MEAS    *p_results1;
  T_POWER_MEAS    *p_results2;
  T_MPH_POWER_CNF *p_power_cnf;
  T_MPH_POWER_REQ *p_power_req;           /*   CSI-LLD section: 4.1.3.1.2 */
  T_MPH_EXT_MEAS_REQ *mph_ext_meas_req;
  USHORT          arfcn;
  UBYTE           ext_meas_state_pend;    /* wait for pending MPHC_RXLEV_IND or MPHC_NCELL_SYNC_IND */
  UBYTE           sync_active;
  UBYTE           freq_bands;
  UBYTE           std;
  UBYTE           std12;
  UBYTE           freq_area;
  UBYTE           search_mode;
  UBYTE           sync_fail_count;
  UBYTE           bcch_fail_count;
  UBYTE           c_meas;
  UBYTE           c_max_meas;
  T_TIME          c_tim_meas;
} T_CS_DATA;

#define MAX_OLD_CB  10
#define CBCH_BLOCK_SIZE      22
#define CBCH_BLOCKS           4
#define CBCH_MSG_SIZE      (CBCH_BLOCKS*CBCH_BLOCK_SIZE)

/* no alignment or gaps between members ! */
typedef struct cbmsg_header_t
{
  UBYTE   serial_no1;
  UBYTE   serial_no2;
  UBYTE   msg_id3;
  UBYTE   msg_id4;
  UBYTE   dcs;
  UBYTE   page;
} T_CBMSG_HEADER;

typedef struct
{
  UBYTE  cnt;
  T_CBMSG_HEADER header [MAX_OLD_CB];
} T_CB_MSG;

#define CBCH_CHANNELS 2
/*
 * index defines are in alr_cbch.c :
 * CBCH_NORM 0
 * CBCH_EXT  1
 */
typedef struct
{
  /* message which currently read */
  UBYTE      msg_is_extended;
  UBYTE      msg [CBCH_MSG_SIZE];
  USHORT     msg_id_sat [MAX_IDENTS_SAT];
  UBYTE      msg_type;
  UBYTE      sat_enabled;
  UBYTE      expected_seq_number[CBCH_CHANNELS];
  /* schedule support for normal and extended CBCH */
  UBYTE      begin_schedule[CBCH_CHANNELS];
  UBYTE      end_schedule[CBCH_CHANNELS];
  UBYTE      scheduled_sched_msg[CBCH_CHANNELS];
  UBYTE      schedule_length[CBCH_CHANNELS];
  UBYTE      last_slot_read[CBCH_CHANNELS];
  ULONG      schedule_map[CBCH_CHANNELS][2];
  /* configured by MMI: specifies which messages are wanted */
  UBYTE      modus;
  UBYTE      old_cid_plmn_lac [7];
  UBYTE      dcs_id [MAX_IDENTS];
  USHORT     msg_id [MAX_IDENTS];
  T_CB_MSG   old_cbch_msg;
#if defined(FF_HOMEZONE)
  /*
   * special handling for homezone CBCH message after cell reselecting
   */
  UBYTE      homezone;
  USHORT     msg_hz_id;
  UBYTE      dcs_hz_id;
  USHORT     hz_timeout;
 #endif  /* FF_HOMEZONE */
#if !defined (L1_STORES_CBCH_CONFIG)
  T_MPHC_CONFIG_CBCH_REQ     mphc_config_cbch;
#endif
} T_CBCH_DATA;

typedef struct
{
  UBYTE                  sys_info_1[22];
  UBYTE                  sys_info_2[22];
  UBYTE                  sys_info_2bis[22];
  UBYTE                  sys_info_2ter[22];
  UBYTE                  sys_info_3[22];
  UBYTE                  sys_info_4[22];
  UBYTE                  sys_info_5[18];
  UBYTE                  sys_info_5bis[18];
  UBYTE                  sys_info_5ter[18];
  UBYTE                  sys_info_6[18];
#ifdef GPRS
  UBYTE                  sys_info_13[22];
#endif
} T_MA_DATA;

typedef struct
{
  /* information for using the cell */
  USHORT     ba_arfcn;
  UBYTE      last_rxlev;
  UBYTE      tim_valid;
  ULONG      frame_offset;
  ULONG      time_align;
  UBYTE      bsic;
  /* power measurements of the cell */
  UBYTE      rxlev[5];
  UBYTE      rxlev_average;
  UBYTE      c_rxlev;
  /* state of the cell */
  UBYTE      one_of_six;   /* this is a subset of one_of_twelve */
  UBYTE      one_of_twelve;
  UBYTE      status;
  UBYTE      ba_status;
  UBYTE      new_strong_cell;
  /* counters for status handling */
  UBYTE      c_attempt;
  UBYTE      c_error;
  UBYTE      c_bcch;
  UBYTE      c_sync;
  USHORT     blocks_required;
  /* Meas results for averaging when NC=1 or NC=2 */
#ifdef GPRS
  USHORT     nc_rxlev;
  UBYTE      c_nc_rxlev;
#endif
  /* temporary BCCH storage */
  T_MPH_UNITDATA_IND* mph_unitdata_ind;
  T_MPH_UNITDATA_IND* mph_unitdata_ind78;
  
} T_NC;

/* values for component tim_state */
#define NC_TIM_STOPPED       0
#define NC_CONF_ENABLED      1
#define NC_CONF_DISABLED     2
#define NC_CONF_PENDING      3

typedef struct
{
  /* +1 because we use this for idle mode cell selection */
#define LAST_BSIC_REQ        BA_LIST_SIZE
  T_NC       cell[BA_LIST_SIZE+1];
  T_NC       cr_cell; /*  */
  UBYTE      c_ba_arfcn;
  UBYTE      ba_id;
  USHORT     channel;
  USHORT     rxlev_full;
  USHORT     rxlev_sub;
  UBYTE      rxqual_full;
  UBYTE      rxqual_sub;
  USHORT     tav;
  UBYTE      pwrc;
  UBYTE      dtx;
  UBYTE      act_dtx;
  UBYTE      update;
  UBYTE      sc_included;
  UBYTE      multiband;
  UBYTE      c_nc_timer;
  /*
   * Counter variable used to store 10sec timer interval 
   * in terms of  the number of 51 frame control multi-frames. 
   * This counter is decremented for every measurement indication
   * received from L1. This is initialized with TEN_SECONDS_ NCSYNC.
   */
  UBYTE      c_ncsync_tim; 
  /*
   *Variable to store the system time whenever 
   * the NCSYNC counter is re-assigned
   */
  T_TIME     ncsync_start_tim;
  /* for MPH_MEASUREMENT_IND */
  USHORT     fn_offset;
  UBYTE      max_reports;
  UBYTE      c_reports; /*
   * counters to keep track of the send NCELL_SYNC_REQ's
   * and NCELL_BCCH_REQ's valid ranges are 0..12 and 0..6
   */
  UBYTE       c_sync_req;
  UBYTE       c_bcch_req;
  /* EOTD related */
  UBYTE       eotd_avail;
  UBYTE       tim_state;
  UBYTE       new_strong_cell_detect;
  UBYTE       c_sync_intrupted;
  T_MPH_NCELL_POS_IND* ppos_ind;
  T_MPH_NCELL_POS_REQ* ppos_req;
} T_NC_DATA;

#define SYSTEM_INFO_1_READ           0x01
#define SYSTEM_INFO_2_READ           0x02
#define SYSTEM_INFO_3_READ           0x04
#define SYSTEM_INFO_4_READ           0x08

#ifdef GPRS
#define SYSTEM_INFO_13_READ          0x10
#endif

#define ALL_SI_READ_EXCEPT_SI13      0x0F

typedef struct
{
  T_MPHC_START_CCCH_REQ  pl_idle, last_start_ccch_req;
  SHORT      imsi_mod_1000;
  UBYTE      dlt;
  UBYTE      act_dlt;
  UBYTE      si3_read;
  UBYTE      saved_page_mode;
  UBYTE      imsi [IMSI_LEN];
  UBYTE      v_tmsi;
  ULONG      tmsi;
  BOOL       reorg_bcch_reading;
  UBYTE      si_bitmap;
} T_PCH_DATA;

typedef struct
{
  UBYTE       ms_class;
  UBYTE       dcs_class;
  UBYTE       max_tx_pwr_ccch;
  UBYTE       delta [8];
  UBYTE       channel_request [8];
#ifdef GPRS
  UBYTE       t1 [8];
  UBYTE       t2 [8];
  UBYTE       t3 [8];
#endif
  UBYTE       max_bursts;
  UBYTE       c_burst;
} T_RACH_DATA;

typedef struct
{
  UBYTE             rlt;
  UBYTE             act_rlt;
  USHORT            act_bcch;
  UBYTE             act_mode;
  /*
   *   Description of the actual used
   *   channel, confirmed by layer 1
   */
  T_channel_desc            act_channel_desc;
  T_frequency_list          act_frequency_list;
  T_starting_time           act_starting_time;
  T_frequency_list_bef_sti  act_frequency_list_bef_sti;
  T_channel_desc            act_channel_desc_bef_sti;
  UBYTE                     act_channel_mode;
  BOOL                      act_pwrc;
  UBYTE                     act_cipher_mode;
  UBYTE                     act_a5_algorithm;
  T_cipher_key              act_cipher_key;
  T_amr_configuration       act_amr_configuration;
  UBYTE                     act_power;
  UBYTE                     act_dtx_allowed;
  /*
   *    Description of the old used
   *    channel.
   */
  USHORT                    old_bcch;
  UBYTE                     old_bsic;
  UBYTE                     old_channel;
  UBYTE                     old_channel_mode;
  T_channel_desc            old_channel_desc;
  T_frequency_list          old_frequency_list;
  T_starting_time           old_starting_time;
  T_frequency_list_bef_sti  old_frequency_list_bef_sti;
  T_channel_desc            old_channel_desc_bef_sti;
  BOOL                      old_pwrc;
  UBYTE                     old_cipher_mode;
  UBYTE                     old_a5_algorithm;
  T_cipher_key              old_cipher_key;
  T_amr_configuration       old_amr_configuration;
  UBYTE                     old_power;
  UBYTE                     old_dtx_allowed;

  /*
   *    Description of the new configured
   *    channel, not yet confirmed by layer 1.
   */
  USHORT                    temp_bcch;
  UBYTE                     temp_bsic;
  UBYTE                     temp_channel;
  UBYTE                     temp_channel_mode;
  T_channel_desc            temp_channel_desc;
  T_frequency_list          temp_frequency_list;
  T_starting_time           temp_starting_time;
  T_frequency_list_bef_sti  temp_frequency_list_bef_sti;
  T_channel_desc            temp_channel_desc_bef_sti;
  BOOL                      temp_pwrc;
  UBYTE                     temp_cipher_mode;
  UBYTE                     temp_a5_algorithm;
  T_cipher_key              temp_cipher_key;
  T_amr_configuration       temp_amr_configuration;
  UBYTE                     temp_power;
  UBYTE                     temp_dtx_allowed;

  /*
   *     Description of frequency redefinition
   *     parameter.
   */
  T_channel_desc    redef_channel_desc;
  T_frequency_list  redef_frequency_list;
  T_starting_time   redef_starting_time;
  /*
   *     Extended Measurmeent Order parameter.
   */
  UBYTE                     emo_ba_id;
} T_DEDI_DATA;

#define TIM_NCSYNC_VALUE               10000
#define TIM_NW_SYNC_GUARD_VALUE         2500

/*
 *  timer
 */
#define TIMER_TRACE

#if defined (TIMER_TRACE)
#define TIMERSTART(i,v)                 tim_start_timer (i, v)
#define TIMERSTOP(i)                    tim_stop_timer (i)
#define IS_TIMER_ACTIVE(i)              tim_check_timer (i)
#else
#define TIMERSTART(i,v)
#define TIMERSTOP(i)
#define IS_TIMER_ACTIVE(i)
#endif /* TIMER_TRACE */

enum  tim_index_e
{
  TIM_POWERMEAS,
  TIM_NW_SYNC_GUARD,
#if defined(FF_HOMEZONE)
  TIM_HOMEZONE,
#endif  /* FF_HOMEZONE */
  NUM_OF_ALR_TIMERS
};

typedef  void (*T_TIMER_EXPIRY)(void);

typedef struct
{
  UBYTE             running[NUM_OF_ALR_TIMERS];
  T_TIMER_EXPIRY    expire[NUM_OF_ALR_TIMERS];
} T_TIM_DATA;

#ifdef OPTION_MULTITHREAD
  #define tim_init                  _ENTITY_PREFIXED(tim_init)
  #define tim_exec_timeout          _ENTITY_PREFIXED(tim_exec_timeout)
  #define tim_stop_timer            _ENTITY_PREFIXED(tim_stop_timer)
  #define tim_start_timer           _ENTITY_PREFIXED(tim_start_timer)
  #define tim_check_timer           _ENTITY_PREFIXED(tim_check_timer)
  #define trace_timer               _ENTITY_PREFIXED(trace_timer)
#endif

EXTERN void tim_init (void);
EXTERN void tim_exec_timeout (USHORT index);
EXTERN void tim_stop_timer (USHORT index);
EXTERN void tim_start_timer (USHORT index, T_TIME value);
EXTERN BOOL tim_check_timer(USHORT index);

/* all data is stored so, that it doesn't need
   to be converted if send to the upper layers.
   Exceptions are alr_data.cs_data.results,
                  alr_data.pch_data.pl_idle
                  alr_data.pch_data.imsi */

typedef struct
{
  UBYTE          state[MAX_STATE];
  /*
   * each of these elements is only
   * accessed by the appropiate
   * process
   */
  T_CBCH_DATA    cbch_data;
  T_CS_DATA      cs_data;
  T_MA_DATA      ma_data;
  T_NC_DATA      nc_data;
  T_PCH_DATA     pch_data;
  T_RACH_DATA    rach_data;
  T_DEDI_DATA    dedi_data;
#ifdef GPRS
  T_ALR_GPRS_DATA    gprs_data;
#endif  /* GPRS */
  T_TIM_DATA     tim_data;

  UBYTE          mmi;             /* mmi variant     */
  UBYTE          keypad;          /* keypad variant  */
  UBYTE          sc_band;         /* frequency band of the serving cell */
  BOOL           ext_display;     /* ext display     */
  EF_MSCAP       mscap;           /* MS capabilities (channel mode, data cap., features */
                                  /* is this component really needed ?? */
  /*
   * these parameters are used by more than one process
   * this is to avoid data inconsistencies between
   * the different processes
   */
  USHORT         serving_cell;
  USHORT         old_serving_cell;
  UBYTE          bsic;
  UBYTE          bs_pa_mfrms;
  UBYTE          ncc_permitted;
  UBYTE          plmn_search_running;
#ifdef GPRS
  UBYTE          nc_sync_with_grr;
  UBYTE          nwctrl_meas_active; /* indicates whether averaging when NC=1,2 is active */
#endif
} T_ALR_DATA;

/*==== EXPORT =====================================================*/
/*
 *  Main Control
 */
EXTERN void ma_init                    (void);
/*
 *  Primitive processing functions for upper layer (RR)
 */
EXTERN void ma_mph_idle_req                 (T_MPH_IDLE_REQ                 *mph_idle_req);
EXTERN void ma_mph_neighbourcell_req        (T_MPH_NEIGHBOURCELL_REQ        *mph_neighbourcell_req);
EXTERN void ma_mph_emo_req                  (T_MPH_EMO_REQ                  *mph_emo_req);
EXTERN void ma_mph_dedicated_req            (T_MPH_DEDICATED_REQ            *mph_dedicated_req);
EXTERN void ma_mph_dedicated_fail_req       (T_MPH_DEDICATED_FAIL_REQ       *mph_dedicated_fail_req);
EXTERN void ma_mph_ciphering_req            (T_MPH_CIPHERING_REQ            *mph_ciphering_req);
EXTERN void ma_mph_freq_redef_req           (T_MPH_FREQ_REDEF_REQ           *mph_freq_redef_req);
EXTERN void ma_mph_channel_mode_req         (T_MPH_CHANNEL_MODE_REQ         *mph_channel_mode_req);
EXTERN void ma_mph_deactivate_req           (T_MPH_DEACTIVATE_REQ           *mph_deactivate_req);
EXTERN void ma_mph_classmark_req            (T_MPH_CLASSMARK_REQ            *mph_classmark_req);
EXTERN void ma_mph_ext_meas_req             (T_MPH_EXT_MEAS_REQ             *mph_ext_meas_req);
EXTERN void ma_mph_tch_loop_req             (T_MPH_TCH_LOOP_REQ             *mph_tch_loop_req);
EXTERN void ma_mph_dai_req                  (T_MPH_DAI_REQ                  *mph_dai_req);
EXTERN void ma_mph_cbch_req                 (T_MPH_CBCH_REQ                 *mph_cbch_req);
EXTERN void ma_mph_identity_req             (T_MPH_IDENTITY_REQ             *mph_identity_req);
EXTERN void ma_mph_power_req                (T_MPH_POWER_REQ                *mph_power_req);
EXTERN void ma_mph_bsic_req                 (T_MPH_BSIC_REQ                 *mph_bsic_req);
EXTERN void ma_mph_random_access_req        (T_MPH_RANDOM_ACCESS_REQ        *mph_random_access_req);
EXTERN void ma_mph_sync_req                 (T_MPH_SYNC_REQ                 *mph_sync_req);
EXTERN void ma_mph_ncell_pos_req            (T_MPH_NCELL_POS_REQ            *mph_ncell_pos_req);
EXTERN void ma_mph_clean_buf_req            (T_MPH_CLEAN_BUF_REQ            *mph_clean_buf_req);
EXTERN void ma_mph_stop_dedi_req            (T_MPH_STOP_DEDICATED_REQ       *mph_stop_dedi_req);
#ifdef GPRS
EXTERN void ma_mph_meas_rep_req             (T_MPH_MEAS_REP_REQ             *mph_meas_rep_req);
#endif
/*
 *  Primitive processing functions for lower layer
 */
EXTERN void ma_mphc_rxlev_ind               (T_MPHC_RXLEV_IND               *rxlev_ind);
EXTERN void ma_mphc_stop_rxlev_cnf          (T_MPHC_STOP_RXLEV_CON          *rxlev_con);
EXTERN void ma_mphc_empty_cnf               (void                           *);
EXTERN void ma_mphc_network_sync_ind        (T_MPHC_NETWORK_SYNC_IND        *network_sync_ind);
EXTERN void ma_cs_stop_network_sync_req     (void);
EXTERN void ma_mphc_new_scell_cnf           (T_MPHC_NEW_SCELL_CON           *new_Scell_cnf);
EXTERN void ma_mphc_ncell_bcch_ind          (T_MPHC_NCELL_BCCH_IND          *ncell_bcch_data_ind);
EXTERN void ma_mphc_ncell_sync_ind          (T_MPHC_NCELL_SYNC_IND          *ncell_sync_ind);
GLOBAL void ma_mphc_stop_ncell_sync_cnf     (T_MPHC_STOP_NCELL_SYNC_CON     *ncell_sync_cnf );
EXTERN void ma_mphc_rxlev_periodic_ind      (T_MPHC_RXLEV_PERIODIC_IND      *rxlev_periodic_ind);
EXTERN void ma_mphc_ra_cnf                  (T_MPHC_RA_CON                  *ra_cnf);
EXTERN void ma_mphc_data_ind                (T_MPHC_DATA_IND                *data_ind);
EXTERN void ma_mphc_change_frequency_cnf    (T_MPHC_CHANGE_FREQUENCY_CON    *change_frequency_cnf);
EXTERN void ma_mphc_async_ho_cnf            (T_MPHC_ASYNC_HO_CON            *async_ho_cnf);
EXTERN void ma_mphc_channel_assign_cnf      (T_MPHC_CHANNEL_ASSIGN_CON      *channel_assign_cnf);
EXTERN void ma_mphc_handover_fail_cnf       (T_MPHC_HANDOVER_FAIL_CON       *handover_fail_cnf);
EXTERN void ma_mphc_immed_assign_cnf        (T_MPHC_IMMED_ASSIGN_CON        *immed_assign_cnf);
EXTERN void ma_mphc_pre_sync_ho_cnf         (T_MPHC_PRE_SYNC_HO_CON         *pre_sync_ho_cnf);
EXTERN void ma_mphc_sync_ho_cnf             (T_MPHC_SYNC_HO_CON             *sync_ho_cnf);
EXTERN void ma_mphc_ta_fail_ind             (T_MPHC_TA_FAIL_IND             *ta_fail_ind);
EXTERN void ma_mphc_handover_finished_ind   (T_MPHC_HANDOVER_FINISHED       *handover_finished);
EXTERN void ma_mphc_meas_report_ind         (T_MPHC_MEAS_REPORT             *meas_report);
EXTERN void ma_mphc_adc_ind                 (T_MPHC_ADC_IND                 *adc_results);
EXTERN void ma_mphc_init_l1_cnf             (T_MPHC_INIT_L1_CON             *init_l1_cnf);
EXTERN void ma_mphc_stop_dedi_con           (T_MPHC_STOP_DEDICATED_CON      *stop_cnf);
#if defined(STOP_SYNC_TASK)
EXTERN void ma_mphc_stop_network_sync_cnf   (T_MPHC_STOP_NETWORK_SYNC_CON   *stop_network_sync_cnf);
#endif /* STOP_SYNC_TASK */
/* Signal processing functions for process Cell Selection */
EXTERN void ma_cs_init_l1_req               (UBYTE                           radio_band_config);
EXTERN void ma_cs_stop_network_sync_req     (void);
EXTERN void ma_cs_network_sync_req          (USHORT                          channel);
EXTERN void ma_cs_rxlev_req                 (void);
EXTERN void ma_cs_power_cnf                 (T_MPH_POWER_CNF                *mph_power_cnf);

/* Signal processing functions for process Neigbour Cell */
EXTERN void ma_nc_rxlev_periodic_req        (T_MPHC_RXLEV_PERIODIC_REQ      *update);
EXTERN void ma_nc_stop_ncell_bcch_req       (USHORT                          arfcn);
EXTERN void ma_nc_stop_ncell_sync_req       (USHORT                          arfcn);
EXTERN void ma_nc_sync_req                  (T_MPHC_NCELL_SYNC_REQ          *sync_req);
EXTERN void ma_nc_list_sync_req             (T_MPHC_NCELL_LIST_SYNC_REQ     *list_sync_req);
EXTERN void ma_nc_bcch_req                  (T_MPHC_NCELL_BCCH_REQ          *bcch_req);
EXTERN void ma_nc_update_ba_list            (T_MPHC_UPDATE_BA_LIST          *update_ba_list);
EXTERN void nc_new_serving_cell             (USHORT                          serving_cell);
EXTERN void ma_nc_report_res                (T_MPH_MEASUREMENT_IND          *mph_measurement_ind);

/* Signal processing functions for process RACH_Contol */
EXTERN void ma_rach_stop_ra_req             (void);
EXTERN void ma_rach_ra_req                  (T_MPHC_RA_REQ                  *mph_ra_req);
EXTERN void ma_rach_random_cnf              (T_MPH_RANDOM_ACCESS_CNF        *mph_random_access_cnf);

/* Signal processing functions for process Dedi_Control */
EXTERN void ma_dedi_stop_req (void);
EXTERN void ma_dedi_cnf (UBYTE cause);
EXTERN void ma_dedi_chan_ass_req (T_MPHC_CHANNEL_ASSIGN_REQ *mphc_channel_assign_req);
EXTERN void ma_dedi_async_ho_req (T_MPHC_ASYNC_HO_REQ *async_ho_req);
EXTERN void ma_dedi_sync_ho_req (T_MPHC_SYNC_HO_REQ *sync_ho_req);
EXTERN void ma_dedi_pre_sync_ho_req (T_MPHC_PRE_SYNC_HO_REQ *pre_sync_ho_req);
EXTERN void ma_dedi_fail_cnf (void);
EXTERN void ma_dedi_ho_fail_req (void);
EXTERN void ma_dedi_imm_ass_req (T_MPHC_IMMED_ASSIGN_REQ *immed_assign_req);
EXTERN void ma_dedi_change_freq_req (T_MPHC_CHANGE_FREQUENCY *change_frequency);
EXTERN void ma_dedi_chan_mode_req (T_MPHC_CHANNEL_MODE_MODIFY_REQ *channel_mode_modify_req);
EXTERN void ma_dedi_ciph_req (T_MPHC_SET_CIPHERING_REQ *set_ciphering_req);
EXTERN void ma_dedi_start_dai_req (T_OML1_START_DAI_TEST_REQ *oml1_start_dai_test_req);
EXTERN void ma_dedi_close_tch_loop_req (T_OML1_CLOSE_TCH_LOOP_REQ *oml1_close_tch_loop_req);
EXTERN void ma_dedi_stop_dai_req (void);
EXTERN void ma_dedi_open_tch_loop_req (void);

/* Signal processing functions for process PCH_control */
EXTERN void ma_pch_start_ccch_req           (T_MPHC_START_CCCH_REQ          *pl_idle);
EXTERN void ma_pch_paging_ind               (UBYTE                           id_type,
                                             UBYTE                           channel_needed);
EXTERN void ma_pch_stop                     (void);

/* Signal processing functions for process MMI_control */
EXTERN void ma_mmi_cbch_req                 (T_MMI_CBCH_REQ                 *cbch_req);
EXTERN void ma_mmi_sat_cbch_dwnld_req       (T_MMI_SAT_CBCH_DWNLD_REQ        *cbch_req);
/* Signal processing functions for process CBCH_control */
EXTERN void ma_cb_stop_cbch_req             (void);
EXTERN void ma_cb_sched_req                 (T_MPHC_CBCH_SCHEDULE_REQ       *sched_req);
EXTERN void ma_cb_config_cbch               (T_MPHC_CONFIG_CBCH_REQ         *config_cbch);
EXTERN void ma_cb_mmi_cbch_ind              (T_MMI_CBCH_IND                 *mmi_cbch_ind);
EXTERN void ma_cb_info_req                  (UBYTE                           bitmap);

/* Signal processing functions used by more then one process */
EXTERN void ma_scell_nbcch_req              (T_MPHC_SCELL_NBCCH_REQ         *nbcch_req);
EXTERN void ma_scell_ebcch_req              (T_MPHC_SCELL_EBCCH_REQ         *ebcch_req);
EXTERN void ma_stop_scell_bcch_req          (void);
EXTERN void ma_stop_active_procs            (UBYTE flags);
EXTERN void ma_bsic_cnf                     (T_MPH_BSIC_CNF                 *mph_bsic_cnf);
EXTERN void ma_send_unitdata                (T_MPHC_DATA_IND                *data_ind);
EXTERN void ma_error_ind                    (UBYTE                           cause,
                                             USHORT                          arfcn);
EXTERN void ma_clean_dedi_sys_buffer        (void);
EXTERN void ma_new_scell_req                (T_MPHC_NEW_SCELL_REQ           *new_scell);
EXTERN void ma_scell_full_nbcch             (void);
#ifdef GPRS
EXTERN BOOL ma_is_ptm                       (void);
EXTERN void ma_nc_rxlev_sc_req              (T_TB_RXLEV_SC_REQ              *rxlev_sc_req);
#endif
EXTERN void ma_clean_sys_buffer             (USHORT                          si_mask);

/* defined in dl_pei.c */
EXTERN void dl1_downlink_indication         (UBYTE                           chan,
                                             UBYTE                          *frame);

/*
 *  CBCH Control
 */
EXTERN void   cb_init                       (void);
EXTERN void   cb_stop                       (void);
EXTERN void   cb_start                      (void);
EXTERN void   cb_mmi_cbch_req               (T_MMI_CBCH_REQ                  *cbch);
EXTERN void   cb_mph_cbch_req               (T_cbch                          *cbch);
EXTERN void   cb_data_ind                   (T_MPHC_DATA_IND                 *cbch_ind);
EXTERN void   cb_mmi_sat_cbch_req           (T_MMI_SAT_CBCH_DWNLD_REQ        *cbch_req);
#if defined(FF_HOMEZONE)
EXTERN void   cb_tim_homezone (void);
#endif  /* FF_HOMEZONE */

/*
 *  Cell Selection
 */
EXTERN void   cs_init                       (void);
EXTERN void   cs_rxlev_ind                  (T_MPHC_RXLEV_IND               *rxlev_ind);
EXTERN void   cs_network_sync_ind           (T_MPHC_NETWORK_SYNC_IND        *network_sync_ind);
EXTERN void   cs_stop                       (void);
EXTERN T_POWER_MEAS* cs_prepare_power_req   (void);
EXTERN void   cs_power_req                  (UBYTE                           pch_interrupt);
EXTERN void   cs_bsic_req                   (T_MPH_BSIC_REQ                 *mph_bsic_req);
EXTERN void   cs_read_scell_bcch            (void);
EXTERN UBYTE  get_band                      (USHORT                          arfcn);
EXTERN void   cs_increment_bfc              (void);
EXTERN void   cs_decrement_bfc              (void);
EXTERN void   cs_set_wideband_sync          (void);

/*
 *  Dedicated Control
 */
EXTERN void   dedi_init                     (void);
EXTERN void   dedi_req                      (T_MPH_DEDICATED_REQ            *dedicated_req);
EXTERN void   dedi_fail_req                 (void);
EXTERN void   dedi_ta_fail_ind              (void);
EXTERN void   dedi_ho_finished              (UBYTE                           cause);
EXTERN void   dedi_freq_redef_req           (T_MPH_FREQ_REDEF_REQ           *freq);
EXTERN void   dedi_chan_mode_req            (T_MPH_CHANNEL_MODE_REQ         *ch_mode);
EXTERN void   dedi_ciph_req                 (T_MPH_CIPHERING_REQ            *ciph_req);
EXTERN void   dedi_tch_loop_req             (T_MPH_TCH_LOOP_REQ             *tloop);
EXTERN void   dedi_dai_req                  (T_MPH_DAI_REQ                  *dai);
EXTERN void   dedi_change_freq_cnf          (void);
EXTERN void   dedi_async_ho_cnf             (void);
EXTERN void   dedi_chan_ass_cnf             (void);
EXTERN void   dedi_ho_fail_cnf              (void);
EXTERN void   dedi_imm_ass_cnf              (void);
EXTERN void   dedi_pre_sync_ho_cnf          (void);
EXTERN void   dedi_sync_ho_cnf              (void);
EXTERN void   dedi_stop                     (void);
EXTERN void   dedi_increment_rlt            (void);
EXTERN void   dedi_decrement_rlt            (void);

/*
 *  MMI Control
 */
EXTERN USHORT RX_GetValue                   (void);

/*
 *  Idle Mode Neighbour Cell
 */
EXTERN void   nc_init                       (void);
EXTERN void   nc_ncell_list                 (T_MPH_NEIGHBOURCELL_REQ        *mph_neighbourcell_req);
EXTERN void   nc_stop                       (void);
EXTERN void   nc_bsic_req                   (T_MPH_BSIC_REQ                 *mph_bsic_req);
EXTERN void   nc_sync_ind                   (T_MPHC_NCELL_SYNC_IND          *sync_ind);
EXTERN void   nc_bcch_ind                   (T_MPHC_NCELL_BCCH_IND          *data_ind);
EXTERN void   nc_start_dedicated            (UBYTE                           pwrc,
                                             UBYTE                           dtx);
EXTERN void   nc_update_dedicated           (UBYTE                           dtx,
                                             UBYTE                           pwrc);
EXTERN void   nc_update_list                (USHORT                          channel);
EXTERN BOOL   nc_get_fn_time                (USHORT                          channel,
                                             ULONG                           *fn,
                                             ULONG                           *time);
EXTERN void   nc_suspend                    (void);
EXTERN void   nc_add_offset                 (void);
EXTERN void   nc_report                     (T_MPHC_RXLEV_PERIODIC_IND      *rxlev_periodic_ind);
EXTERN void   nc_start_reselect             (USHORT                          arfcn);
EXTERN void   nc_start_monitoring           (void);
EXTERN void   nc_report_dedicated           (T_MPHC_MEAS_REPORT             *meas_report);
EXTERN void   nc_fill_report_sc_dedi        (T_MPH_MEASUREMENT_IND          *rr_report,
                                             UBYTE                           ncells);
EXTERN void   nc_store_tav                  (USHORT                          tav);
EXTERN void   nc_check_new_ncc_permitted    (UBYTE                           new_ncc_permitted);
EXTERN void   nc_stop_rr_activity           (UBYTE                           stop);
EXTERN void   nc_stop_ext_meas_ind          (void);
EXTERN void   nc_resume                     (void);
EXTERN void   nc_check_activity             (void);
EXTERN void   nc_set_status                 (USHORT                          index,
                                             UBYTE                           new_status);
EXTERN USHORT  nc_get_index                 (USHORT arfcn);
EXTERN void    nc_ncsync_tim_expiry         (void);
EXTERN void    nc_ncell_pos_req             (T_MPH_NCELL_POS_REQ*            pos_req);
GLOBAL void nc_resume_dedicated(void);
GLOBAL void nc_suspend_handover (void);

#ifdef GPRS
EXTERN void    nc_start_pbcch(void);
EXTERN void    nc_build_nwctrl_rr_report    (T_MPH_MEAS_REP_CNF             *rr_report);
#endif
/*
 *  PCH Control
 */
EXTERN void   pch_init                      (void);
EXTERN void   pch_configure                 (T_MPH_IDLE_REQ                 *idle,
                                             UBYTE page_mode);
EXTERN void   pch_start_ccch_req            (void);
EXTERN void   pch_save_pgm                  (UBYTE                           mode);
EXTERN void   pch_identity_req              (T_MPH_IDENTITY_REQ             *mph_identity_req);
EXTERN void   pch_check_pag_3               (T_MPHC_DATA_IND                *data_ind);
EXTERN void   pch_check_pag_2               (T_MPHC_DATA_IND                *data_ind);
EXTERN void   pch_check_pag_1               (T_MPHC_DATA_IND                *data_ind);
EXTERN void   pch_check_page_mode           (T_MPHC_DATA_IND                *data_ind);
EXTERN void   pch_check_page_mode_cr        (T_MPHC_DATA_IND                *data_ind);
EXTERN void   pch_decrement_dlt             (void);
EXTERN void   pch_increment_dlt             (void);
EXTERN void   pch_stop                      (void);
EXTERN UBYTE  pch_mode_reorg                (void);
EXTERN void   pch_config_resel              (T_MPHC_DATA_IND                *data_ind);
/*
 *  RACH Control
 */
EXTERN void   rach_init                     (void);
EXTERN void   rach_configure_power          (UBYTE                           power);
EXTERN void   rach_configure_class          (UBYTE                           class,
                                             UBYTE                           dcs_class);
EXTERN void   rach_stop                     (void);
EXTERN UBYTE  cut_power_value               (UBYTE                           power,
                                             T_MPH_DEDICATED_REQ            *mph_dedicated_req);

EXTERN void   rach_random_req               (T_MPH_RANDOM_ACCESS_REQ        *random_req);
EXTERN void   rach_ra_cnf                   (T_MPHC_RA_CON*                  ra_cnf);

/*
 *  Idle Mode Serving Cell
 */
EXTERN void   sc_start_periodic             (void);
EXTERN const void csf_show_version (T_TST_TEST_HW_CON  *ver);
EXTERN void   tim_stop_sync_to_nw           (void);



EXTERN UBYTE  grlc_test_mode_active(void);				/*lint -esym(526,grlc_test_mode_active) : not defined | defined in other entity */
EXTERN void   cst_pei_config (char *, char *);		/*lint -esym(526,cst_pei_config)       : not defined | defined in other entity */
#if defined (_SIMULATION_)
EXTERN void rr_csf_check_rfcap (UBYTE init);			/*lint -esym(526,rr_csf_check_rfcap)   : not defined | defined in other entity */
#endif  /* _SIMULATION_ */
EXTERN CHAR* alr_version(void);

#if defined(ALR_CSF_C) && defined(_TMS470)
EXTERN void  Cust_Init_Layer1(void);
EXTERN void  SIM_PowerOff (void);
EXTERN void  TM_EnableWatchdog (void);
EXTERN void  TM_ResetWatchdog(SYS_UWORD16 count);
#endif  /* ALR_CSF_C && _TMS470 */

#if defined(WIN32)
#include <stdio.h>  /* prototype of sprintf() */
#endif  /* WIN32 */

#if !defined NTRACE
EXTERN void trc_mon_counter_idle (UBYTE act_dlt, UBYTE max_dlt);
EXTERN void trc_mon_counter_dedi (UBYTE act_rlt, UBYTE max_rlt);
#endif /* (!defined NTRACE ) */



EXTERN T_ALR_DATA * alr_data;
#ifdef WIN32
  EXTERN T_POWER_MEAS tap_rxlev_response_european[];
  EXTERN T_POWER_MEAS tap_rxlev_response_american[];
#endif

#define ENTITY_DATA                alr_data

/*
 * If all entities are linked into one module this definitions
 * prefixes the global data with the enity name
 */
#ifdef OPTION_MULTITHREAD
  #define hCommL1         _ENTITY_PREFIXED(hCommL1)
  #define hCommPL         _ENTITY_PREFIXED(hCommPL)
  #define hCommDL         _ENTITY_PREFIXED(hCommDL)
  #define hCommRR         _ENTITY_PREFIXED(hCommRR)
  #define hCommMMI        _ENTITY_PREFIXED(hCommMMI)
  #define hCommCST        _ENTITY_PREFIXED(hCommCST)
#ifdef GPRS
  #define hCommGPL        _ENTITY_PREFIXED(hCommGPL)
#endif /* #ifdef GPRS */
#endif

EXTERN T_HANDLE  hCommPL;              /* PL   own handle          */
EXTERN T_HANDLE  hCommL1;              /* L1   Communication       */
EXTERN T_HANDLE  hCommDL;              /* DL   Communication       */
EXTERN T_HANDLE  hCommRR;              /* RR   Communication       */
EXTERN T_HANDLE  hCommMMI;             /* MMI  Communication       */
EXTERN T_HANDLE  hCommCST;             /* CST  Communication       */
#ifdef GPRS
EXTERN T_HANDLE  hCommGPL;             /* GPL  Communication       */
#endif /* GPRS */
EXTERN T_HANDLE  pl_handle;

EXTERN UBYTE          v_mon_counter_idle;
EXTERN UBYTE          v_mon_counter_dedi;
EXTERN UBYTE          v_eotd;

#if defined(DL_TRACE_ENABLED)
  EXTERN void dl_trace                   (UCHAR                    trace_type,
                                          UCHAR                    channel,
                                          UCHAR                    ch_type,
                                          UCHAR                  * data);
  #ifdef OPTION_MULTITHREAD
    #define dl_trace_buf    _ENTITY_PREFIXED(dl_trace_buf)
  #endif
  #if defined(ALR_MAIN_C)
    GLOBAL char dl_trace_buf[100];
  #else  /* ALR_MAIN_C */
    EXTERN char dl_trace_buf[100];
  #endif  /* ALR_MAIN_C */
  #define TRACE_PL_EVENT   4
  #define DOES_NOT_MATTER  0
  #define DL_OFFLINE_TRACE(s) \
    dl_trace (TRACE_PL_EVENT, DOES_NOT_MATTER, DOES_NOT_MATTER, (UCHAR*)s)
#else  /* DL_TRACE_ENABLED */
  #define DL_OFFLINE_TRACE(s)
#endif  /* DL_TRACE_ENABLED */

#if !defined(NCONFIG) && !defined(NTRACE) && defined(TRACE_STATE_TRANSITION)
void trc_state_transition(int line, UBYTE newstate);
#else
#define trc_state_transition(line,newstate)
#endif  /* !NCONFIG && !NTRACE && TRACE_STATE_TRANSITION */

#if defined(_SIMULATION_)
#define TRACING
#define TRACE_EVENT_WIN(s)                                TRACE_EVENT(s)
#define TRACE_EVENT_WIN_P1(s,a1)                          TRACE_EVENT_P1(s,a1)
#define TRACE_EVENT_WIN_P2(s,a1,a2)                       TRACE_EVENT_P2(s,a1,a2)
#define TRACE_EVENT_WIN_P3(s,a1,a2,a3)                    TRACE_EVENT_P3(s,a1,a2,a3)
#define TRACE_EVENT_WIN_P4(s,a1,a2,a3,a4)                 TRACE_EVENT_P4(s,a1,a2,a3,a4)
#define TRACE_EVENT_WIN_P5(s,a1,a2,a3,a4,a5)              TRACE_EVENT_P5(s,a1,a2,a3,a4,a5)
#define TRACE_EVENT_WIN_P6(s,a1,a2,a3,a4,a5,a6)           TRACE_EVENT_P6(s,a1,a2,a3,a4,a5,a6)
#define TRACE_EVENT_WIN_P7(s,a1,a2,a3,a4,a5,a6,a7)        TRACE_EVENT_P7(s,a1,a2,a3,a4,a5,a6,a7)
#define TRACE_EVENT_WIN_P8(s,a1,a2,a3,a4,a5,a6,a7,a8)     TRACE_EVENT_P8(s,a1,a2,a3,a4,a5,a6,a7,a8)
#define TRACE_EVENT_WIN_P9(s,a1,a2,a3,a4,a5,a6,a7,a8,a9)  TRACE_EVENT_P9(s,a1,a2,a3,a4,a5,a6,a7,a8,a9)
#else  /* _SIMULATION_ */
#define TRACE_EVENT_WIN(s)
#define TRACE_EVENT_WIN_P1(s,a1)
#define TRACE_EVENT_WIN_P2(s,a1,a2)
#define TRACE_EVENT_WIN_P3(s,a1,a2,a3)
#define TRACE_EVENT_WIN_P4(s,a1,a2,a3,a4)
#define TRACE_EVENT_WIN_P5(s,a1,a2,a3,a4,a5)
#define TRACE_EVENT_WIN_P6(s,a1,a2,a3,a4,a5,a6)
#define TRACE_EVENT_WIN_P7(s,a1,a2,a3,a4,a5,a6,a7)
#define TRACE_EVENT_WIN_P8(s,a1,a2,a3,a4,a5,a6,a7,a8)
#define TRACE_EVENT_WIN_P9(s,a1,a2,a3,a4,a5,a6,a7,a8,a9)
#endif  /* _SIMULATION_ */

#if defined TRACING
#define ALR_TRACE(a) vsi_o_ttrace(VSI_CALLER TC_EVENT,a);
#else
#define ALR_TRACE(a)
#endif  /* TRACING */

#define TNNN_WITH_TIMER

/*
#define ALR_TRACE_ENABLED
*/
#if defined(ALR_TRACE_ENABLED)
  void alr_trc_init (void);
  void alr_trc_exit (void);
  void alr_trc_store (UCHAR event, UCHAR channel, UCHAR state, void* l2_data);
  void alr_trc_read_all (void);
  void alr_trc_read (int count);
#else  /* ALR_TRACE_ENABLED */
#define alr_trc_init()
#define alr_trc_exit()
#define alr_trc_store(e,c,s,p)
#define alr_trc_read(c)
#define alr_trc_read_all()
#endif  /* ALR_TRACE_ENABLED */

/*
 * ALR TRACE defines
 */
#define ALR_TRC_UPLINK        0
#define ALR_TRC_DOWNLINK      1
#define ALR_TRC_EVENT         2
#define ALR_TRC_STRING        3

#define ALR_TRC_CH_UNDEF      0
#define ALR_TRC_CH_FACCH_FR   1
#define ALR_TRC_CH_FACCH_HR   2
#define ALR_TRC_CH_SDCCH4     3
#define ALR_TRC_CH_SDCCH8     4
#define ALR_TRC_CH_SACCH      5
#define ALR_TRC_CH_UNKNOWN    6

#define ALR_TRC_DATA_SIZE     40

#define ALR_RXLEV_AVERAGE_MIN 0
#define ALR_RXLEV_AVERAGE_LWR_THR 4

#endif  /* ALR_H */