FreeCalypso > hg > fc-magnetite
diff src/g23m-gsm/rr/rr_csf.c @ 104:27a4235405c6
src/g23m-gsm: import from LoCosto source
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 04 Oct 2016 18:24:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gsm/rr/rr_csf.c Tue Oct 04 18:24:05 2016 +0000 @@ -0,0 +1,2935 @@ +/* ++----------------------------------------------------------------------------- +| Project : +| Modul : ++----------------------------------------------------------------------------- +| Copyright 2002 Texas Instruments Berlin, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| The receipt of or possession of this file does not convey +| any rights to reproduce or disclose its contents or to +| manufacture, use, or sell anything it may describe, in +| whole, or in part, without the specific written consent of +| Texas Instruments Berlin, AG. ++----------------------------------------------------------------------------- +| Purpose : This module defines the custom specific functions +| for the component RR of the mobile station ++----------------------------------------------------------------------------- +*/ + +#ifndef RR_CSF_C +#define RR_CSF_C + +#define ENTITY_RR +#define SAP_ACI + +/*==== INCLUDES ===================================================*/ + +#include <string.h> +#include <stdlib.h> +#include <stddef.h> /* offsetof */ +#include "typedefs.h" +#include "pcm.h" +#include "pconst.cdg" +#include "mconst.cdg" +#include "message.h" +#include "ccdapi.h" +#include "vsi.h" +#include "custom.h" +#include "gsm.h" +#include "prim.h" +#include "cnf_rr.h" +#include "tok.h" +#include "rr.h" +#include "cl_imei.h" /* IMEI common library */ +#if defined(_SIMULATION_FFS_) +#include "ffs/ffs.h" +#include "ffs_coat.h" +#endif /* _SIMULATION_FFS_ */ + +/*==== EXPORT =====================================================*/ + +/*==== PRIVAT =====================================================*/ +#if defined(_SIMULATION_FFS_) +LOCAL BOOL rr_csf_handle_ffs_read_result(T_FFS_SIZE status_read); +LOCAL BOOL rr_csf_handle_ffs_write_result(T_FFS_RET status_write); +LOCAL void rr_csf_check_ffs_dirs( void ); +LOCAL void rr_csf_create_ffs_dirs(const char *dir_name); +#endif /* _SIMULATION_FFS_ */ + + + +/*==== VARIABLES ==================================================*/ +/* Cell selection improvements LLD section 4.1.1.1 */ +#if defined(_SIMULATION_) +T_LIST win_black_list[MAX_REGIONS]; /* Simulates FFS for "Black List" */ +T_CS_WHITE_LIST win_white_list; /* Simulates FFS for "White List */ + +/*Simulates FFS for lower rxlevel thresholds*/ +UBYTE win_lower_rxlev_thr[MAX_NUM_BANDS] = { LOWER_RXLEV_THRESHOLD_850, LOWER_RXLEV_THRESHOLD, \ + LOWER_RXLEV_THRESHOLD, LOWER_RXLEV_THRESHOLD, LOWER_RXLEV_THRESHOLD }; + /*Simulates FFS for medium rxlevel thresholds*/ +UBYTE win_medium_rxlev_thr[MAX_NUM_BANDS] = { MEDIUM_RXLEV_THRESHOLD, MEDIUM_RXLEV_THRESHOLD, \ + MEDIUM_RXLEV_THRESHOLD, MEDIUM_RXLEV_THRESHOLD, MEDIUM_RXLEV_THRESHOLD }; +/*Simulates FFS for upper rxlevel thresholds*/ +UBYTE win_upper_rxlev_thr[MAX_NUM_BANDS] = { UPPER_RXLEV_THRESHOLD, UPPER_RXLEV_THRESHOLD, \ + UPPER_RXLEV_THRESHOLD, UPPER_RXLEV_THRESHOLD, UPPER_RXLEV_THRESHOLD }; + /* Initialize the simulated rxlevel thresholds here itself */ +#endif + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_read_imei | ++--------------------------------------------------------------------+ + + PURPOSE : The function reads the International mobile identity number + from the non-volantile memory into an internal data structure. + +*/ + +GLOBAL void rr_csf_read_imei (T_mob_ident *imei) +{ + UBYTE buf[CL_IMEI_SIZE]; + + TRACE_FUNCTION ("rr_csf_read_imei()"); + + imei->v_ident_dig = TRUE; + imei->v_tmsi_1 = FALSE; + imei->ident_type = 3; /* set to TYPE_IMEISV */ + imei->c_ident_dig = 16; + imei->odd_even = 0; + + /* Get IMEISV from IMEI common library */ + cl_get_imeisv(CL_IMEI_SIZE, buf, CL_IMEI_GET_SECURE_IMEI); + + /* copy digits */ + imei->ident_dig[0] = (buf [0] >> 4) & 0x0F; /* TAC 8 byte */ + imei->ident_dig[1] = buf [0] & 0x0F; + imei->ident_dig[2] = (buf [1] >> 4) & 0x0F; + imei->ident_dig[3] = buf [1] & 0x0F; + imei->ident_dig[4] = (buf [2] >> 4) & 0x0F; + imei->ident_dig[5] = buf [2] & 0x0F; + imei->ident_dig[6] = (buf [3] >> 4) & 0x0F; + imei->ident_dig[7] = buf [3] & 0x0F; + imei->ident_dig[8] = (buf [4] >> 4) & 0x0F; /* SNR 6 byte */ + imei->ident_dig[9] = buf [4] & 0x0F; + imei->ident_dig[10]= (buf [5] >> 4) & 0x0F; + imei->ident_dig[11]= buf [5] & 0x0F; + imei->ident_dig[12]= (buf [6] >> 4) & 0x0F; + imei->ident_dig[13]= buf [6] & 0x0F; + imei->ident_dig[14]= (buf [7] >> 4) & 0x0F; /* SV 2 byte */ + imei->ident_dig[15]= buf [7] & 0x0F; + + TRACE_EVENT_P8("RR INFO IMEI: TAC %1x%1x%1x%1x%1x%1x%1x%1x", + imei->ident_dig[0], imei->ident_dig[1], imei->ident_dig[2], + imei->ident_dig[3], imei->ident_dig[4], imei->ident_dig[5], + imei->ident_dig[6], imei->ident_dig[7]); + TRACE_EVENT_P6("RR INFO IMEI: SNR %1x%1x%1x%1x%1x%1x", + imei->ident_dig[8], imei->ident_dig[9], imei->ident_dig[10], + imei->ident_dig[11], imei->ident_dig[12], imei->ident_dig[13]); + TRACE_EVENT_P2("RR INFO IMEI: SV %1x%1x", imei->ident_dig[14], + imei->ident_dig[15]); +} + +#if !defined(NTRACE) +GLOBAL void rr_csf_trace_power (void) +{ + GET_INSTANCE_DATA; + UBYTE setbands = rr_data->ms_data.rf_cap.setbands; + UBYTE bands = rr_data->ms_data.rf_cap.bands; + UBYTE stdbands; + + if (setbands EQ 0) + { + setbands = bands; /* auto detection, use all supported bands */ + } + else + setbands &= bands;/* bands set, use only supported bands */ + + /* bands which might be supported with current std */ + stdbands = std_bands[std-1]; + + TRACE_EVENT_P5 ("std=%d(%02x), (set)bands=%02x(%02x)->%02x", + std, stdbands, rr_data->ms_data.rf_cap.setbands, + rr_data->ms_data.rf_cap.bands, setbands); + TRACE_EVENT_P6 ("%sGSM 900: power class=%u %s,%s%s%s", + (bands&0x08)?"E":" ", + rr_data->ms_data.rf_cap.rf_power.pow_class4[IDX_PWRCLASS_900].pow_class, + (bands&0x09)?"rfcap":" ", + (stdbands&0x09)?"std":" ", + (setbands&0x09)?",supported":"", + ((setbands&0x09) AND (setbands&0x09) EQ 0x01)?" (only GSM)":""); + TRACE_EVENT_P4 ("DCS 1800: power class=%u %s,%s%s", + rr_data->ms_data.rf_cap.rf_power.pow_class4[IDX_PWRCLASS_1800].pow_class, + (bands&0x02)?"rfcap":" ", + (stdbands&0x02)?"std":" ", + (setbands&0x02)?",supported":""); + TRACE_EVENT_P4 ("PCS 1900: power class=%u %s,%s%s", + rr_data->ms_data.rf_cap.rf_power.pow_class4[IDX_PWRCLASS_1900].pow_class, + (bands&0x04)?"rfcap":" ", + (stdbands&0x04)?"std":" ", + (setbands&0x04)?",supported":""); + TRACE_EVENT_P4 ("GSM 850: power class=%u %s,%s%s", + rr_data->ms_data.rf_cap.rf_power.pow_class4[IDX_PWRCLASS_850].pow_class, + (bands&0x10)?"rfcap":" ", + (stdbands&0x10)?"std":" ", + (setbands&0x10)?",supported":""); + TRACE_EVENT_P4 ("GSM 400: power class=%u %s,%s%s", + rr_data->ms_data.rf_cap.rf_power.pow_class4[IDX_PWRCLASS_400].pow_class, + (bands&0x60)?"rfcap":" ", + (stdbands&0x60)?"std":" ", + (setbands&0x60)?",supported":""); + TRACE_EVENT_P1 ("GPRS multislot class =%u", + rr_data->ms_data.rf_cap.rf_ms.gprs_ms_class); +} +#endif /* !NTRACE */ + +#if defined(_SIMULATION_) && !defined(NTRACE) +#define TRACE_STRUCT(struct_member) TRACE_EVENT_P1("0x%02x " #struct_member , *((unsigned int*)&struct_member)) + +LOCAL void rr_csf_trace_class1 (T_mob_class_1* cm1) +{ + TRACE_STRUCT (cm1->rev_lev); + TRACE_STRUCT (cm1->es_ind); + TRACE_STRUCT (cm1->a5_1); + TRACE_STRUCT (cm1->rf_pow_cap); +} + +LOCAL void rr_csf_trace_class2 (T_mob_class_2* cm2) +{ + TRACE_STRUCT (cm2->rev_lev); + TRACE_STRUCT (cm2->es_ind); + TRACE_STRUCT (cm2->a5_1); + TRACE_STRUCT (cm2->rf_pow_cap); + TRACE_STRUCT (cm2->ps); + TRACE_STRUCT (cm2->ss_screen); + TRACE_STRUCT (cm2->mt_pp_sms); + TRACE_STRUCT (cm2->vbs); + TRACE_STRUCT (cm2->vgcs); + TRACE_STRUCT (cm2->egsm); + TRACE_STRUCT (cm2->class3); + TRACE_STRUCT (cm2->lcsva); + TRACE_STRUCT (cm2->ucs2_treat); + TRACE_STRUCT (cm2->solsa); + TRACE_STRUCT (cm2->cmsp); + TRACE_STRUCT (cm2->a5_3); + TRACE_STRUCT (cm2->a5_2); +} + +LOCAL void rr_csf_trace_class3 (T_mob_class_3* cm3) +{ + TRACE_STRUCT (cm3->mb_value); + TRACE_STRUCT (cm3->a5_7); + TRACE_STRUCT (cm3->a5_6); + TRACE_STRUCT (cm3->a5_5); + TRACE_STRUCT (cm3->a5_4); + if (cm3->v_radio_cap_2) + { + TRACE_STRUCT (cm3->radio_cap_2); + } + if (cm3->v_radio_cap_1) + { + TRACE_STRUCT (cm3->radio_cap_1); + } + if (cm3->v_rgsm_class) + { + TRACE_STRUCT (cm3->rgsm_class); + } + if (cm3->v_ms_class) + { + TRACE_STRUCT (cm3->ms_class); + } + + TRACE_STRUCT (cm3->ucs2_treat); + TRACE_STRUCT (cm3->ext_meas); + if (cm3->v_measurement) + { + TRACE_STRUCT (cm3->measurement); + } + if (cm3->v_pos_method) + { + TRACE_STRUCT (cm3->pos_method); + } + if (cm3->v_edge_ms_class) + { + TRACE_STRUCT (cm3->edge_ms_class); + } + if (cm3->v_egde_struct) + { + TRACE_STRUCT (cm3->egde_struct.mod); + if (cm3->egde_struct.v_egde_pow1) + { + TRACE_STRUCT (cm3->egde_struct.egde_pow1); + } + if (cm3->egde_struct.v_egde_pow2) + { + TRACE_STRUCT (cm3->egde_struct.egde_pow2); + } + } +#ifdef REL99 + if (cm3->v_gsm400_struct) + { + TRACE_STRUCT (cm3->gsm400_struct.gsm400_supp); + TRACE_STRUCT (cm3->gsm400_struct.gsm400_cap); + } +#endif + if (cm3->v_gsm850_cap) + { + TRACE_STRUCT (cm3->gsm850_cap); + } + if (cm3->v_pcs1900_cap) + { + TRACE_STRUCT (cm3->pcs1900_cap); + } +#ifdef REL99 + TRACE_STRUCT (cm3->umts_fdd); + TRACE_STRUCT (cm3->umts_tdd); + TRACE_STRUCT (cm3->cdma2000); +#endif + if (cm3->v_dtm_ms) + { + TRACE_STRUCT (cm3->dtm_ms.dtm_g_ms_class); + TRACE_STRUCT (cm3->dtm_ms.mac_support); + if (cm3->dtm_ms.v_dtm_e_ms_class) + { + TRACE_STRUCT (cm3->dtm_ms.dtm_e_ms_class); + } + } + if (cm3->v_single_band) + { + TRACE_STRUCT (cm3->single_band); + } +} +#endif /* _SIMULATION_ && !NTRACE */ + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_ms_cap | ++--------------------------------------------------------------------+ + + PURPOSE : Read the mobile station capabilities from a non-volantile + memory into an internal data structure. + +*/ +#if !defined(NTRACE) +#define RFCAP_TEST +#endif /* !NTRACE */ + +GLOBAL void rr_csf_ms_cap (void) +{ + GET_INSTANCE_DATA; + drv_Return_Type pcm_ret; + UBYTE version; + + TRACE_FUNCTION ("rr_csf_ms_cap()"); + + pcm_ret = pcm_ReadFile ((UBYTE *)EF_MSCAP_ID, SIZE_EF_MSCAP, + (UBYTE *)&rr_data->mscap, &version); + if(pcm_ret NEQ PCM_OK ) + { + TRACE_ERROR( "MS RF capability (EF_MSCAP_ID) -> PCM read error" ); + } +#if defined(RFCAP_TEST) + else + { + TRACE_ARRAY ((UBYTE*)&rr_data->mscap, SIZE_EF_MSCAP, "EF_MSCAP_ID"); + } +#endif /* RFCAP_TEST */ +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_read_rf_cap | ++--------------------------------------------------------------------+ + + PURPOSE : Read the mobile station capabilities from a non-volantile + memory into an internal data structure. + +*/ +GLOBAL void rr_csf_read_rfcap (void) +{ + GET_INSTANCE_DATA; +#define FldSetEx(f,n,v) (f|=((((ULONG)f)&(~((ULONG)n##m)))|(((ULONG)v)<<n##s))) + + EF_RFCAP rfcap_stream; + BYTE ccd_ret; + UBYTE version; +#if !defined(_SIMULATION_) + unsigned int ffs_ret; +#else + drv_Return_Type pcm_ret; +#endif /* _TMS470 */ + UBYTE gprs_ms, cmsp; + + TRACE_FUNCTION ("rr_csf_read_rfcap()"); + + /* save configured GPRS multislot class */ + gprs_ms = rr_data->ms_data.rf_cap.rf_ms.gprs_ms_class; + /* save configured CMSP bit */ + cmsp = rr_data->ms_data.rf_cap.cmsp; + +#if !defined(_SIMULATION_) + ffs_ret = FFS_fread("/gsm/com/rfcap", (UBYTE *)&rfcap_stream, sizeof(EF_RFCAP)); + if (ffs_ret EQ sizeof(EF_RFCAP)) + version = TRUE; + else + version = FALSE; +#else + pcm_ret = pcm_ReadFile ((UBYTE *)EF_RFCAP_ID, SIZE_EF_RFCAP, + (UBYTE *)&rfcap_stream, &version); + if(pcm_ret EQ PCM_OK ) + version = TRUE; + else + version = FALSE; +#endif +#define RFCAP_DEFAULT /* G23M/RR-ENH-9401 */ +#if !defined(RFCAP_DEFAULT) + if (!version) + { + TRACE_ERROR ("MS RF capability (rfcap) -> FFS read error. Reset will follow ..."); + /* + * the following delay is made on the target for reasons highlighted with + * issue 7510: some customers do during their production the download of the + * configuration to the flash whilst the target ist running; another reason is + * that the target is not accessable (e.g. via PTCM) during resets; thus + * the delay is present to allow that writing of config data is not disturbed + * by the reset + */ +#if !defined(_SIMULATION_) + TRACE_ERROR ("... in some seconds; download config data to flash please!"); + vsi_t_sleep(VSI_CALLER DELAY_RESET_NO_CONFIG_DATA); +#endif + assert (FALSE); + } +#else /* !RFCAP_DEFAULT */ + if (!version) + { +/* Implements Measure#32: Row 150 */ + + /* error output via trace interface */ + TRACE_ERROR( "MS RF capability (RFCAP) -> FFS/PCM read error: use default values instead"); + +#ifdef TI_PS_CUSTOM_RFCAP_DEFAULT + /* Update with the Custom defined default RF capabilities */ + memcpy(&rfcap_stream, custom_rfcap_default, SIZE_EF_RFCAP); + TRACE_EVENT_P2("Using Custom RFCAP values: Set_bands=%d, Freq_bands=%d", rfcap_stream.setbands, rfcap_stream.bands); + #ifndef FF_L23_A5_3 + FldSetEx (rfcap_stream.encryption, rfCap_A5_3, NO); + #endif +#else + + memset (&rfcap_stream, 0, SIZE_EF_RFCAP); + + /* default frequency bands */ + rfcap_stream.setbands = BAND_AUTO; + rfcap_stream.bands = BAND_GSM_900|BAND_E_GSM|BAND_DCS_1800|BAND_PCS_1900|BAND_GSM_850; + + /* power classes */ + FldSetEx (rfcap_stream.power1, rfCap_900, POWER_CLASS_4); + FldSetEx (rfcap_stream.power1, rfCap_1800, POWER_CLASS_1); + FldSetEx (rfcap_stream.power2, rfCap_1900, POWER_CLASS_1); + FldSetEx (rfcap_stream.power2, rfCap_850, POWER_CLASS_4); + + /* multi slot classes */ + FldSetEx (rfcap_stream.msGPRS, rfCap_MSC, MSLOT_CLASS_10); + + /* classmark 2 capabilities */ + FldSetEx (rfcap_stream.capability1, rfCap_esind, YES); + FldSetEx (rfcap_stream.capability2, rfCap_vgcs, NOT_SUPPORTED); + FldSetEx (rfcap_stream.capability2, rfCap_vbs, NOT_SUPPORTED); + FldSetEx (rfcap_stream.capability1, rfCap_ppsms, SUPPORTED); + FldSetEx (rfcap_stream.capability2, rfCap_ssc, SS_SCREEN_PHASE_2); + FldSetEx (rfcap_stream.capability1, rfCap_ps, NOT_SUPPORTED); + FldSetEx (rfcap_stream.capability1, rfCap_cmsp, SUPPORTED); + FldSetEx (rfcap_stream.capability1, rfCap_solsa, NOT_SUPPORTED); + FldSetEx (rfcap_stream.capability2, rfCap_usc2, SUPPORTED); + FldSetEx (rfcap_stream.capability1, rfCap_lcsva, NOT_SUPPORTED); + + /* classmark 3 capabilities */ + FldSetEx (rfcap_stream.capability2, rfCap_extmeas, NOT_SUPPORTED); + FldSetEx (rfcap_stream.capability2, rfCap_meas, NO); + FldSetEx (rfcap_stream.switchmeasure, rfCap_smst, SM_1); + FldSetEx (rfcap_stream.switchmeasure, rfCap_smt, SM_1); + + /* encryption algorithm */ + /* + * note inverse logic for the A5/1 encryption algorithm between + * classmark 1 and 2 on the one hand and radio access capability + * on the other hand + */ + FldSetEx (rfcap_stream.encryption, rfCap_A5_1, YES); + FldSetEx (rfcap_stream.encryption, rfCap_A5_2, NO); + #ifdef FF_L23_A5_3 + FldSetEx (rfcap_stream.encryption, rfCap_A5_3, YES); + #else + FldSetEx (rfcap_stream.encryption, rfCap_A5_3, NO); + #endif + FldSetEx (rfcap_stream.encryption, rfCap_A5_4, NO); + FldSetEx (rfcap_stream.encryption, rfCap_A5_5, NO); + FldSetEx (rfcap_stream.encryption, rfCap_A5_6, NO); + FldSetEx (rfcap_stream.encryption, rfCap_A5_7, NO); +#endif /* TI_PS_CUSTOM_RFCAP_DEFAULT */ + } +#endif /* !RFCAP_DEFAULT */ + + /* E-GSM includes P-GSM */ + if (FldGet (rfcap_stream.bands, rf_EGSM)) + { + FldSetEx (rfcap_stream.bands, rf_900, SUPPORTED); + } + +#if defined(RFCAP_TEST) + TRACE_ARRAY ((UBYTE*)&rfcap_stream, SIZE_EF_RFCAP, "rfcap_stream"); +#endif /* RFCAP_TEST */ + + {/* decode stream into c struct */ + #define DECODE_TMP MS_RF_CAPABILITY + typedef struct + { + U32 dummy; /*< 0: 4> */ + T_sdu sdu; /*< 4: ? > Service Data Unit */ + } T_DECODE_TMP; + T_MS_RF_CAPABILITY *ms_rf_cap; + USHORT off; + PALLOC_SDU (encode, DECODE_TMP, (SIZE_EF_RFCAP + 1 ) * BITS_PER_BYTE); + MALLOC (ms_rf_cap, sizeof (T_MS_RF_CAPABILITY)); + + /* The dummy field is needed to make the structure compatible for * + * the CCD. We need to initialise it to keep LINT happy */ + encode->dummy = 0x00; + + off = (USHORT)(encode->sdu.o_buf / BITS_PER_BYTE); + memcpy ( &encode->sdu.buf[off+1], &rfcap_stream, SIZE_EF_RFCAP); + encode->sdu.buf[off] = MS_RF_CAPABILITY; + + memset (ms_rf_cap, 0, sizeof (T_MS_RF_CAPABILITY)); + ccd_ret = ccd_decodeMsg(CCDENT_RR_COM, DOWNLINK, + (T_MSGBUF *)&encode->sdu, (UBYTE *)ms_rf_cap, + 0xFF); + rr_data->ms_data.rf_cap = ms_rf_cap->rf_cap; /* Struct copy */ + MFREE (ms_rf_cap); + PFREE (encode); + } + + /* restore configured GPRS multislot class */ + if (rr_data->ms_data.multislot_class_configured) + { + rr_data->ms_data.rf_cap.rf_ms.gprs_ms_class = gprs_ms; + TRACE_EVENT_P1 ("'gprs_ms_class' configured to a value of %d (overwrite of rfcap)", gprs_ms); + } + + /* restore configured CMSP bit */ + if (rr_data->ms_data.cmsp_configured) + { + rr_data->ms_data.rf_cap.cmsp = cmsp; + TRACE_EVENT_P1 ("'cmsp' configured to a value of %d (overwrite of rfcap)", cmsp); + } + + + +#if defined(RFCAP_TEST) + if (ccd_ret NEQ ccdOK) + { + /* + * CCD has detected an error + */ + UBYTE first_err; + USHORT parlist [6]; +/* Implements Measure#32: Row 152...165 */ + + TRACE_EVENT_P1 ("ccd_decodeMsg(): %02x", ccd_ret); + /* + * get the first error + */ + first_err = ccd_getFirstError (CCDENT_RR, parlist); + + /* + * Error Handling + */ + do + { +/* Implements Measure#32: Row 152...165 */ + switch (first_err) + { + case ERR_NO_MORE_ERROR: + TRACE_EVENT_P1("%u the end of the error list is reached", first_err); + break; + case ERR_INVALID_CALC: + TRACE_EVENT_P1("%u calculation of the element repeat value failed", first_err); + break; + case ERR_PATTERN_MISMATCH: + TRACE_EVENT_P1("%u a bit pattern was not expected", first_err); + break; + case ERR_COMPREH_REQUIRED: + TRACE_EVENT_P1("%u check for comprehension required failed", first_err); + break; + case ERR_IE_NOT_EXPECTED: + TRACE_EVENT_P1("%u an information element was not expected", first_err); + break; + case ERR_IE_SEQUENCE: + TRACE_EVENT_P1("%u wrong sequence of information elements", first_err); + break; + case ERR_MAX_IE_EXCEED: + TRACE_EVENT_P1("%u maximum amount of repeatable information elements has exceeded", first_err); + break; + case ERR_MAX_REPEAT: + TRACE_EVENT_P1("%u a repeatable element occurs too often in the message", first_err); + break; + case ERR_MAND_ELEM_MISS: + TRACE_EVENT_P1("%u a mandatory information element is missing", first_err); + break; + case ERR_INVALID_MID: + TRACE_EVENT_P1("%u the message ID is not correct", first_err); + break; + case ERR_INVALID_TYPE: + TRACE_EVENT_P1("%u the information element is not a spare padding", first_err); + break; + case ERR_EOC_TAG_MISSING: + TRACE_EVENT_P1("%u indefinite length is specified for the ASN.1-BER but the end tag is missing", first_err); + break; + case ERR_INTERNAL_ERROR: + TRACE_EVENT_P1("%u an internal CCD error occured ", first_err); + break; + default: + TRACE_EVENT_P1("%u unknown error", first_err); + break; + } + first_err = ccd_getNextError (CCDENT_RR, parlist); + }while (first_err); + + } + +#if 0 + if (ccd_ret < ccdError) + { + rr_csf_trace_power (); + } +#endif /* 0|1 */ +#endif /* RFCAP_TEST */ +} + +GLOBAL void rr_csf_get_freq_bands (UBYTE *pfreq_bands) +{ + GET_INSTANCE_DATA; + T_rf_cap *rfc = &rr_data->ms_data.rf_cap; + +#if defined(_SIMULATION_) + rr_csf_check_rfcap (FALSE); +#endif /* _SIMULATION_ */ + + if (rfc->setbands EQ BAND_AUTO) + *pfreq_bands = rfc->bands; + else + *pfreq_bands = rfc->setbands & rfc->bands; +#if !defined(NTRACE) + rr_csf_trace_power (); +#endif /* !NTRACE */ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_get_classmark1 | ++--------------------------------------------------------------------+ + + PURPOSE : fills c structure of the mobile station classmark 1 + information element; returns 0 if OK. + +*/ +/*lint -esym(765,rr_csf_get_classmark1) | used by MM*/ +/*lint -esym(714,rr_csf_get_classmark1) | used by MM */ +GLOBAL UBYTE rr_csf_get_classmark1 (T_mob_class_1 *mob_class_1) +{ + GET_INSTANCE_DATA; + TRACE_FUNCTION ("rr_csf_get_classmark1()"); + +#if defined(_SIMULATION_) + rr_csf_check_rfcap (FALSE); +#endif /* _SIMULATION_ */ + + *mob_class_1 = rr_data->ms_data.classmark1; + +#if defined(_SIMULATION_) && !defined(NTRACE) + rr_csf_trace_class1 (mob_class_1); +#endif /* _SIMULATION_ && !NTRACE */ + return 0;/* no error */ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_get_classmark2 | ++--------------------------------------------------------------------+ + + PURPOSE : fills c structure of the mobile station classmark 2 + information element; returns 0 if OK. + +*/ +/*lint -esym(765,rr_csf_get_classmark2) | used by CC,MM */ +/*lint -esym(714,rr_csf_get_classmark2) | used by CC,MM */ +GLOBAL UBYTE rr_csf_get_classmark2 (T_mob_class_2 *mob_class_2) +{ + GET_INSTANCE_DATA; + TRACE_FUNCTION ("rr_csf_get_classmark2()"); + +#if defined(_SIMULATION_) + rr_csf_check_rfcap (FALSE); +#endif /* _SIMULATION_ */ + + *mob_class_2 = rr_data->ms_data.classmark2; + +#if defined(_SIMULATION_) && !defined(NTRACE) + rr_csf_trace_class2 (mob_class_2); +#endif /* _SIMULATION_ && !NTRACE */ + return 0;/* no error */ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_get_classmark3 | ++--------------------------------------------------------------------+ + + PURPOSE : fills c structure of the mobile station classmark 3 + information element; returns 0 if OK. + +*/ +#if 0 +GLOBAL UBYTE rr_csf_get_classmark3 (T_mob_class_3 *mob_class_3) +{ + TRACE_FUNCTION ("rr_csf_get_classmark3()"); + +#if defined(_SIMULATION_) + rr_csf_check_rfcap (FALSE); +#endif /* _SIMULATION_ */ + + *mob_class_3 = rr_data->ms_data.classmark3; + +#if defined(_SIMULATION_) && !defined(NTRACE) + rr_csf_trace_class3 (mob_class_3); +#endif /* _SIMULATION_ && !NTRACE */ + return 0;/* no error */ +} +#endif + +#ifdef GPRS +/* fills c structure of the mobile station radio access capability information element; returns 0 if OK */ +/*lint -esym(765,rr_csf_get_radio_access_capability) | used by GMM,GRR */ +/*lint -esym(714,rr_csf_get_radio_access_capability) | used by GMM,GRR */ +GLOBAL UBYTE rr_csf_get_radio_access_capability (T_ra_cap *ra_cap) +{ + GET_INSTANCE_DATA; + TRACE_FUNCTION ("rr_csf_get_radio_access_capability()"); + +#if defined(_SIMULATION_) + rr_csf_check_rfcap (FALSE); +#endif /* _SIMULATION_ */ + + *ra_cap = rr_data->ms_data.ra_cap; + return 0; +} +#endif + +/* get pointer to mobile station RF capability c structure; returns NULL on error */ +/*lint -esym(765,rr_csf_get_rf_capability) | used by GRR */ +/*lint -esym(714,rr_csf_get_rf_capability) | used by GRR */ +GLOBAL T_rf_cap* rr_csf_get_rf_capability (void) +{ + GET_INSTANCE_DATA; +#if defined(_SIMULATION_) + rr_csf_check_rfcap (FALSE); +#endif /* _SIMULATION_ */ + + return &rr_data->ms_data.rf_cap; +} + +GLOBAL void rr_csf_check_rfcap (UBYTE init) +{ + GET_INSTANCE_DATA; + TRACE_FUNCTION ("rr_csf_check_rfcap()"); + + if (init OR (rr_data->ms_data.rf_cap.bands EQ 0)) + { + rr_csf_read_rfcap (); + rr_csf_fit_capability (); + } +} + + +#ifndef REL99 + +#define RAC_RELEASE97 +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_fit_capability | ++--------------------------------------------------------------------+ + + PURPOSE : fit classmark 2 and 3 and radio access capabilities + depend on the value of 'std' and the readed values of + /gsm/com/rfcap file according to R99 specifications +*/ + +GLOBAL UBYTE rr_csf_fit_capability (void) +{ + GET_INSTANCE_DATA; + USHORT serving_cell; + T_rf_cap *rfc = &rr_data->ms_data.rf_cap; +#ifdef GPRS + T_ra_cap *rac = &rr_data->ms_data.ra_cap; +#endif + T_mob_class_1 *cm1 = &rr_data->ms_data.classmark1; + T_mob_class_2 *cm2 = &rr_data->ms_data.classmark2; + T_mob_class_3 *cm3 = &rr_data->ms_data.classmark3; + + TRACE_FUNCTION ("rr_csf_fit_capability()"); + + if (rr_data->nc_data[SC_INDEX].bcch_status NEQ EMPTY) + serving_cell = rr_data->nc_data[SC_INDEX].arfcn; + else + serving_cell = (USHORT)-1; + + memset (cm2, 0, sizeof(T_mob_class_2)); + memset (cm3, 0, sizeof(T_mob_class_3)); +#ifdef GPRS + memset (rac, 0, sizeof(T_ra_cap)); +#endif + + cm1->rev_lev = cm2->rev_lev = REV_LEV_PHASE_2; /* PHASE_1 | PHASE_2 | R99_SUPPORT */ +#ifdef GPRS +#if !defined(RAC_RELEASE97) + rac->acc_cap.rev99 = REV_LEV_PHASE_1; /* PHASE_1 | RELEASE99 */ +#endif /* !RAC_RELEASE97 */ +#endif + cm1->es_ind = cm2->es_ind = rfc->es_ind; + cm2->ps = rfc->ps; + cm2->ss_screen = rfc->ss_screen; + cm2->mt_pp_sms = rfc->mt_pp_sms; + cm2->vbs = rfc->vbs; + cm2->vgcs = rfc->vgcs; + cm2->class3 = SUPPORTED; /* options indicated in classmark 3 */ + cm2->lcsva = rfc->lcsva; + cm2->ucs2_treat = cm3->ucs2_treat = rfc->ucs2_treat; + cm2->solsa = rfc->solsa; + cm2->cmsp = rfc->cmsp; + + /* + * note inverse logic for the A5/1 encryption algorithm between + * classmark 1 and 2 on the one hand and radio access capability + * on the other hand + */ + cm1->a5_1 = cm2->a5_1 = !rfc->a5_bits.a5_1; + cm2->a5_2 = rfc->a5_bits.a5_2; + cm2->a5_3 = rfc->a5_bits.a5_3; + + cm3->a5_4 = rfc->a5_bits.a5_4; + cm3->a5_5 = rfc->a5_bits.a5_5; + cm3->a5_6 = rfc->a5_bits.a5_6; + cm3->a5_7 = rfc->a5_bits.a5_7; + +#ifdef GPRS + rac->acc_cap.es_ind = rfc->es_ind; + rac->acc_cap.ps = rfc->ps; + rac->acc_cap.vbs = rfc->vbs; + rac->acc_cap.vgcs = rfc->vgcs; + rac->acc_cap.v_a5_bits = SUPPORTED; + rac->acc_cap.a5_bits = rfc->a5_bits; +#if !defined(RAC_RELEASE97) + rac->acc_cap.compact = rfc->compact; +#endif /* !RAC_RELEASE97 */ + + /* single- or multiband */ + rac->flag_ra_cap2 = rac->v_ra_cap2 = NO; + +#endif + + switch (std) + { + case STD_900: + cm3->mb_value = MB_GSM900; +#ifdef GPRS + rac->acc_tech_typ = ACC_GSM_P; +#endif + break; + case STD_EGSM: + cm2->egsm = SUPPORTED; + cm3->mb_value = MB_EGSM; +#ifdef GPRS + rac->acc_tech_typ = ACC_GSM_E; +#endif + break; + case STD_1800: + cm3->mb_value = MB_DCS1800; +#ifdef GPRS + rac->acc_tech_typ = ACC_GSM_1800; +#endif + break; + case STD_DUAL: + cm3->mb_value = MB_DUAL; +#ifdef GPRS + rac->acc_tech_typ = ACC_GSM_P; + rac->flag_ra_cap2 = rac->v_ra_cap2 = YES; + rac->ra_cap2.acc_tech_typ = ACC_GSM_1800; + rac->ra_cap2.acc_cap = rac->acc_cap; + rac->ra_cap2.acc_cap.v_a5_bits = NOT_SUPPORTED; + rac->ra_cap2.acc_cap.v_ms_struct = NOT_SUPPORTED; +#if !defined(RAC_RELEASE97) + rac->ra_cap2.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; +#endif /* !RAC_RELEASE97 */ +#endif + break; + case STD_DUAL_EGSM: + /* note: incase of 1800 band, the FC bit shall be set to 0 */ + if((rr_data->ms_data.rr_service EQ FULL_SERVICE) AND + (!INRANGE(LOW_CHANNEL_1800,rr_data->nc_data[SC_INDEX].arfcn,HIGH_CHANNEL_1800))) + cm2->egsm = SUPPORTED; + cm3->mb_value = MB_DUAL_EXT; +#ifdef GPRS + rac->acc_tech_typ = ACC_GSM_E; + rac->flag_ra_cap2 = rac->v_ra_cap2 = YES; + rac->ra_cap2.acc_tech_typ = ACC_GSM_1800; + rac->ra_cap2.acc_cap = rac->acc_cap; + rac->ra_cap2.acc_cap.v_a5_bits = NOT_SUPPORTED; + rac->ra_cap2.acc_cap.v_ms_struct = NOT_SUPPORTED; +#if !defined(RAC_RELEASE97) + rac->ra_cap2.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; +#endif /* !RAC_RELEASE97 */ +#endif + break; + + case STD_1900: + case STD_850: + case STD_DUAL_US: + /* no break; go through */ + default: + cm3->mb_value = MB_NO_EUROPEAN_BAND; + break; + } + + /* power classes */ + if (rfc->bands & 0x80) + { + TRACE_ERROR("R-GSM not supported by PS software"); + /* note: cm3->v_rgsm_class (and cm3->rgsm_class) are hard coded to 0 */ + } + if (rfc->bands & 0x60) + { + TRACE_ERROR("GSM 400 not supported by PS software"); + /* note: cm3->v_gsm400_struct (and cm3->gsm400_struct) are hard coded to 0 */ + } + switch (std) + { + case STD_900: + case STD_EGSM: + cm3->v_radio_cap_1 = TRUE; + cm3->radio_cap_1 = rfc->rf_power.pow_class4[IDX_PWRCLASS_900].pow_class; + cm2->rf_pow_cap = cm3->radio_cap_1 - 1; +#ifdef GPRS + rac->acc_cap.pow_class = cm3->radio_cap_1; +#endif + break; + + case STD_1800: + /* single band => only radio_cap_1 */ + cm3->v_radio_cap_1 = TRUE; + cm3->radio_cap_1 = rfc->rf_power.pow_class4[IDX_PWRCLASS_1800].pow_class; + cm2->rf_pow_cap = cm3->radio_cap_1 - 1; +#ifdef GPRS + rac->acc_cap.pow_class = cm3->radio_cap_1; +#endif + break; + + case STD_DUAL: + case STD_DUAL_EGSM: + cm3->v_radio_cap_1 = TRUE; + cm3->radio_cap_1 = rfc->rf_power.pow_class4[IDX_PWRCLASS_900].pow_class; + cm3->v_radio_cap_2 = TRUE; + cm3->radio_cap_2 = rfc->rf_power.pow_class4[IDX_PWRCLASS_1800].pow_class; + /* note: in case the sc is´nt set, it is out of range */ + if (INRANGE(LOW_CHANNEL_1800,serving_cell,HIGH_CHANNEL_1800)) + cm2->rf_pow_cap = cm3->radio_cap_2 - 1; + else + cm2->rf_pow_cap = cm3->radio_cap_1 - 1; +#ifdef GPRS + rac->acc_cap.pow_class = cm3->radio_cap_1; + rac->ra_cap2.acc_cap.pow_class = cm3->radio_cap_2; +#endif + break; + + case STD_1900: + cm3->v_pcs1900_cap = SUPPORTED; + cm3->pcs1900_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_1900].pow_class; + cm2->rf_pow_cap = cm3->pcs1900_cap - 1; +#ifdef GPRS + rac->acc_tech_typ = ACC_GSM_1900; + rac->acc_cap.pow_class = cm3->pcs1900_cap; +#endif + break; + + case STD_850: + cm3->v_gsm850_cap = SUPPORTED; + cm3->gsm850_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_850].pow_class; + cm2->rf_pow_cap = cm3->gsm850_cap - 1; +#ifdef GPRS + rac->acc_tech_typ = ACC_GSM_850; + rac->acc_cap.pow_class = cm3->gsm850_cap; +#endif + break; + + case STD_DUAL_US: + cm3->v_gsm850_cap = SUPPORTED; + cm3->gsm850_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_850].pow_class; + cm3->v_pcs1900_cap = SUPPORTED; + cm3->pcs1900_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_1900].pow_class; + /* note: in case the sc is´nt set, it is out of range */ + if (INRANGE(LOW_CHANNEL_1900,serving_cell,HIGH_CHANNEL_1900)) + cm2->rf_pow_cap = cm3->pcs1900_cap - 1; + else + cm2->rf_pow_cap = cm3->gsm850_cap - 1; +#ifdef GPRS + rac->acc_tech_typ = ACC_GSM_850; + rac->acc_cap.pow_class = cm3->gsm850_cap; + rac->flag_ra_cap2 = rac->v_ra_cap2 = YES; + rac->ra_cap2.acc_tech_typ = ACC_GSM_1900; + rac->ra_cap2.acc_cap = rac->acc_cap; + rac->ra_cap2.acc_cap.v_a5_bits = NOT_SUPPORTED; + rac->ra_cap2.acc_cap.v_ms_struct = NOT_SUPPORTED; +#if !defined(RAC_RELEASE97) + rac->ra_cap2.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; +#endif /* !RAC_RELEASE97 */ + rac->ra_cap2.acc_cap.pow_class = cm3->pcs1900_cap; +#endif + break; + + default: + break; + } + cm1->rf_pow_cap = cm2->rf_pow_cap; + +#if defined(_SIMULATION_) && defined(RFCAP_TEST) + rr_csf_trace_power (); +#endif /* RFCAP_TEST*/ + +#if defined(FF_EGDE) + if (rfc->mod OR rfc->rf_power.egde_pow1 OR rfc->rf_power.egde_pow2) + { + cm3->v_egde_struct = SUPPORTED; + cm3->egde_struct.mod = rfc->mod; + } + switch (std) + { + case STD_900: + case STD_EGSM: + case STD_850: + if (rfc->rf_power.egde_pow1) + { + if (rfc->mod) + { + cm3->egde_struct.v_egde_pow1 = SUPPORTED; + cm3->egde_struct.egde_pow1 = rfc->rf_power.egde_pow1; + } +#ifdef GPRS + rac->acc_cap.v_pow_8psk_cap = SUPPORTED; + rac->acc_cap.pow_8psk_cap = rfc->rf_power.egde_pow1; +#endif + } + break; + case STD_1800: + case STD_1900: + if (rfc->rf_power.egde_pow2) + { + if (rfc->mod) + { + cm3->egde_struct.v_egde_pow2 = SUPPORTED; + cm3->egde_struct.egde_pow2 = rfc->rf_power.egde_pow2; + } +#ifdef GPRS + rac->acc_cap.v_pow_8psk_cap = SUPPORTED; + rac->acc_cap.pow_8psk_cap = rfc->rf_power.egde_pow2; +#endif + } + break; + case STD_DUAL: + case STD_DUAL_EGSM: + case STD_DUAL_US: + if (rfc->rf_power.egde_pow1) + { + if (rfc->mod) + { + cm3->egde_struct.v_egde_pow1 = SUPPORTED; + cm3->egde_struct.egde_pow1 = rfc->rf_power.egde_pow1; + } +#ifdef GPRS + rac->acc_cap.v_pow_8psk_cap = SUPPORTED; + rac->acc_cap.pow_8psk_cap = rfc->rf_power.egde_pow1; +#endif + } + if (rfc->rf_power.egde_pow2) + { + if (rfc->mod) + { + cm3->egde_struct.v_egde_pow2 = SUPPORTED; + cm3->egde_struct.egde_pow2 = rfc->rf_power.egde_pow2; + } +#ifdef GPRS + rac->ra_cap2.acc_cap.v_pow_8psk_cap = SUPPORTED; + rac->ra_cap2.acc_cap.pow_8psk_cap = rfc->rf_power.egde_pow2; +#endif + } + break; + default: + break; + } +#endif /* FF_EGDE */ + + /* multi slot capabilities */ + if (rfc->rf_ms.gsm_ms_class) + { + cm3->v_ms_class = SUPPORTED; + cm3->ms_class = rfc->rf_ms.gsm_ms_class; + } +#if defined(FF_EGDE) + if (rfc->rf_ms.edge_ms_class) + { + cm3->v_edge_ms_class = SUPPORTED; + cm3->edge_ms_class = rfc->rf_ms.edge_ms_class; + } +#endif /* FF_EGDE */ + if (rfc->rf_ms.dtm_g) + { +#ifdef GPRS + rac->acc_cap.v_ms_struct = SUPPORTED; +#endif + cm3->v_dtm_ms = SUPPORTED; + cm3->dtm_ms.mac_support = rfc->mac_support; + cm3->dtm_ms.dtm_g_ms_class = rfc->rf_ms.dtm_g_ms_class; +#ifdef GPRS +#if !defined(RAC_RELEASE97) + rac->acc_cap.ms_struct.v_dtm_struct = SUPPORTED; + rac->acc_cap.ms_struct.dtm_struct.dtm_g_ms_class = rfc->rf_ms.dtm_g_ms_class; + rac->acc_cap.ms_struct.dtm_struct.mac_support = rfc->mac_support; +#endif /* !RAC_RELEASE97 */ +#endif + +#if defined(FF_EGDE) + if (rfc->rf_ms.dtm_e) + { + cm3->dtm_ms.v_dtm_e_ms_class = SUPPORTED; + cm3->dtm_ms.dtm_e_ms_class = rfc->rf_ms.dtm_e_ms_class; +#ifdef GPRS +#if !defined(RAC_RELEASE97) + rac->acc_cap.ms_struct.v_dtm_struct = SUPPORTED; + rac->acc_cap.ms_struct.dtm_struct.v_dtm_e_ms_class = SUPPORTED; + rac->acc_cap.ms_struct.dtm_struct.dtm_e_ms_class = rfc->rf_ms.dtm_e_ms_class; +#endif /* !RAC_RELEASE97 */ +#endif + } +#endif /* FF_EGDE */ + } + +#ifdef GPRS + if (rfc->rf_ms.hscsd_ms_class) + { + rac->acc_cap.v_ms_struct = SUPPORTED; + rac->acc_cap.ms_struct.v_hscsd_ms_class = SUPPORTED; + rac->acc_cap.ms_struct.hscsd_ms_class = rfc->rf_ms.hscsd_ms_class; + } + + + if (rfc->rf_ms.gprs_ms_class) + { + rac->acc_cap.v_ms_struct = SUPPORTED; + rac->acc_cap.ms_struct.v_gprs_struct = SUPPORTED; + rac->acc_cap.ms_struct.gprs_struct.gprs_ms_class = rfc->rf_ms.gprs_ms_class; + rac->acc_cap.ms_struct.gprs_struct.gprs_eda = rfc->gprs_eda; + } + +#endif + + cm3->ext_meas = rfc->ext_meas; + + if (rfc->meas) + { +#ifdef GPRS + rac->acc_cap.v_ms_struct = SUPPORTED; + rac->acc_cap.ms_struct.v_sms_sm_value = SUPPORTED; + rac->acc_cap.ms_struct.sms_sm_value.sms_val = rfc->sms_val; + rac->acc_cap.ms_struct.sms_sm_value.sm_val = rfc->sm_val; +#endif + + cm3->v_measurement = SUPPORTED; + cm3->measurement.sms_val = rfc->sms_val; + cm3->measurement.sm_val = rfc->sm_val; + } + +#ifdef GPRS + if (rfc->rf_ms.ecsd_ms_class) + { + rac->acc_cap.v_ms_struct = SUPPORTED; +#if !defined(RAC_RELEASE97) + rac->acc_cap.ms_struct.v_ecsd_ms_class = SUPPORTED; + rac->acc_cap.ms_struct.ecsd_ms_class = rfc->rf_ms.ecsd_ms_class; +#endif /* !RAC_RELEASE97 */ + } +#endif + +#ifdef GPRS + if (rfc->rf_ms.egprs_ms_class) + { + rac->acc_cap.v_ms_struct = SUPPORTED; +#if !defined(RAC_RELEASE97) + rac->acc_cap.ms_struct.v_egprs_struct = SUPPORTED; + rac->acc_cap.ms_struct.egprs_struct.egprs_ms_class = rfc->rf_ms.egprs_ms_class; + rac->acc_cap.ms_struct.egprs_struct.egprs_eda = rfc->egprs_eda; +#endif /* !RAC_RELEASE97 */ + } + + if (rac->v_ra_cap2 AND rac->acc_cap.v_ms_struct) + { +#if !defined(RAC_RELEASE97) + rac->ra_cap2.acc_cap.rev99 = PHASE_1; /* PHASE_1 | RELEASE99 */ + rac->ra_cap2.acc_cap.compact = rfc->compact; +#endif /* !RAC_RELEASE97 */ + rac->ra_cap2.acc_cap.es_ind = rfc->es_ind; + rac->ra_cap2.acc_cap.ps = rfc->ps; + rac->ra_cap2.acc_cap.vbs = rfc->vbs; + rac->ra_cap2.acc_cap.vgcs = rfc->vgcs; + /* + * zero means that the same value for multislot parameters as given + * in an earlier access capabilities field within this IE apply + * also here. + */ + rac->ra_cap2.acc_cap.v_ms_struct = FALSE; + } +#endif + +#if defined FF_EOTD + if (rfc->assist_eotd OR rfc->based_eotd OR rfc->assist_gps OR rfc->based_gps OR rfc->conv_gps) +#else + if (rfc->assist_gps OR rfc->based_gps OR rfc->conv_gps) +#endif /* FF_EOTD */ + { + cm3->v_pos_method = SUPPORTED; +#if defined FF_EOTD + cm3->pos_method.assist_eotd = rfc->assist_eotd; + cm3->pos_method.based_eotd = rfc->based_eotd; +#endif /* FF_EOTD */ + cm3->pos_method.assist_gps = rfc->assist_gps; + cm3->pos_method.based_gps = rfc->based_gps; + cm3->pos_method.conv_gps = rfc->conv_gps; + } + +#if defined TI_PS_FF_REL99_AND_ABOVE + cm3->v_gsm700_cap = NOT_SUPPORTED; + cm3->umts_tdd_128 = NOT_SUPPORTED; + cm3->geran_feat_pack_1 = NOT_SUPPORTED; + cm3->v_ext_dtm_ms = NOT_SUPPORTED; + cm3->v_high_ms_cap = NOT_SUPPORTED; + cm3->geran_iu_mod_cap = NOT_SUPPORTED; + cm3->geran_feat_pack_2 = NOT_SUPPORTED; + cm3->gmsk_ms_pwr_prof = MS_PWR_PROF0; + cm3->psk8_ms_pwr_prof = MS_PWR_PROF0; + cm3->v_t_gsm400_struct = NOT_SUPPORTED; + cm3->v_t_gsm900_cap = NOT_SUPPORTED; +#ifdef L1_SAIC + /* To support SAIC release 6 feature */ + cm3->dl_adv_rx_per = DL_ADVANC_RX_PERF_PHASE1_SUPPORT; +#else + cm3->dl_adv_rx_per = DL_ADVANC_RX_PERF_NOT_SUPPORT; +#endif /* L1_SAIC */ + cm3->dtm_enhance_cap = NOT_SUPPORTED; + cm3->v_dtm_high_ms = NOT_SUPPORTED; +#ifdef FF_REPEATED_SACCH + cm3->rep_acch_cap = REP_SACCH_DL_FACCH; +#else + cm3->rep_acch_cap = REP_DL_FACCH; +#endif /* FF_REPEATED_SACCH */ +#endif /* TI_PS_FF_REL99_AND_ABOVE */ + +#if defined(_SIMULATION_) && !defined(NTRACE) + rr_csf_trace_class1 (cm1); + rr_csf_trace_class2 (cm2); + rr_csf_trace_class3 (cm3); +#endif /* _SIMULATION_ && !NTRACE */ + /* + * note: cm3->umts_fdd, cm3->umts_tdd, cm3->cdma2000, cm3->v_single_band and + * cm3->single_band are hard coded to 0 due to the lack of information about + * these features inside the T_rf_cap structure + */ + return 0; +} + +#else /* Release 99 */ + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_fit_capability | ++--------------------------------------------------------------------+ + + PURPOSE : fit classmark 2 and 3 and radio access capabilities + depend on the value of 'std' and the readed values of + /gsm/com/rfcap file according to R99 specifications + +*/ + +GLOBAL UBYTE rr_csf_fit_capability (void) +{ + GET_INSTANCE_DATA; + USHORT serving_cell; + T_rf_cap *rfc = &rr_data->ms_data.rf_cap; +#ifdef GPRS + T_ra_cap *rac = &rr_data->ms_data.ra_cap; +#ifdef TI_PS_FF_QUAD_BAND_SUPPORT + int i; +#endif +#endif + T_mob_class_1 *cm1 = &rr_data->ms_data.classmark1; + T_mob_class_2 *cm2 = &rr_data->ms_data.classmark2; + T_mob_class_3 *cm3 = &rr_data->ms_data.classmark3; + + TRACE_FUNCTION ("rr_csf_fit_capability()"); + + if (rr_data->nc_data[SC_INDEX].bcch_status NEQ EMPTY) + serving_cell = rr_data->nc_data[SC_INDEX].arfcn; + else + serving_cell = (USHORT)-1; + + memset (cm2, 0, sizeof(T_mob_class_2)); + memset (cm3, 0, sizeof(T_mob_class_3)); +#ifdef GPRS + memset (rac, 0, sizeof(T_ra_cap)); +#endif + + + /* Set clasmark 1 fields */ + cm1->rev_lev = REV_LEV_R99_SUPPORT; /* R99 mobile */ + cm1->es_ind = rfc->es_ind; + cm1->a5_1 = !rfc->a5_bits.a5_1; + + + /* Set classmark 2 fields */ + cm2->rev_lev = REV_LEV_R99_SUPPORT; + cm2->es_ind = rfc->es_ind; + cm2->ps = rfc->ps; + cm2->ss_screen = rfc->ss_screen; + cm2->mt_pp_sms = rfc->mt_pp_sms; + cm2->vbs = rfc->vbs; + cm2->vgcs = rfc->vgcs; + cm2->class3 = SUPPORTED; + cm2->lcsva = rfc->lcsva; + cm2->ucs2_treat = rfc->ucs2_treat; + cm2->solsa = rfc->solsa; + cm2->cmsp = rfc->cmsp; + cm2->a5_1 = !rfc->a5_bits.a5_1; + cm2->a5_2 = rfc->a5_bits.a5_2; + cm2->a5_3 = rfc->a5_bits.a5_3; + + + /* Set classmark 3 fields */ + cm3->a5_4 = rfc->a5_bits.a5_4; + cm3->a5_5 = rfc->a5_bits.a5_5; + cm3->a5_6 = rfc->a5_bits.a5_6; + cm3->a5_7 = rfc->a5_bits.a5_7; + cm3->ucs2_treat = rfc->ucs2_treat; + cm3->ext_meas = rfc->ext_meas; + + /* Set multi slot capabilities */ + if (rfc->rf_ms.gsm_ms_class) + { + cm3->v_ms_class = SUPPORTED; + cm3->ms_class = rfc->rf_ms.gsm_ms_class; + } + + /* Set MS measurement capability */ + if (rfc->meas) + { + cm3->v_measurement = SUPPORTED; + cm3->measurement.sms_val = rfc->sms_val; + cm3->measurement.sm_val = rfc->sm_val; + } + + /* Set MS positioning method */ +#if defined FF_EOTD + if (rfc->assist_eotd OR rfc->based_eotd OR rfc->assist_gps OR rfc->based_gps OR rfc->conv_gps) +#else + if (rfc->assist_gps OR rfc->based_gps OR rfc->conv_gps) +#endif /* FF_EOTD */ + { + cm3->v_pos_method = SUPPORTED; +#if defined FF_EOTD + cm3->pos_method.assist_eotd = rfc->assist_eotd; + cm3->pos_method.based_eotd = rfc->based_eotd; +#endif /* FF_EOTD */ + cm3->pos_method.assist_gps = rfc->assist_gps; + cm3->pos_method.based_gps = rfc->based_gps; + cm3->pos_method.conv_gps = rfc->conv_gps; + } + + +#ifdef GPRS + /* Set Radio Access Capability info */ + rac->ra_cap_values.v_acc_cap = YES; + rac->ra_cap_values.acc_cap.v_a5_bits = SUPPORTED; + + rac->ra_cap_values.acc_cap.rev99 = RELEASE99; + rac->ra_cap_values.acc_cap.es_ind = rfc->es_ind; + rac->ra_cap_values.acc_cap.ps = rfc->ps; + rac->ra_cap_values.acc_cap.vbs = rfc->vbs; + rac->ra_cap_values.acc_cap.vgcs = rfc->vgcs; + rac->ra_cap_values.acc_cap.a5_bits = rfc->a5_bits; + rac->ra_cap_values.acc_cap.compact = rfc->compact; + + rac->ra_cap_values.acc_cap.v_ms_struct = SUPPORTED; + rac->ra_cap_values.acc_cap.ms_struct.v_ecsd_ms_class = NOT_SUPPORTED;/*CR 637 */ + rac->ra_cap_values.acc_cap.ms_struct.v_hscsd_ms_class = NOT_SUPPORTED;/*CR 637 */ + rac->ra_cap_values.acc_cap.ms_struct.v_sms_sm_value = NOT_SUPPORTED;/*CR 637 */ + + rac->c_ra_cap_r = NO; + rac->v_ra_cap_r = NO; + +#endif + +#ifdef TI_PS_FF_QUAD_BAND_SUPPORT + /* Set the MS multiband capabilities */ + switch (std) + { + case STD_900: + cm3->mb_value = MB_GSM900; +#ifdef GPRS + rac->ra_cap_values.acc_tech_typ = ACC_GSM_P; +#endif + break; + case STD_EGSM: + cm2->egsm = SUPPORTED; +#ifdef GPRS + rac->ra_cap_values.acc_tech_typ = ACC_GSM_E; +#endif + /* No break */ + case STD_900_1900: + case STD_850_900_1900: + cm3->mb_value = MB_EGSM; + if ((!INRANGE(LOW_CHANNEL_1900,serving_cell,HIGH_CHANNEL_1900)) + AND (!INRANGE(LOW_CHANNEL_850,serving_cell,HIGH_CHANNEL_850))) + { + cm2->egsm = SUPPORTED; + } + break; + case STD_1800: +#ifdef GPRS + rac->ra_cap_values.acc_tech_typ = ACC_GSM_1800; +#endif + /* NO break */ + case STD_850_1800: + cm3->mb_value = MB_DCS1800; + break; + case STD_DUAL: + cm3->mb_value = MB_DUAL; +#ifdef GPRS + rac->v_ra_cap_r = YES; + rac->c_ra_cap_r++; + rac->ra_cap_r[0].ra_cap_values.v_acc_cap = YES; + + if (INRANGE(LOW_CHANNEL_1800,serving_cell,HIGH_CHANNEL_1800)) + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_1800; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_P; + } + else + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_P; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_1800; + } + + rac->ra_cap_r[0].ra_cap_values.acc_cap = rac->ra_cap_values.acc_cap; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_a5_bits = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_ms_struct = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; +#endif + break; + case STD_DUAL_EGSM: + case STD_850_900_1800: + /* note: incase of 1800 band, the FC bit shall be set to 0 */ + if((!INRANGE(LOW_CHANNEL_1800,serving_cell,HIGH_CHANNEL_1800)) + AND (!INRANGE(LOW_CHANNEL_850,serving_cell,HIGH_CHANNEL_850))) + cm2->egsm = SUPPORTED; + cm3->mb_value = MB_DUAL_EXT; + +#ifdef GPRS + rac->v_ra_cap_r = YES; + rac->c_ra_cap_r++; + rac->ra_cap_r[0].ra_cap_values.v_acc_cap = YES; + if (INRANGE(LOW_CHANNEL_1800,serving_cell,HIGH_CHANNEL_1800)) + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_1800; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_E; + } + else + { + if(INRANGE(LOW_CHANNEL_850,serving_cell,HIGH_CHANNEL_850)) + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_850; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_1800; + } + else + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_E; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_1800; + } + } + + rac->ra_cap_r[0].ra_cap_values.acc_cap = rac->ra_cap_values.acc_cap; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_a5_bits = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_ms_struct = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; +#endif + break; + + case STD_1900: + case STD_850: + case STD_DUAL_US: + /* no break; go through */ + default: + cm3->mb_value = MB_NO_EUROPEAN_BAND; + break; + } +#else + /* Set the MS multiband capabilities */ + switch (std) + { + case STD_900: + cm3->mb_value = MB_GSM900; +#ifdef GPRS + rac->ra_cap_values.acc_tech_typ = ACC_GSM_P; +#endif + break; + case STD_EGSM: + cm2->egsm = SUPPORTED; + cm3->mb_value = MB_EGSM; +#ifdef GPRS + rac->ra_cap_values.acc_tech_typ = ACC_GSM_E; +#endif + break; + case STD_1800: + cm3->mb_value = MB_DCS1800; +#ifdef GPRS + rac->ra_cap_values.acc_tech_typ = ACC_GSM_1800; +#endif + break; + case STD_DUAL: + cm3->mb_value = MB_DUAL; +#ifdef GPRS + rac->v_ra_cap_r = YES; + rac->c_ra_cap_r++; + rac->ra_cap_r[0].ra_cap_values.v_acc_cap = YES; + + if (INRANGE(LOW_CHANNEL_1800,serving_cell,HIGH_CHANNEL_1800)) + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_1800; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_P; + } + else + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_P; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_1800; + } + + rac->ra_cap_r[0].ra_cap_values.acc_cap = rac->ra_cap_values.acc_cap; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_a5_bits = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_ms_struct = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; +#endif + break; + case STD_DUAL_EGSM: + /* note: incase of 1800 band, the FC bit shall be set to 0 */ + if(!INRANGE(LOW_CHANNEL_1800,rr_data->nc_data[SC_INDEX].arfcn,HIGH_CHANNEL_1800)) + cm2->egsm = SUPPORTED; + cm3->mb_value = MB_DUAL_EXT; + +#ifdef GPRS + rac->v_ra_cap_r = YES; + rac->c_ra_cap_r++; + rac->ra_cap_r[0].ra_cap_values.v_acc_cap = YES; + + if (INRANGE(LOW_CHANNEL_1800,serving_cell,HIGH_CHANNEL_1800)) + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_1800; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_E; + } + else + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_E; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_1800; + } + + rac->ra_cap_r[0].ra_cap_values.acc_cap = rac->ra_cap_values.acc_cap; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_a5_bits = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_ms_struct = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; +#endif + break; + + case STD_1900: + case STD_850: + case STD_DUAL_US: + /* no break; go through */ + default: + cm3->mb_value = MB_NO_EUROPEAN_BAND; + break; + } +#endif + + /* Set MS power classes info */ + if (rfc->bands & 0x80) + { + TRACE_ERROR("R-GSM not supported by PS software"); + /* note: cm3->v_rgsm_class (and cm3->rgsm_class) are hard coded to 0 */ + } + if (rfc->bands & 0x60) + { + TRACE_ERROR("GSM 400 not supported by PS software"); + /* note: cm3->v_gsm400_struct (and cm3->gsm400_struct) are hard coded to 0 */ + } + + switch (std) + { + case STD_900: + case STD_EGSM: + cm3->v_radio_cap_1 = TRUE; + cm3->radio_cap_1 = rfc->rf_power.pow_class4[IDX_PWRCLASS_900].pow_class; + cm2->rf_pow_cap = cm3->radio_cap_1 - 1; +#ifdef GPRS + rac->ra_cap_values.acc_cap.pow_class = cm3->radio_cap_1; +#endif + break; + + case STD_1800: + /* single band => only radio_cap_1 */ + cm3->v_radio_cap_1 = TRUE; + cm3->radio_cap_1 = rfc->rf_power.pow_class4[IDX_PWRCLASS_1800].pow_class; + cm2->rf_pow_cap = cm3->radio_cap_1 - 1; +#ifdef GPRS + rac->ra_cap_values.acc_cap.pow_class = cm3->radio_cap_1; +#endif + break; + + case STD_DUAL: + case STD_DUAL_EGSM: + cm3->v_radio_cap_1 = TRUE; + cm3->radio_cap_1 = rfc->rf_power.pow_class4[IDX_PWRCLASS_900].pow_class; + cm3->v_radio_cap_2 = TRUE; + cm3->radio_cap_2 = rfc->rf_power.pow_class4[IDX_PWRCLASS_1800].pow_class; + /* note: in case the sc is´nt set, it is out of range */ + if (INRANGE(LOW_CHANNEL_1800,serving_cell,HIGH_CHANNEL_1800)) + cm2->rf_pow_cap = cm3->radio_cap_2 - 1; + else + cm2->rf_pow_cap = cm3->radio_cap_1 - 1; +#ifdef GPRS + if (rac->ra_cap_values.acc_tech_typ EQ ACC_GSM_1800) + { + rac->ra_cap_values.acc_cap.pow_class = cm3->radio_cap_2; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->radio_cap_1; + } + else + { + rac->ra_cap_values.acc_cap.pow_class = cm3->radio_cap_1; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->radio_cap_2; + } +#endif + break; + + case STD_1900: + cm3->v_pcs1900_cap = SUPPORTED; + cm3->pcs1900_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_1900].pow_class; + cm2->rf_pow_cap = cm3->pcs1900_cap - 1; +#ifdef GPRS + rac->ra_cap_values.acc_tech_typ = ACC_GSM_1900; + rac->ra_cap_values.acc_cap.pow_class = cm3->pcs1900_cap; +#endif + break; + + case STD_850: + cm3->v_gsm850_cap = SUPPORTED; + cm3->gsm850_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_850].pow_class; + cm2->rf_pow_cap = cm3->gsm850_cap - 1; +#ifdef GPRS + rac->ra_cap_values.acc_tech_typ = ACC_GSM_850; + rac->ra_cap_values.acc_cap.pow_class = cm3->gsm850_cap; +#endif + break; + + case STD_DUAL_US: + cm3->v_gsm850_cap = SUPPORTED; + cm3->gsm850_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_850].pow_class; + cm3->v_pcs1900_cap = SUPPORTED; + cm3->pcs1900_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_1900].pow_class; + + /* note: in case the sc is´nt set, it is out of range */ + if (INRANGE(LOW_CHANNEL_1900,serving_cell,HIGH_CHANNEL_1900)) + cm2->rf_pow_cap = cm3->pcs1900_cap - 1; + else + cm2->rf_pow_cap = cm3->gsm850_cap - 1; + +#ifdef GPRS + if (INRANGE(LOW_CHANNEL_1900,serving_cell,HIGH_CHANNEL_1900)) + { + cm2->rf_pow_cap = cm3->pcs1900_cap - 1; + rac->ra_cap_values.acc_tech_typ = ACC_GSM_1900; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_850; + rac->ra_cap_values.acc_cap.pow_class = cm3->pcs1900_cap; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->gsm850_cap; + } + else + { + cm2->rf_pow_cap = cm3->gsm850_cap - 1; + rac->ra_cap_values.acc_tech_typ = ACC_GSM_850; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_1900; + rac->ra_cap_values.acc_cap.pow_class = cm3->gsm850_cap; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->pcs1900_cap; + } + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_a5_bits = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_ms_struct = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; +#endif + break; + +#ifdef TI_PS_FF_QUAD_BAND_SUPPORT + case STD_900_1900: + cm3->v_radio_cap_1 = TRUE; + cm3->radio_cap_1 = rfc->rf_power.pow_class4[IDX_PWRCLASS_900].pow_class; + cm3->v_pcs1900_cap = SUPPORTED; + cm3->pcs1900_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_1900].pow_class; + if (INRANGE(LOW_CHANNEL_1900,serving_cell,HIGH_CHANNEL_1900)) + cm2->rf_pow_cap = cm3->pcs1900_cap - 1; + else + cm2->rf_pow_cap = cm3->radio_cap_1 - 1; +#ifdef GPRS + if (INRANGE(LOW_CHANNEL_1900,serving_cell,HIGH_CHANNEL_1900)) + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_1900; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_E; + rac->ra_cap_values.acc_cap.pow_class = cm3->pcs1900_cap; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->radio_cap_1; + } + else + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_E; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_1900; + rac->ra_cap_values.acc_cap.pow_class = cm3->radio_cap_1; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->pcs1900_cap; + } + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_a5_bits = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_ms_struct = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; +#endif + break; + + case STD_850_1800: + cm3->v_radio_cap_1 = TRUE; + cm3->radio_cap_1 = rfc->rf_power.pow_class4[IDX_PWRCLASS_1800].pow_class; + cm3->v_gsm850_cap = SUPPORTED; + cm3->gsm850_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_850].pow_class; + if (INRANGE(LOW_CHANNEL_1800,serving_cell,HIGH_CHANNEL_1800)) + cm2->rf_pow_cap = cm3->radio_cap_1 - 1; + else + cm2->rf_pow_cap = cm3->gsm850_cap - 1; +#ifdef GPRS + if (INRANGE(LOW_CHANNEL_1800,serving_cell,HIGH_CHANNEL_1800)) + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_1800; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_850; + rac->ra_cap_values.acc_cap.pow_class = cm3->radio_cap_1; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->gsm850_cap; + } + else + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_850; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_1800; + rac->ra_cap_values.acc_cap.pow_class = cm3->gsm850_cap; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->radio_cap_1; + } + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_a5_bits = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_ms_struct = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; +#endif + break; + + case STD_850_900_1900: + cm3->v_gsm850_cap = SUPPORTED; + cm3->gsm850_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_850].pow_class; + cm3->v_pcs1900_cap = SUPPORTED; + cm3->pcs1900_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_1900].pow_class; + cm3->v_radio_cap_1 = TRUE; + cm3->radio_cap_1 = rfc->rf_power.pow_class4[IDX_PWRCLASS_900].pow_class; + /* note: in case the sc is´nt set, it is out of range */ + if (INRANGE(LOW_CHANNEL_1900,serving_cell,HIGH_CHANNEL_1900)) + cm2->rf_pow_cap = cm3->pcs1900_cap - 1; + else if (INRANGE(LOW_CHANNEL_850,serving_cell,HIGH_CHANNEL_850)) + cm2->rf_pow_cap = cm3->gsm850_cap - 1; + else + cm2->rf_pow_cap = cm3->radio_cap_1 - 1; + +#ifdef GPRS + if (INRANGE(LOW_CHANNEL_1900,serving_cell,HIGH_CHANNEL_1900)) + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_1900; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_850; + rac->ra_cap_values.acc_cap.pow_class = cm3->pcs1900_cap; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->gsm850_cap; + } + else + { + if (INRANGE(LOW_CHANNEL_850,serving_cell,HIGH_CHANNEL_850)) + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_850; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_1900; + rac->ra_cap_values.acc_cap.pow_class = cm3->gsm850_cap; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->pcs1900_cap; + } + else + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_E; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_1900; + rac->ra_cap_values.acc_cap.pow_class = cm3->radio_cap_1; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->pcs1900_cap; + } + } + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_a5_bits = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_ms_struct = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; +#endif + break; + case STD_850_900_1800: + cm3->v_radio_cap_1 = TRUE; + cm3->radio_cap_1 = rfc->rf_power.pow_class4[IDX_PWRCLASS_900].pow_class; + cm3->v_radio_cap_2 = TRUE; + cm3->radio_cap_2 = rfc->rf_power.pow_class4[IDX_PWRCLASS_1800].pow_class; + cm3->v_gsm850_cap = SUPPORTED; + cm3->gsm850_cap = rfc->rf_power.pow_class4[IDX_PWRCLASS_850].pow_class; + /* note: in case the sc is´nt set, it is out of range */ + if (INRANGE(LOW_CHANNEL_1800,serving_cell,HIGH_CHANNEL_1800)) + cm2->rf_pow_cap = cm3->radio_cap_2 - 1; + else if (INRANGE(LOW_CHANNEL_850,serving_cell,HIGH_CHANNEL_850)) + cm2->rf_pow_cap = cm3->gsm850_cap - 1; + else + cm2->rf_pow_cap = cm3->radio_cap_1 - 1; +#ifdef GPRS + if (INRANGE(LOW_CHANNEL_1800,serving_cell,HIGH_CHANNEL_1800)) + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_1800; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_E; + rac->ra_cap_values.acc_cap.pow_class = cm3->radio_cap_2; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->radio_cap_1; + } + else + { + if (INRANGE(LOW_CHANNEL_850,serving_cell,HIGH_CHANNEL_850)) + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_850; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_1800; + rac->ra_cap_values.acc_cap.pow_class = cm3->gsm850_cap; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->radio_cap_2; + } + else + { + rac->ra_cap_values.acc_tech_typ = ACC_GSM_E; + rac->ra_cap_r[0].ra_cap_values.acc_tech_typ = ACC_GSM_1800; + rac->ra_cap_values.acc_cap.pow_class = cm3->radio_cap_1; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_class = cm3->radio_cap_2; + } + } + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_a5_bits = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_ms_struct = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; +#endif + break; +#endif + + default: + break; + } + + cm1->rf_pow_cap = cm2->rf_pow_cap; + +#if defined(_SIMULATION_) && defined(RFCAP_TEST) + rr_csf_trace_power (); +#endif /* RFCAP_TEST*/ + + +/*Set 8psk capability in uplink for EGPRS*/ +#if defined(FF_EGPRS) + + /*Initialize with 8psk is not supported in uplink*/ + cm3->v_egde_struct = NOT_SUPPORTED; + rac->ra_cap_values.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_pow_8psk_cap = NOT_SUPPORTED; + + switch (std) + { + case STD_900: + case STD_EGSM: + case STD_850: + if (rfc->mod) + { + if (rfc->rf_power.egde_pow1) + { + cm3->v_egde_struct = TRUE; + cm3->egde_struct.mod = SUPPORTED; + cm3->egde_struct.v_egde_pow1 = TRUE; + cm3->egde_struct.egde_pow1 = rfc->rf_power.egde_pow1; + rac->ra_cap_values.acc_cap.v_pow_8psk_cap = TRUE; + rac->ra_cap_values.acc_cap.pow_8psk_cap = rfc->rf_power.egde_pow1; + TRACE_EVENT_P1 ("1: 8PSK SUPPORTED (EGPRS) POWER CLASS E1 = %d",rac->ra_cap_values.acc_cap.pow_8psk_cap); + } + } + break; + case STD_1800: + case STD_1900: + if (rfc->mod) + { + if (rfc->rf_power.egde_pow2) + { + cm3->v_egde_struct = TRUE; + cm3->egde_struct.mod = SUPPORTED; + cm3->egde_struct.v_egde_pow2 = TRUE; + cm3->egde_struct.egde_pow2 = rfc->rf_power.egde_pow2; + rac->ra_cap_values.acc_cap.v_pow_8psk_cap = TRUE; + rac->ra_cap_values.acc_cap.pow_8psk_cap = rfc->rf_power.egde_pow2; + TRACE_EVENT_P1 ("2: 8PSK SUPPORTED (EGPRS) POWER CLASS E2 = %d",rac->ra_cap_values.acc_cap.pow_8psk_cap); + } + } + break; + case STD_DUAL: + case STD_DUAL_EGSM: + case STD_DUAL_US: + if ((rac->ra_cap_values.acc_tech_typ EQ ACC_GSM_1800) OR (rac->ra_cap_values.acc_tech_typ EQ ACC_GSM_1900)) + { + if (rfc->mod) + { + if (rfc->rf_power.egde_pow2) + { + /*8psk is supported in uplink in 1800/1900 BAND*/ + cm3->v_egde_struct = TRUE; + cm3->egde_struct.mod = SUPPORTED; + cm3->egde_struct.v_egde_pow2 = TRUE; + cm3->egde_struct.egde_pow2 = rfc->rf_power.egde_pow2; + rac->ra_cap_values.acc_cap.v_pow_8psk_cap = TRUE; + rac->ra_cap_values.acc_cap.pow_8psk_cap = rfc->rf_power.egde_pow2; + TRACE_EVENT_P1 ("3: 8PSK SUPPORTED (EGPRS) POWER CLASS E2 = %d",rac->ra_cap_values.acc_cap.pow_8psk_cap); + } + if (rfc->rf_power.egde_pow1) + { + /*Set 8psk capability for 850/900 BAND*/ + cm3->v_egde_struct = TRUE; + cm3->egde_struct.mod = SUPPORTED; + cm3->egde_struct.v_egde_pow1 = TRUE; + cm3->egde_struct.egde_pow1 = rfc->rf_power.egde_pow1; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_pow_8psk_cap = TRUE; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_8psk_cap = rfc->rf_power.egde_pow1; + TRACE_EVENT_P1 ("4: 8PSK SUPPORTED (EGPRS) POWER CLASS E1 = %d",rac->ra_cap_values.acc_cap.pow_8psk_cap); + } + } + } + else + { + if (rfc->mod) + { + if (rfc->rf_power.egde_pow1) + { + /*8psk is supported in uplink in 1800/1900*/ + cm3->v_egde_struct = TRUE; + cm3->egde_struct.mod = SUPPORTED; + cm3->egde_struct.v_egde_pow1 = TRUE; + cm3->egde_struct.egde_pow1 = rfc->rf_power.egde_pow1; + rac->ra_cap_values.acc_cap.v_pow_8psk_cap = TRUE; + rac->ra_cap_values.acc_cap.pow_8psk_cap = rfc->rf_power.egde_pow1; + TRACE_EVENT_P1 ("5: 8PSK SUPPORTED (EGPRS) POWER CLASS E1 = %d",rac->ra_cap_values.acc_cap.pow_8psk_cap); + } + if (rfc->rf_power.egde_pow2) + { + /*Set 8psk capability for 850/900*/ + cm3->v_egde_struct = TRUE; + cm3->egde_struct.mod = SUPPORTED; + cm3->egde_struct.v_egde_pow2 = TRUE; + cm3->egde_struct.egde_pow2 = rfc->rf_power.egde_pow2; + rac->ra_cap_r[0].ra_cap_values.acc_cap.v_pow_8psk_cap = TRUE; + rac->ra_cap_r[0].ra_cap_values.acc_cap.pow_8psk_cap = rfc->rf_power.egde_pow2; + TRACE_EVENT_P1 ("6: 8PSK SUPPORTED (EGPRS) POWER CLASS E2 = %d",rac->ra_cap_values.acc_cap.pow_8psk_cap); + } + } + } + break; + default: + break; + } +#endif /* FF_EGPRS */ + + if (rfc->rf_ms.dtm_g) + { + cm3->v_dtm_ms = SUPPORTED; + cm3->dtm_ms.mac_support = rfc->mac_support; + cm3->dtm_ms.dtm_g_ms_class = rfc->rf_ms.dtm_g_ms_class; +#ifdef GPRS + rac->ra_cap_values.acc_cap.ms_struct.v_dtm_struct = SUPPORTED; + rac->ra_cap_values.acc_cap.ms_struct.dtm_struct.dtm_g_ms_class = rfc->rf_ms.dtm_g_ms_class; + rac->ra_cap_values.acc_cap.ms_struct.dtm_struct.mac_support = rfc->mac_support; +#endif + +#if defined(FF_EGPRS) + if (rfc->rf_ms.dtm_e) + { + cm3->dtm_ms.v_dtm_e_ms_class = SUPPORTED; + cm3->dtm_ms.dtm_e_ms_class = rfc->rf_ms.dtm_e_ms_class; +#ifdef GPRS + rac->ra_cap_values.acc_cap.ms_struct.v_dtm_struct = SUPPORTED; + rac->ra_cap_values.acc_cap.ms_struct.dtm_struct.v_dtm_e_ms_class = SUPPORTED; + rac->ra_cap_values.acc_cap.ms_struct.dtm_struct.dtm_e_ms_class = rfc->rf_ms.dtm_e_ms_class; +#endif + } +#endif /* FF_EGDE */ + } + +#ifdef GPRS + +#if 0 /* CR 637 */ + if (rfc->rf_ms.hscsd_ms_class) + { + rac->ra_cap_values.acc_cap.v_ms_struct = SUPPORTED; + rac->ra_cap_values.acc_cap.ms_struct.v_hscsd_ms_class = SUPPORTED; + rac->ra_cap_values.acc_cap.ms_struct.hscsd_ms_class = rfc->rf_ms.hscsd_ms_class; + } +#endif + + if (rfc->rf_ms.gprs_ms_class) + { + rac->ra_cap_values.acc_cap.ms_struct.v_gprs_struct = SUPPORTED; + rac->ra_cap_values.acc_cap.ms_struct.gprs_struct.gprs_ms_class = rfc->rf_ms.gprs_ms_class; + rac->ra_cap_values.acc_cap.ms_struct.gprs_struct.gprs_eda = rfc->gprs_eda; + } + + + if (rfc->meas) + { + rac->ra_cap_values.acc_cap.ms_struct.v_sms_sm_value = SUPPORTED; + rac->ra_cap_values.acc_cap.ms_struct.sms_sm_value.sms_val = rfc->sms_val; + rac->ra_cap_values.acc_cap.ms_struct.sms_sm_value.sm_val = rfc->sm_val; + } + +#if 0 /* CR 637 */ + if (rfc->rf_ms.ecsd_ms_class) + { + rac->ra_cap_values.acc_cap.v_ms_struct = SUPPORTED; + rac->ra_cap_values.acc_cap.ms_struct.v_ecsd_ms_class = SUPPORTED; + rac->ra_cap_values.acc_cap.ms_struct.ecsd_ms_class = rfc->rf_ms.ecsd_ms_class; + } +#endif + +#if defined(FF_EGPRS) + if (rfc->rf_ms.egprs_ms_class) + { + cm3->v_edge_ms_class = TRUE; + cm3->edge_ms_class = rfc->rf_ms.egprs_ms_class; + rac->ra_cap_values.acc_cap.ms_struct.v_egprs_struct = TRUE; + rac->ra_cap_values.acc_cap.ms_struct.egprs_struct.egprs_ms_class = rfc->rf_ms.egprs_ms_class; + rac->ra_cap_values.acc_cap.ms_struct.egprs_struct.egprs_eda = rfc->egprs_eda; + } +#endif + + if ((rac->c_ra_cap_r > 0) AND rac->ra_cap_values.acc_cap.v_ms_struct) + { + rac->v_ra_cap_r = TRUE; + rac->ra_cap_r[0].ra_cap_values.acc_cap.rev99 = RELEASE99; + + + rac->ra_cap_r[0].ra_cap_values.acc_cap.compact = rfc->compact; + rac->ra_cap_r[0].ra_cap_values.acc_cap.es_ind = rfc->es_ind; + rac->ra_cap_r[0].ra_cap_values.acc_cap.ps = rfc->ps; + rac->ra_cap_r[0].ra_cap_values.acc_cap.vbs = rfc->vbs; + rac->ra_cap_r[0].ra_cap_values.acc_cap.vgcs = rfc->vgcs; + +#if defined(FF_EGPRS) + if (rfc->rf_ms.egprs_ms_class) + { + rac->ra_cap_r[0].ra_cap_values.acc_cap.ms_struct.v_egprs_struct = TRUE; + rac->ra_cap_r[0].ra_cap_values.acc_cap.ms_struct.egprs_struct.egprs_ms_class = rfc->rf_ms.egprs_ms_class; + rac->ra_cap_r[0].ra_cap_values.acc_cap.ms_struct.egprs_struct.egprs_eda = rfc->egprs_eda; + } +#endif + + } +#endif + +#if defined TI_PS_FF_REL99_AND_ABOVE + /* To support SAIC release 6 feature */ + cm3->v_gsm700_cap = NOT_SUPPORTED; + cm3->umts_tdd_128 = NOT_SUPPORTED; + cm3->geran_feat_pack_1 = NOT_SUPPORTED; + cm3->v_ext_dtm_ms = NOT_SUPPORTED; + cm3->v_high_ms_cap = NOT_SUPPORTED; + cm3->geran_iu_mod_cap = NOT_SUPPORTED; + cm3->geran_feat_pack_2 = NOT_SUPPORTED; + cm3->gmsk_ms_pwr_prof = MS_PWR_PROF0; + cm3->psk8_ms_pwr_prof = MS_PWR_PROF0; + cm3->v_t_gsm400_struct = NOT_SUPPORTED; + cm3->v_t_gsm900_cap = NOT_SUPPORTED; + cm3->dtm_enhance_cap = NOT_SUPPORTED; + cm3->v_dtm_high_ms = NOT_SUPPORTED; +#ifdef L1_SAIC + /* To support SAIC release 6 feature */ + cm3->dl_adv_rx_per = DL_ADVANC_RX_PERF_PHASE1_SUPPORT; +#else + cm3->dl_adv_rx_per = DL_ADVANC_RX_PERF_NOT_SUPPORT; +#endif /* L1_SAIC */ +#ifdef FF_REPEATED_SACCH + cm3->rep_acch_cap = REP_SACCH_DL_FACCH; +#else + cm3->rep_acch_cap = REP_DL_FACCH; +#endif /* FF_REPEATED_SACCH */ +#endif /* TI_PS_FF_REL99_AND_ABOVE */ + +#if defined(_SIMULATION_) && !defined(NTRACE) + rr_csf_trace_class1 (cm1); + rr_csf_trace_class2 (cm2); + rr_csf_trace_class3 (cm3); +#endif /* _SIMULATION_ && !NTRACE */ + /* + * note: cm3->umts_fdd, cm3->umts_tdd, cm3->cdma2000, cm3->v_single_band and + * cm3->single_band are hard coded to 0 due to the lack of information about + * these features inside the T_rf_cap structure + */ + return 0; +} +#endif + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : RR_CSF | +| STATE : code ROUTINE : RX_Enable | ++--------------------------------------------------------------------+ + + PURPOSE : This function enables reporting of RX level. + +*/ +static T_VOID_FUNC rx_driver_entry = NULL; +static UBYTE rx_act_value = 0; +static UBYTE rx_act_qual = RX_QUAL_UNAVAILABLE; +#ifdef FF_PS_RSSI +static UBYTE rx_act_rxlev_access_min = RX_ACCE_UNAVAILABLE; +#endif + +/*lint -esym(765,RX_Enable) | used by RX driver */ +/*lint -esym(714,RX_Enable) | used by RX driver */ +GLOBAL void RX_Enable (T_VOID_FUNC rx_indication) +{ + /* + * store callback function + */ + rx_driver_entry = rx_indication; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : RR_CSF | +| STATE : code ROUTINE : RX_SetValue | ++--------------------------------------------------------------------+ + + PURPOSE : This function stores a new fieldstrength value and + informs the RX driver if possible about a change. + +*/ + +/* + * for reduce number of indications during dedicated mode + */ +static UBYTE rssi_dedi_counter = 0; + +/* + * Minimum RSSI difference for indication to MMI + */ +#define RSSI_MIN_DIFFERENCE 5 +#define RSSI_MIN_LEVEL 10 + + +#ifdef FF_PS_RSSI +GLOBAL void RX_SetValue (UBYTE new_value, UBYTE new_qual, UBYTE new_access) +#else +GLOBAL void RX_SetValue (UBYTE new_value) +#endif +{ + GET_INSTANCE_DATA; + UBYTE rssi_delta; + +#ifdef FF_PS_RSSI + rx_act_rxlev_access_min = new_access; +#endif + + if (rx_driver_entry EQ NULL) + { + rx_act_value = new_value; +#ifdef FF_PS_RSSI + rx_act_qual = new_qual; +#endif + } + else /*if a callback is installed*/ + { + + /* + * Compute delta compared to last MMI value + */ + rssi_delta = ( new_value >= rx_act_value ? + ( new_value - rx_act_value ) : + ( rx_act_value - new_value ) + ); + /* + * if difference greather than defined threshold + * rx_qual is available in dedicated state only + * Change in RX_QUAL + */ + if ((rssi_delta >= RSSI_MIN_DIFFERENCE) OR (new_value < RSSI_MIN_LEVEL) +#ifdef FF_PS_RSSI + OR (new_qual NEQ rx_act_qual) +#endif + ) + { + + if ( GET_STATE (STATE_ATT) NEQ ATT_DEDICATED ) + { + rx_act_value = new_value; +#ifdef FF_PS_RSSI + rx_act_qual = new_qual; +#endif + (*rx_driver_entry)(); + } + else + { + /* + * in dedicated mode take only each 16 the attempt + * equal 8 seconds + */ + if (!((rssi_dedi_counter ++ ) & 0x0F )) + { + /* + * New RSSI to be forwarded + */ + rx_act_value = new_value; +#ifdef FF_PS_RSSI + rx_act_qual = new_qual; +#endif + (*rx_driver_entry)(); + } + } + } + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : RR_CSF | +| STATE : code ROUTINE : RX_GetValue | ++--------------------------------------------------------------------+ + + PURPOSE : This function simulates a low level driver call to get + the actual fieldstrength. + +*/ +/*lint -esym(765,RX_GetValue) | used by RX driver */ +/*lint -esym(714,RX_GetValue) | used by RX driver */ +GLOBAL USHORT RX_GetValue (void) +{ + USHORT rx_level; + + rx_level = (USHORT)rx_act_value; + + return rx_level; +} + +#ifdef FF_PS_RSSI +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : RR_CSF | +| STATE : code ROUTINE : RX_GetRxLevAccessMin | ++--------------------------------------------------------------------+ + + PURPOSE : This function simulates a low level driver call to get + the minimum access level. + +*/ +GLOBAL UBYTE RX_GetRxLevAccessMin (void) +{ + return rx_act_rxlev_access_min; +} +#endif + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : RR_CSF | +| STATE : code ROUTINE : RX_SetRxQual | ++--------------------------------------------------------------------+ + + PURPOSE : This function simulates a low level driver call to set + the actual RXQUAL value. + +*/ +/*lint -esym(765,RX_SetRxQual) | used by GRR */ +/*lint -esym(714,RX_SetRxQual) | used by GRR */ +GLOBAL void RX_SetRxQual (UBYTE new_rx_qual) +{ + rx_act_qual = new_rx_qual; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : RR_CSF | +| STATE : code ROUTINE : RX_GetRxQual | ++--------------------------------------------------------------------+ + + PURPOSE : This function simulates a low level driver call to get + the actual RXQUAL value. + +*/ +/*lint -esym(765,RX_GetRxQual) | used by RX driver */ +/*lint -esym(714,RX_GetRxQual) | used by RX driver */ +GLOBAL UBYTE RX_GetRxQual (void) +{ + return rx_act_qual; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_get_found_channels | ++--------------------------------------------------------------------+ + + PURPOSE : This function is a little bit dirty solution to get + the BCCH channel numbers of a PLMN available list. + +*/ +#if 0 +GLOBAL USHORT * rr_get_found_channels (void) +{ + static USHORT found_channels[MAX_PLMN]; + int i; + for (i=0; i<MAX_PLMN; i++) + found_channels[i] = rr_data->sc_data.found[i].arfcn; + return found_channels; +} +#endif +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_get_bcch_channel | ++--------------------------------------------------------------------+ + + PURPOSE : This function is a little bit dirty solution to get + the BCCH channel numbers of the current PLMN. + +*/ +#if 0 +GLOBAL USHORT rr_get_bcch_channel (void) +{ + return rr_data->nc_data[SC_INDEX].arfcn; +} +#endif + +/* + * These functions (get_network_meas() & get_bcch_chan_list()) should only + * temporary defined here. + */ +/*lint -esym(765,get_network_meas) | used by SIM */ +/*lint -esym(714,get_network_meas) | used by SIM */ +GLOBAL UBYTE get_network_meas (UBYTE * chan_list) +{ + GET_INSTANCE_DATA; +#if defined (_SIMULATION_) + /* + * fixed values for the windows simulation + */ + memset (chan_list, 0, 16); + chan_list [0] = 0x32; + chan_list [1] = 0x16; + chan_list [2] = 0x7E; + chan_list [3] = 0x52; + chan_list [4] = 0x37; + return 1; +#else /* _SIMULATION_ */ + switch (GET_STATE (STATE_ATT)) + { + case ATT_IDLE: + memset (chan_list, 0, 16); + chan_list [0] = rr_data->nc_data[SC_INDEX].rxlev; + return 1; + case ATT_DEDICATED: + memcpy (chan_list, dl_get_sacch_buffer(), 16); + return 1; + default: + return 0; + } +#endif /* _SIMULATION_ */ +} + +#ifdef REL99 +/* ++--------------------------------------------------------------------+ +| PROJECT : GPRS EDGE MODULE : RR_CSF | +| STATE : code ROUTINE : get_msc_release_version | ++--------------------------------------------------------------------+ + + PURPOSE : use to get the MSC release version of the serving cell. +*/ + +GLOBAL void get_msc_release_version(UBYTE* mscr) +{ + GET_INSTANCE_DATA; + T_NC_DATA * rrd; + rrd = &rr_data->nc_data[SC_INDEX]; + *mscr = rrd->mscr_flag; +} +#endif + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : RR_CSF | +| STATE : code ROUTINE : get_bcch_chan_list | ++--------------------------------------------------------------------+ + + PURPOSE : This function returns the network measurement results + in the SIM TOOLKIT Format. + +*/ +#if defined (_SIMULATION_) +/* + * predefined values for windows simulation + */ +static USHORT win_list[MAX_NEIGHBOURCELLS] = { 124, 512, 17, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF } ; +#endif /* _SIMULATION_ */ +/*lint -esym(765,get_bcch_chan_list) | used by SIM */ +/*lint -esym(714,get_bcch_chan_list) | used by SIM */ +GLOBAL UBYTE get_bcch_chan_list (stk_data_type * out_stk_data) +{ + GET_INSTANCE_DATA; + UBYTE i; + UBYTE value; +#if defined (_SIMULATION_) + USHORT * ncell_list = win_list; +#else /* _SIMULATION_ */ + USHORT * ncell_list = rr_data->act_ncell_list; +#endif /* _SIMULATION_ */ + +#if !defined (_SIMULATION_) + switch (GET_STATE (STATE_ATT)) + { + case ATT_IDLE: + case ATT_DEDICATED: +#endif /* !_SIMULATION_ */ + + /* + * clear output parameter + */ + memset (out_stk_data->stk_parameter, 0, sizeof (out_stk_data->stk_parameter)); + for (i=0;i<MAX_NEIGHBOURCELLS;i++) + { + if (ncell_list[i] EQ NOT_PRESENT_16BIT) + { + /* + * if no further channel is available + * calculate length in bytes + * number of channels a 10 bit + */ + out_stk_data->stk_length = (i*10+7)/8; + return 1; + } + /* + * channel is available + * then use basic CCD function to add to bitstream + */ + value = ncell_list[i] >> 8; + ccd_codeByte (out_stk_data->stk_parameter, (USHORT)(i*10), 2, value); + value = ncell_list[i] & 0xFF; + ccd_codeByte (out_stk_data->stk_parameter, (USHORT)(i*10+2), 8, value); + } + /* + * if no end indicator has been found + * and all parameters are channels + * calculate length in bytes + * number of channels a 10 bit. + */ + out_stk_data->stk_length = (i*10+7)/8; + return 1; +#if !defined (_SIMULATION_) + default: + return 0; + } +#endif /* _SIMULATION_ */ +} + + +#if defined(_SIMULATION_FFS_) + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_ffs_init | ++--------------------------------------------------------------------+ + + PURPOSE : + +*/ + +LOCAL const char rr_white_list_name[] = "/gsm/l3/rr_white_list"; +LOCAL const char rr_black_list_name[] = "/gsm/l3/rr_black_list"; +LOCAL const char rr_lower_rxlev_thr_name[] = "/gsm/l3/rr_lower_rxlev_thr"; +LOCAL const char rr_medium_rxlev_thr_name[] = "/gsm/l3/rr_medium_rxlev_thr"; +LOCAL const char rr_upper_rxlev_thr_name[] = "/gsm/l3/rr_upper_rxlev_thr"; +LOCAL const char rr_shield_mcc_name[] = "/gsm/l3/shield"; + +GLOBAL void rr_csf_ffs_init(void) +{ + TRACE_FUNCTION ("rr_csf_ffs_init()"); + + /* If MM has to create the directories for FFS, there is no point + * in carry on with the initialisation + */ + rr_csf_check_ffs_dirs(); + + /* Read white list from FFS */ + rr_csf_read_white_list(); + + /* Read Black List from FFS */ + rr_csf_read_black_list(); + + /* Read RXlevel thresholds from FFS */ + rr_csf_read_rxlev_thr(); +} + + +/* ++------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_write_white_list | ++------------------------------------------------------------------+ + + PURPOSE : This function writes the White list information to FFS. + CSI-LLD - 4.1.2.2.4 +*/ + +GLOBAL void rr_csf_write_white_list(T_CS_WHITE_LIST *white_list) +{ + TRACE_FUNCTION ("rr_csf_write_white_list()"); + +#if defined(_SIMULATION_) + memcpy(&win_white_list,white_list,sizeof(T_CS_WHITE_LIST)); +#else + rr_csf_check_ffs_dirs(); + rr_csf_handle_ffs_write_result(ffs_file_write(rr_white_list_name, + white_list, + sizeof(T_CS_WHITE_LIST), + FFS_O_CREATE | FFS_O_RDWR)); +#endif + + TRACE_EVENT("White List written to FFS"); +} + +/* ++-----------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_read_white_list | ++-----------------------------------------------------------------+ + + PURPOSE : This function read the White list information from FFS. + CSI-LLD - 4.1.2.2.5 +*/ + +GLOBAL void rr_csf_read_white_list(void) +{ + GET_INSTANCE_DATA; + TRACE_FUNCTION ("rr_csf_read_white_list()"); + + TRACE_EVENT("Read White List from FFS"); + +#if defined(_SIMULATION_) + memcpy(&rr_data->cs_data.white_list,&win_white_list,sizeof(T_CS_WHITE_LIST)); +#else + rr_csf_check_ffs_dirs(); + if(!rr_csf_handle_ffs_read_result(ffs_file_read(rr_white_list_name, + &rr_data->cs_data.white_list, + sizeof(T_CS_WHITE_LIST)))) + { + /* In case of read error, reset the White List */ + cs_clear_white_list(CLR_WHITE_LIST_RAM); + } +#endif +} + +/* ++-----------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_write_black_list | ++-----------------------------------------------------------------------+ + + PURPOSE : This function wirtes "Black List" information to FFS. + In case of windows simulation environment, "Black List" is + stored to simulated FFS area. + This function is called during switch off. + CSI-LLD section:4.1.1.5.3 +*/ + +GLOBAL void rr_csf_write_black_list(T_LIST *black_list) +{ + TRACE_FUNCTION ("rr_csf_write_black_list()"); + +#if defined(_SIMULATION_) + memcpy(&win_black_list[0],black_list,MAX_REGIONS*sizeof(T_LIST)); +#else + rr_csf_check_ffs_dirs(); + rr_csf_handle_ffs_write_result(ffs_file_write (rr_black_list_name, + black_list, + MAX_REGIONS*sizeof(T_LIST), + FFS_O_CREATE | FFS_O_RDWR)); +#endif + + TRACE_EVENT("Black List written to FFS"); +} + + +/* ++------------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_read_black_list | ++------------------------------------------------------------------------+ + + PURPOSE : This function copies "Black List" information from FFS to RR + internal "Black List" data structures. In case of windows + simulation environment, "Black List" is read from simulated FFS + area. This function is called after power on + Cell Selection Improvements-LLD section:4.1.1.5.4 +*/ + +GLOBAL void rr_csf_read_black_list(void) +{ + GET_INSTANCE_DATA; + TRACE_FUNCTION ("rr_csf_read_black_list()"); + + TRACE_EVENT("Read Black List from FFS"); + +#if defined(_SIMULATION_) + memcpy(&rr_data->cs_data.black_list.list[0],&win_black_list[0], + MAX_REGIONS*sizeof(T_LIST)); +#else + rr_csf_check_ffs_dirs(); + if(!rr_csf_handle_ffs_read_result(ffs_file_read (rr_black_list_name, + &rr_data->cs_data.black_list.list[0], + MAX_REGIONS*sizeof(T_LIST)))) + { + /* In case of read error, reset the Black List */ + cs_clear_black_list(CLR_BLACK_LIST_RAM); + } +#endif +} + +/* ++-----------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_write_rxlev_thr | ++-----------------------------------------------------------------------+ + + PURPOSE : This function wirtes "RXLevel Threshold" information to FFS. + In case of windows simulation environment, "RXLevel Threshold" is + stored to simulated FFS area. + This function is called during dynamic configuration. +*/ + +GLOBAL void rr_csf_write_rxlev_thr(UBYTE rxt, SHORT valno, char* val[MAX_NUM_BANDS]) +{ + GET_INSTANCE_DATA; + UBYTE i, rxlev_thr_val; + UBYTE *rxlev_thr = NULL; + #if defined(_SIMULATION_) + UBYTE *win_rxlev_thr = NULL; + #endif + const char *rxlev_thr_name, *rxlev_thr_string; + rxlev_thr_name = NULL; + rxlev_thr_string = NULL; + TRACE_FUNCTION ("rr_csf_write_rxlev_thr()"); + + switch(rxt) + { + case U_RXT: rxlev_thr_string = "Upper"; + rxlev_thr = &rr_data->dyn_config.upper_rxlev_thr[0]; + rxlev_thr_name = &rr_upper_rxlev_thr_name[0]; +#if defined(_SIMULATION_) + win_rxlev_thr = &win_upper_rxlev_thr[0]; +#endif + break; + case M_RXT: rxlev_thr_string = "Medium"; + rxlev_thr = &rr_data->dyn_config.medium_rxlev_thr[0]; + rxlev_thr_name = &rr_medium_rxlev_thr_name[0]; +#if defined(_SIMULATION_) + win_rxlev_thr = &win_medium_rxlev_thr[0]; +#endif + break; + case L_RXT: rxlev_thr_string = "Lower"; + rxlev_thr = &rr_data->dyn_config.lower_rxlev_thr[0]; + rxlev_thr_name = &rr_lower_rxlev_thr_name[0]; +#if defined(_SIMULATION_) + win_rxlev_thr = &win_lower_rxlev_thr[0]; +#endif + break; + default: + return; + } + + for( i=0 ; i<valno ; i++ ) + { + rxlev_thr_val = atoi(val[i]); + if( rxlev_thr_val > 0 AND rxlev_thr_val <= 63 ) + { + rxlev_thr[i] = rxlev_thr_val; + } + else + { + TRACE_ERROR ("[PEI_CONFIG]: RxLev Threshold(0-63)-Incorrect Range"); + } + } +#if defined(_SIMULATION_) + memcpy(win_rxlev_thr,rxlev_thr,MAX_NUM_BANDS*sizeof(UBYTE)); +#else + rr_csf_check_ffs_dirs(); + rr_csf_handle_ffs_write_result(ffs_file_write(rxlev_thr_name, + rxlev_thr, + MAX_NUM_BANDS*sizeof(UBYTE), + FFS_O_CREATE | FFS_O_RDWR)); +#endif +TRACE_EVENT_P6("%s RxLev Threshold written to FFS: GSM 850=%d, PGSM 900=%d, DCS 1800=%d, PCS 1900=%d, EGSM=%d", + rxlev_thr_string, rxlev_thr[B_GSM_850], rxlev_thr[B_GSM_900], + rxlev_thr[B_DCS_1800], rxlev_thr[B_PCS_1900], rxlev_thr[B_E_GSM] ); + +} + +/* ++------------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_read_rxlev_thr | ++------------------------------------------------------------------------+ + + PURPOSE : This function copies "RXLevel Threshold" information from FFS to RR + internal "RXLevel Threshold" arrays. In case of windows + simulation environment, "RXLevel Threshold" is read from simulated FFS + area. This function is called after power on +*/ + +GLOBAL void rr_csf_read_rxlev_thr(void) +{ + + UBYTE x; + GET_INSTANCE_DATA; + TRACE_FUNCTION ("rr_csf_read_rxlev_thr()"); + + TRACE_EVENT("Read RXLevel thresholds from FFS"); + +#if defined(_SIMULATION_) + memcpy(rr_data->dyn_config.lower_rxlev_thr,win_lower_rxlev_thr, + MAX_NUM_BANDS*sizeof(UBYTE)); + memcpy(rr_data->dyn_config.medium_rxlev_thr,win_medium_rxlev_thr, + MAX_NUM_BANDS*sizeof(UBYTE)); + memcpy(rr_data->dyn_config.upper_rxlev_thr,win_upper_rxlev_thr, + MAX_NUM_BANDS*sizeof(UBYTE)); +#else + rr_csf_check_ffs_dirs(); + if(!rr_csf_handle_ffs_read_result(ffs_file_read (rr_lower_rxlev_thr_name, + rr_data->dyn_config.lower_rxlev_thr, + MAX_NUM_BANDS*sizeof(UBYTE)))) + { + for( x=0 ; x<MAX_NUM_BANDS ; x++ ) + { + rr_data->dyn_config.lower_rxlev_thr[x] = LOWER_RXLEV_THRESHOLD; + } + rr_data->dyn_config.lower_rxlev_thr[B_GSM_850] = LOWER_RXLEV_THRESHOLD_850; + } + if(!rr_csf_handle_ffs_read_result(ffs_file_read (rr_medium_rxlev_thr_name, + rr_data->dyn_config.medium_rxlev_thr, + MAX_NUM_BANDS*sizeof(UBYTE)))) + { + for( x=0 ; x<MAX_NUM_BANDS ; x++ ) + { + rr_data->dyn_config.medium_rxlev_thr[x] = MEDIUM_RXLEV_THRESHOLD; + } + } + if(!rr_csf_handle_ffs_read_result(ffs_file_read (rr_upper_rxlev_thr_name, + rr_data->dyn_config.upper_rxlev_thr, + MAX_NUM_BANDS*sizeof(UBYTE)))) + { + for( x=0 ; x<MAX_NUM_BANDS ; x++ ) + { + rr_data->dyn_config.upper_rxlev_thr[x] = UPPER_RXLEV_THRESHOLD; + } + } +#endif +} + +/* ++-----------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_write_mcc_shield_to_ffs| ++-----------------------------------------------------------------------+ + + PURPOSE : This function writes the mcc shield values to FFS +*/ + +GLOBAL void rr_csf_write_mcc_shield_to_ffs(void) +{ + GET_INSTANCE_DATA; + UBYTE count; + TRACE_FUNCTION ("rr_csf_write_mcc_shield_to_ffs()"); + + rr_csf_check_ffs_dirs(); + rr_csf_handle_ffs_write_result(ffs_file_write (rr_shield_mcc_name, + &rr_data->dyn_config.mcc_shield, + sizeof(T_shield_mcc), + FFS_O_CREATE | FFS_O_RDWR)); + for(count=0;count<MAX_MCC_SHIELD;count++) + { + TRACE_EVENT_P5 ( "Shield MCC=%d%d%d enabled=[%d]index=[%d]", + rr_data->dyn_config.mcc_shield.mcc[count][0], + rr_data->dyn_config.mcc_shield.mcc[count][1], + rr_data->dyn_config.mcc_shield.mcc[count][2], + rr_data->dyn_config.mcc_shield.enabled, + rr_data->dyn_config.mcc_shield.index); + } +} +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_mcc_present | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to find mcc already present or not +*/ + +GLOBAL UBYTE rr_csf_mcc_present(UBYTE* mcc_value) +{ + GET_INSTANCE_DATA; + U8 count = 0; + for(count = 0;count<MAX_MCC_SHIELD;count++) + { + if((memcmp(rr_data->dyn_config.mcc_shield.mcc[count],mcc_value,SIZE_MCC)EQ 0)) + { + return TRUE; + } + } + return FALSE; +} + + +/* ++-----------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_handle_ffs_read_result | ++-----------------------------------------------------------------------+ + + PURPOSE : This function checks the status from FFS and returns + TRUE if there is no error and FALSE if there is +*/ +LOCAL BOOL rr_csf_handle_ffs_read_result(T_FFS_SIZE status_read) +{ + if(status_read>0) + { + TRACE_EVENT ("FFS Read OK"); + return TRUE; + } + else + { + TRACE_EVENT_P1("FFS Read ERROR - %x", status_read); + return FALSE; + } +} + +/* ++------------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_handle_ffs_write_result | ++------------------------------------------------------------------------+ + + PURPOSE : This function checks the status from FFS and returns + TRUE if there is no error and FALSE if there is +*/ +LOCAL BOOL rr_csf_handle_ffs_write_result(T_FFS_RET status_write) +{ + if(status_write >= EFFS_OK) + { + TRACE_EVENT("FFS Write OK"); + if(status_write) + TRACE_EVENT_P1 ("Bytes written: %d",status_write); + + return(TRUE); + } + else + { + TRACE_EVENT_P1 ("FFS Write Error - Status: %x",status_write); + return(FALSE); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_check_ffs_dirs | ++--------------------------------------------------------------------+ + + PURPOSE : This routine creates the /gsm/l3 directory for the last used + sc arfcn in the FFS. The return result indicates whether either + directories existed or not. There is no error handling. +*/ + +LOCAL void rr_csf_check_ffs_dirs( void ) +{ + const char gsm_name[] = "/gsm"; + const char gsm_l3_name[] = "/gsm/l3"; + + rr_csf_create_ffs_dirs(gsm_name); + rr_csf_create_ffs_dirs(gsm_l3_name); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_CSF | +| STATE : code ROUTINE : rr_csf_create_ffs_dirs | ++--------------------------------------------------------------------+ + + PURPOSE : This routine calls the ffs_mkdir() routine to create a + specified directory. It returns whether the directory + existed or not prior to creation. +*/ +LOCAL void rr_csf_create_ffs_dirs(const char *dir_name) +{ + T_FFS_RET status; + + status=ffs_mkdir(dir_name); + switch(status) + { + case EFFS_EXISTS: + case EFFS_OK: + break; + + default: /*Error*/ + TRACE_EVENT_P1("Create Dir error - %x",status); + break; + } +} +#endif /* _SIMULATION_FFS_ */ + +#endif