FreeCalypso > hg > fc-tourmaline
diff src/g23m-gprs/grlc/grlc_pei.c @ 1:fa8dc04885d8
src/g23m-*: import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:25:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/grlc/grlc_pei.c Fri Oct 16 06:25:50 2020 +0000 @@ -0,0 +1,735 @@ +/* ++----------------------------------------------------------------------------- +| Project : GPRS (8441) +| Modul : GRLC ++----------------------------------------------------------------------------- +| Copyright 2002 Texas Instruments Berlin, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| The receipt of or possession of this file does not convey +| any rights to reproduce or disclose its contents or to +| manufacture, use, or sell anything it may describe, in +| whole, or in part, without the specific written consent of +| Texas Instruments Berlin, AG. ++----------------------------------------------------------------------------- +| Purpose : This module implements the process body interface +| for the entity GRLC +| +| Exported functions: +| +| pei_create - Create the Protocol Stack Entity +| pei_init - Initialize Protocol Stack Entity +| pei_primitive - Process Primitive +| pei_timeout - Process Timeout +| pei_exit - Close resources and terminate +| pei_run - Process Primitive +| pei_config - Dynamic Configuration +| pei_monitor - Monitoring of physical Parameters +|+----------------------------------------------------------------------------- +*/ + +#define GRLC_PEI_C + +#define ENTITY_GRLC + +/*==== INCLUDES =============================================================*/ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <stddef.h> /* to get definition of offsetof(), for MAK_FUNC_S */ +#include "typedefs.h" /* to get Condat data types */ +#include "vsi.h" /* to get a lot of macros */ +#include "macdef.h" +#include "gprs.h" + +#include "custom.h" /*FMM*/ /*set FF_EM_MODE compile switch for SIMULATION and define WAP_NAME*/ + +#include "gsm.h" /* to get a lot of macros */ +#include "ccdapi.h" /* to get CCD API */ +#include "cnf_grlc.h" /* to get cnf-definitions */ +#include "mon_grlc.h" /* to get mon-definitions */ +#include "prim.h" /* to get the definitions of used SAP and directions */ +#include "message.h" +#include "tok.h" +#include "pcm.h" +#include "grlc.h" /* to get the global entity definitions */ +#include "grlc_f.h" +#include "grlc_gffp.h" +#include "grlc_tmp.h" +#include "grlc_rup.h" +#include "grlc_rdp.h" +#include "grlc_tpcs.h" +#include "grlc_measp.h" + +#include "grlc_em.h" + +/*==== DEFINITIONS ==========================================================*/ + +#define GRLC_TSTR_ILLEGAL_KEYW 0 +#define GRLC_TSTR_OK 1 + +/*==== TYPES ================================================================*/ + +/*==== GLOBAL VARS ==========================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + + +/* + * Function is needed for grlc_table[]. + */ + +LOCAL SHORT pei_signal (ULONG opc, void *data); + +static BOOL first_access = TRUE; +static T_MONITOR grlc_mon; + + +/* + * Jumptables to primitive handler functions. One table per SAP. + * + * Use MAK_FUNC_0 for primitives which contains no SDU. + * Use MAK_FUNC_S for primitives which contains a SDU. + */ + + +/* + * Function is needed for grlc_table[]. This declaration can be removed + * as soon as this function is no more called (i.e. all primitives are + * handled). + */ +LOCAL void primitive_not_supported (void *data); + +static const T_FUNC grlc_table[] = +{ + MAK_FUNC_S(tm_grlc_data_req, GRLC_DATA_REQ), + MAK_FUNC_S(tm_grlc_unitdata_req, GRLC_UNITDATA_REQ), + MAK_FUNC_0(tm_grlc_activate_gmm_queue_req, GRLC_ACTIVATE_GMM_QUEUE_REQ), + MAK_FUNC_0(tm_grlc_flush_data_req, GRLC_FLUSH_DATA_REQ) +}; + +static const T_FUNC cgrlc_table[] = +{ + MAK_FUNC_0(tm_cgrlc_enable_req, CGRLC_ENABLE_REQ), /* 0x00 */ + MAK_FUNC_0(tm_cgrlc_disable_req, CGRLC_DISABLE_REQ), /* 0x01 */ + MAK_FUNC_0(tm_cgrlc_ul_tbf_res, CGRLC_UL_TBF_RES), /* 0x02 */ + MAK_FUNC_0(tm_cgrlc_dl_tbf_req, CGRLC_DL_TBF_REQ), /* 0x03 */ + MAK_FUNC_0(tm_cgrlc_tbf_rel_req, CGRLC_TBF_REL_REQ), /* 0x04 */ + MAK_FUNC_0(tm_cgrlc_tbf_rel_res, CGRLC_TBF_REL_RES), /* 0x05 */ + MAK_FUNC_0(tm_cgrlc_data_req, CGRLC_DATA_REQ), /* 0x06 */ + MAK_FUNC_0(tm_cgrlc_poll_req, CGRLC_POLL_REQ), /* 0x07 */ + MAK_FUNC_0(tm_cgrlc_access_status_req, CGRLC_ACCESS_STATUS_REQ), /* 0x08 */ + MAK_FUNC_0(tm_cgrlc_test_mode_req, CGRLC_TEST_MODE_REQ), /* 0x09 */ + MAK_FUNC_0(tm_cgrlc_test_end_req, CGRLC_TEST_END_REQ), /* 0x0A */ + MAK_FUNC_0(tm_cgrlc_ta_value_req, CGRLC_TA_VALUE_REQ), /* 0x0B */ + MAK_FUNC_0(meas_int_level_req, CGRLC_INT_LEVEL_REQ), /* 0x0C */ + MAK_FUNC_0(tm_cgrlc_pwr_ctrl_req, CGRLC_PWR_CTRL_REQ), /* 0x0D */ + MAK_FUNC_0(tm_cgrlc_ready_timer_config_req, CGRLC_READY_TIMER_CONFIG_REQ), /* 0x0E */ + MAK_FUNC_0(tm_cgrlc_force_to_standby_req, CGRLC_FORCE_TO_STANDBY_REQ) /* 0x0F */ +}; + + +#ifdef _SIMULATION_ + +static const T_FUNC mac_table[] = +{ + MAK_FUNC_0(gff_mac_data_ind, MAC_DATA_IND), + MAK_FUNC_0(gff_mac_ready_ind, MAC_READY_IND), + MAK_FUNC_0(gff_mac_pwr_ctrl_ind, MAC_PWR_CTRL_IND) +}; + +static const T_FUNC l1test_table[] = +{ + MAK_FUNC_N(primitive_not_supported, 0), + MAK_FUNC_N(primitive_not_supported, 0), + MAK_FUNC_N(primitive_not_supported, 0), + MAK_FUNC_N(primitive_not_supported, 0), + MAK_FUNC_0(gff_l1test_call_mphp_power_control, L1TEST_CALL_MPHP_POWER_CONTROL), + MAK_FUNC_N(primitive_not_supported, 0), + MAK_FUNC_N(primitive_not_supported, 0), +}; + +#endif /* #ifdef _SIMULATION_ */ + + +#ifdef FF_EM_MODE +static const T_FUNC em_ul_table[] = +{ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x00 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x01 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x02 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x03 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x04 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x05 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x06 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x07 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x08 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x09 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x0A */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x0B */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x0C */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x0D */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x0E */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x0F */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x10 */ + MAK_FUNC_0(grlc_em_pco_trace_req, EM_PCO_TRACE_REQ ), /* 0x11*/ /*PCO output*/ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x12 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x13 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x14 */ + MAK_FUNC_0(grlc_em_fmm_rlc_trans_info_req, EM_FMM_RLC_TRANS_INFO_REQ),/* 0x15 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x16 */ + MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x17 */ + MAK_FUNC_0(grlc_em_grlc_info_req, EM_GRLC_INFO_REQ ) /* 0x18 */ + +}; +#endif /* FF_EM_MODE */ + +/*==== END DIAGNOSTICS ======================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/* ++------------------------------------------------------------------------------ +| Function : primitive_not_supported ++------------------------------------------------------------------------------ +| Description : This function handles unsupported primitives. +| +| Parameters : - +| +| Return : - +| ++------------------------------------------------------------------------------ +*/ +LOCAL void primitive_not_supported (void *data) +{ + TRACE_FUNCTION ("primitive_not_supported"); + + PFREE (data); +} + + +/*==== PUBLIC FUNCTIONS =====================================================*/ + +/* ++------------------------------------------------------------------------------ +| Function : pei_primitive ++------------------------------------------------------------------------------ +| Description : This function is called by the frame when a primitive is +| received and needs to be processed. +| +| | | +| GRLC CGRLC UPLINK +| | | +| +------v-----------v-------+ +| | | +| | GRLC | +| | | +| +--------------^------- ---+ +| | +| L1 DOWNLINK +| | +| +| +| Parameters : prim - Pointer to the received primitive +| +| Return : PEI_OK - function succeeded +| PEI_ERROR - function failed +| ++------------------------------------------------------------------------------ +*/ +LOCAL SHORT pei_primitive (void * primptr) +{ + TRACE_FUNCTION ("pei_primitive"); + + if (primptr NEQ NULL) + { + T_PRIM *prim = (T_PRIM *)primptr; + ULONG opc = prim->custom.opc; + USHORT n; + const T_FUNC *table; + + PTRACE_IN (opc); + + /* + * This must be called for Partition Pool supervision. Will be replaced + * by another macro some time. + */ + VSI_PPM_REC (&prim->custom, __FILE__, __LINE__); + + switch (SAP_NR(opc)) + { + case SAP_NR(CGRLC_UL): + table = cgrlc_table; + n = TAB_SIZE (cgrlc_table); + break; +#ifdef _SIMULATION_ + case MAC_DL: + table = mac_table; + n = TAB_SIZE (mac_table); + break; + case SAP_NR(L1TEST_DL): + table = l1test_table; + n = TAB_SIZE (l1test_table); + break; +#endif + case SAP_NR(GRLC_UL): + table = grlc_table; + n = TAB_SIZE (grlc_table); + break; +#ifdef FF_EM_MODE + case EM_Ul: + table = em_ul_table; + n = TAB_SIZE (em_ul_table); + break; +#endif /* FF_EM_MODE */ + default: + table = NULL; + n = 0; + break; + } + + if (table != NULL) + { + if ((PRIM_NR(opc)) < n) + { + table += PRIM_NR(opc); +#ifdef PALLOC_TRANSITION + P_SDU(prim) = table->soff ? (T_sdu*) (((char*)&prim->data) + table->soff) : 0; +#ifndef NO_COPY_ROUTING + P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER); +#endif /* NO_COPY_ROUTING */ +#endif /* PALLOC_TRANSITION */ + JUMP (table->func) (P2D(prim)); + } + else + { + primitive_not_supported (P2D(prim)); + } + return PEI_OK; + } + } + return PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_init ++------------------------------------------------------------------------------ +| Description : This function is called by the frame. It is used to initialise +| the entitiy. +| +| Parameters : handle - task handle +| +| Return : PEI_OK - entity initialised +| PEI_ERROR - entity not (yet) initialised +| ++------------------------------------------------------------------------------ +*/ +LOCAL SHORT pei_init (T_HANDLE handle) +{ + TRACE_FUNCTION ("pei_init"); + + /* + * Initialize task handle + */ + GRLC_handle = handle; + + + /* + * Open communication channels + */ + if (hCommGRLC < VSI_OK) + { + if ((hCommGRLC = vsi_c_open (VSI_CALLER GRLC_NAME)) < VSI_OK) + return PEI_ERROR; + } + if (hCommGRR < VSI_OK) + { + if ((hCommGRR = vsi_c_open (VSI_CALLER GRR_NAME)) < VSI_OK) + return PEI_ERROR; + } + if (hCommGMM < VSI_OK) + { + if ((hCommGMM = vsi_c_open (VSI_CALLER GMM_NAME)) < VSI_OK) + return PEI_ERROR; + } + if (hCommLLC < VSI_OK) + { + if ((hCommLLC = vsi_c_open (VSI_CALLER LLC_NAME)) < VSI_OK) + return PEI_ERROR; + } + if (hCommL1 < VSI_OK) + { + if ((hCommL1 = vsi_c_open (VSI_CALLER L1_NAME)) < VSI_OK) + return PEI_ERROR; + } + + if (hCommPL < VSI_OK) + { + if ((hCommPL = vsi_c_open (VSI_CALLER PL_NAME)) < VSI_OK) + return PEI_ERROR; + } + +#ifdef FF_WAP /*FFM*/ + if (hCommWAP < VSI_OK) + { + if ((hCommWAP = vsi_c_open (VSI_CALLER WAP_NAME)) < VSI_OK) + return PEI_ERROR; + } +#endif + + /* + * call function pcm_Init to be sure that the global variable std + * is set before the initialisation of the GRLC services takes place + */ + pcm_Init(); + + /* + * Initialize entity data (call init function of every service) + */ + grlc_init(); + +/* { + PALLOC (tst_test_hw_req, TST_TEST_HW_REQ); + PSEND (hCommL1, tst_test_hw_req); + }*/ + return (PEI_OK); +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_timeout ++------------------------------------------------------------------------------ +| Description : This function is called by the frame when a timer has expired. +| +| Parameters : index - timer index +| +| Return : PEI_OK - timeout processed +| PEI_ERROR - timeout not processed +| ++------------------------------------------------------------------------------ +*/ +LOCAL SHORT pei_timeout (USHORT index) +{ + TRACE_FUNCTION ("pei_timeout"); + + /* + * Process timeout + */ + switch (index) /* SZML-GLBL/007 */ + { + case T3164: ru_t3164(); break; + case T3166: ru_t3166(); break; + case T3168: tm_t3168(); break; + case T3180: ru_t3180(); break; + case T3182: ru_t3182(); break; + case T3184: ru_t3184(); break; + case T3188: tm_t3188(); break; + case T3190: rd_t3190(); break; + case T3192: rd_t3192(); break; + case T3314: ru_t3314(); break; + default: TRACE_EVENT_P1( "Unknown Timeout: %d", index ); break; + } + + return PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_signal ++------------------------------------------------------------------------------ +| Description : This function is called by the frame when a signal has been +| received. +| +| Parameters : opc - signal operation code +| *data - pointer to primitive +| +| Return : PEI_OK - signal processed +| PEI_ERROR - signal not processed +| ++------------------------------------------------------------------------------ +*/ +LOCAL SHORT pei_signal (ULONG opc, void *data) +{ + + TRACE_FUNCTION ("pei_signal"); + /* + * Process signal + */ + switch (opc) + { + case MAC_DATA_IND: + gff_mac_data_ind(data); + break; + + case MAC_READY_IND: + gff_mac_ready_ind(data); + break; + case MAC_PWR_CTRL_IND: + gff_mac_pwr_ctrl_ind(data); + break; + default: + TRACE_EVENT_P1( "Unknown Signal: %08X", opc ); + break; + } + + + return(PEI_OK); +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_exit ++------------------------------------------------------------------------------ +| Description : This function is called by the frame when the entity is +| terminated. All open resources are freed. +| +| Parameters : - +| +| Return : PEI_OK - exit sucessful +| PEI_ERROR - exit not sueccessful +| ++------------------------------------------------------------------------------ +*/ +LOCAL SHORT pei_exit (void) +{ + TRACE_FUNCTION ("pei_exit"); + + /* + * Close communication channels + */ + vsi_c_close (VSI_CALLER hCommGRLC); + hCommGRLC = VSI_ERROR; + + vsi_c_close (VSI_CALLER hCommGRR); + hCommGRR = VSI_ERROR; + + vsi_c_close (VSI_CALLER hCommGMM); + hCommGMM = VSI_ERROR; + + vsi_c_close (VSI_CALLER hCommLLC); + hCommLLC = VSI_ERROR; + + vsi_c_close (VSI_CALLER hCommL1); + hCommL1 = VSI_ERROR; + + vsi_c_close (VSI_CALLER hCommPL); + hCommPL = VSI_ERROR; + + ccd_exit(); + +#ifdef FF_WAP /*FFM*/ + vsi_c_close (VSI_CALLER hCommWAP); + hCommWAP = VSI_ERROR; +#endif + + return PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_run ++------------------------------------------------------------------------------ +| Description : This function is called by the frame when entering the main +| loop. This fucntion is only required in the active variant. +| +| This function is not used. +| +| Parameters : handle - Communication handle +| +| Return : PEI_OK - sucessful +| PEI_ERROR - not successful +| ++------------------------------------------------------------------------------ +*/ +LOCAL SHORT pei_run (T_HANDLE TaskHandle, T_HANDLE ComHandle ) +{ + + return PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_config ++------------------------------------------------------------------------------ +| Description : This function is called by the frame when a primitive is +| received indicating dynamic configuration. +| +| This function is not used in this entity. +| +| Parameters : handle - Communication handle +| +| Return : PEI_OK - sucessful +| PEI_ERROR - not successful +| ++------------------------------------------------------------------------------ +*/ +#if !defined (NCONFIG) +LOCAL const KW_DATA kwtab[] = + { + GRLC_STR_TPC_PWR_PAR, GRLC_NUM_TPC_PWR_PAR, + GRLC_STR_TPC_FIX_PCL, GRLC_NUM_TPC_FIX_PCL, +#if !defined (NTRACE) + GRLC_STR_TPC_TRACE, GRLC_NUM_TPC_TRACE, + GRLC_STR_IM_TRACE, GRLC_NUM_IM_TRACE, +#endif /* #if !defined (NTRACE) */ + GRLC_STR_CCD_USAGE, GRLC_NUM_CCD_USAGE, + "", 0 + }; +#endif /* #if !defined (NCONFIG) */ + +LOCAL SHORT pei_config (char *inString) +{ +#if !defined (NCONFIG) + char * s = inString; + char * keyw; + char * val [10]; + + TRACE_FUNCTION( "pei_config" ); + + TRACE_EVENT_P1( "[PEI_CONFIG]: %s", inString ); + + tok_init(s); + + /* + * Parse next keyword and number of variables + */ + while ((tok_next(&keyw,val)) NEQ TOK_EOCS) + { + UBYTE ncomment = GRLC_TSTR_OK; + + switch ((tok_key((KW_DATA *)kwtab,keyw))) + { + case GRLC_NUM_TPC_PWR_PAR: + sig_pei_config_tpc_set_pwr_par( ( UBYTE )atoi( val[0] ), + ( UBYTE )atoi( val[1] ) ); + break; + + case GRLC_NUM_TPC_FIX_PCL: + sig_pei_config_tpc_fix_pcl( ( UBYTE )atoi( val[0] ) ); + break; + +#if !defined (NTRACE) + + case GRLC_NUM_TPC_TRACE: + grlc_data->tpc.n_tpc_trace = atoi( val[0] ); + break; + + case GRLC_NUM_IM_TRACE: + grlc_data->meas.v_im_trace = atoi( val[0] ); + break; + +#endif /* #if !defined (NTRACE) */ + + case GRLC_NUM_CCD_USAGE: + grlc_data->grlc_wo_ccd = atoi( val[0] ); + break; + + default: + ncomment = GRLC_TSTR_ILLEGAL_KEYW; + break; + } + + TRACE_EVENT_P2( "[PEI_CONFIG]: %s -> %s", + keyw, + ncomment EQ GRLC_TSTR_OK ? "OK" : "Illegal Keyword" ); + } + +#endif /* #if !defined (NCONFIG) */ + + return PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_config ++------------------------------------------------------------------------------ +| Description : This function is called by the frame in case sudden entity +| specific data is requested (e.g. entity Version). +| +| Parameters : out_monitor - return the address of the data to be +| monitoredCommunication handle +| +| Return : PEI_OK - sucessful (address in out_monitor is valid) +| PEI_ERROR - not successful +| ++------------------------------------------------------------------------------ +*/ +LOCAL SHORT pei_monitor (void ** out_monitor) +{ + TRACE_FUNCTION ("pei_monitor"); + + grlc_mon.version = "GRLC 1.0"; + *out_monitor = &grlc_mon; + + return PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_create ++------------------------------------------------------------------------------ +| Description : This function is called by the frame when the process is +| created. +| +| Parameters : out_name - Pointer to the buffer in which to locate +| the name of this entity +| +| Return : PEI_OK - entity created successfuly +| PEI_ERROR - entity could not be created +| ++------------------------------------------------------------------------------ +*/ +GLOBAL SHORT pei_create (T_PEI_INFO **info) +{ + +static T_PEI_INFO pei_info = + { + "GRLC", /* name */ + { /* pei-table */ + pei_init, + pei_exit, + pei_primitive, + pei_timeout, + pei_signal, + pei_run, + pei_config, + pei_monitor + }, + 2048, /* stack size */ + PEI_PRIM_QUEUE_SIZE, /* queue entries */ + 226, /* priority (1->low, 255->high): GRR 204 RR 205 ALR 225 */ + TIMER_COUNT, /* number of timers */ +#ifdef _TARGET_ + PASSIVE_BODY|COPY_BY_REF|TRC_NO_SUSPEND|PRIM_NO_SUSPEND + | INT_DATA_TASK +#else + PASSIVE_BODY|COPY_BY_REF +#endif + }; + + + TRACE_FUNCTION ("pei_create"); + + /* + * Close Resources if open + */ + if (first_access) + first_access = FALSE; + else + pei_exit(); + + /* + * Export startup configuration data + */ + *info = &pei_info; + + + + return PEI_OK; +} + +/*==== END OF FILE ==========================================================*/