line source
/*
+-----------------------------------------------------------------------------
| 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 implements the process body interface
| for the entity DL of the mobile station.
+-----------------------------------------------------------------------------
*/
#ifndef DL_PEI_C
#define DL_PEI_C
#include "config.h"
#include "fixedconf.h"
#include "condat-features.h"
#define ENTITY_DL
/*==== INCLUDES ===================================================*/
#include "typedefs.h"
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
#include "vsi.h"
#include "pconst.cdg"
#include "custom.h"
#include "gsm.h"
#include "mon_dl.h"
#include "prim.h"
#include "pei.h"
#include "tok.h"
#include "ccdapi.h"
#include "dl.h"
#include "dl_em.h"
#include "dl_trc.h"
/*==== EXPORT =====================================================*/
#ifdef TI_PS_HCOMM_CHANGE
#else
GLOBAL T_HANDLE hCommDL = VSI_ERROR; /* Self Communication */
GLOBAL T_HANDLE hCommRR = VSI_ERROR; /* RR Communication */
GLOBAL T_HANDLE hCommPL = VSI_ERROR; /* PL Communication */
#ifdef FF_EM_MODE
GLOBAL T_HANDLE hCommMMI = VSI_ERROR; /* EM Communication */
#endif /* FF_EM_MODE */
#endif
GLOBAL USHORT dl_handle;
/*==== PRIVATE ====================================================*/
LOCAL void pei_not_supported (void *data);
LOCAL int dl_process_signal (ULONG opc, void *signal_data);
LOCAL SHORT pei_signal (T_SIGNAL_OPC opc, void *signal_data);
/*==== VARIABLES ==================================================*/
#ifdef _SIMULATION_
static UBYTE first_access = TRUE;
#endif /* _SIMULATION_ */
static T_MONITOR dl_mon;
/*==== FUNCTIONS ==================================================*/
/* Please consider that the opc's are not necessarily sorted
* in sequential order.
* DL doesn't use the normal technique to get the primitive from the table.
* Instead it uses the direct search and compare:
* for (i=0; i<n; i++, table++)
* if (table->opc EQ opc)
* break;
*/
LOCAL const T_FUNC dl_table[] = {
MAK_FUNC_S( drr_dl_establish_req , DL_ESTABLISH_REQ ), /* 0x80000003 */
MAK_FUNC_N( pei_not_supported , 0 ), /* 0x80010003 */
MAK_FUNC_0( drr_dl_release_req , DL_RELEASE_REQ ), /* 0x80020003 */
MAK_FUNC_N( pei_not_supported , 0 ), /* 0x80030003 */
MAK_FUNC_S( drr_dl_data_req , DL_DATA_REQ ), /* 0x80040003 */
MAK_FUNC_N( pei_not_supported , 0 ), /* 0x80050003 */
MAK_FUNC_S( drr_dl_unitdata_req , DL_UNITDATA_REQ ), /* 0x80060003 */
MAK_FUNC_N( pei_not_supported , 0 ), /* 0x80070003 */
MAK_FUNC_0( drr_dl_suspend_req , DL_SUSPEND_REQ ), /* 0x80080003 */
MAK_FUNC_N( pei_not_supported , 0 ), /* 0x80090003 */
MAK_FUNC_S( drr_dl_resume_req , DL_RESUME_REQ ), /* 0x800a0003 */
MAK_FUNC_N( pei_not_supported , 0 ), /* 0x800b0003 */
MAK_FUNC_S( drr_dl_reconnect_req , DL_RECONNECT_REQ ), /* 0x800c0003 */
MAK_FUNC_N( pei_not_supported , 0 ), /* 0x800d0003 */
#if defined (DL_TRACE_ENABLED) && !defined(DL_IMMEDIATE_TRACE)
MAK_FUNC_0( dl_trace_read_all , DL_TRACE_REQ ), /* 0x800e0003 */
#else
MAK_FUNC_N( pei_not_supported , 0 ), /* 0x800e0003 */
#endif /* DL_TRACE_ENABLED && !DL_IMMEDIATE_TRACE */
MAK_FUNC_N( pei_not_supported , 0 ), /* 0x800f0003 */
MAK_FUNC_S( drr_dl_short_unitdata_req , DL_SHORT_UNITDATA_REQ) /* 0x80100003 */
};
LOCAL const T_FUNC mphc_table[] = {
MAK_FUNC_0( dph_ph_data_ind, PH_DATA_IND ) /* 0x0000006d */
};
#if defined (DL_2TO1)
#if defined(_SIMULATION_)
LOCAL const T_FUNC l1_test_table[] = {
MAK_FUNC_0( l1test_call_mphc_read_dcch, L1TEST_CALL_MPHC_READ_DCCH ), /* 8000409b */
MAK_FUNC_N( pei_not_supported , 0 ) /* removed */
MAK_FUNC_N( pei_not_supported , 0 ) /* removed */
};
#endif /* _SIMULATION_ */
#else /* DL_2TO1 */
LOCAL const T_FUNC mdl_table[] = {
MAK_FUNC_0( drr_mdl_release_req , MDL_RELEASE_REQ ) /* 0x80004004 */
};
#if defined (_SIMULATION_) || (defined (DL_TRACE_ENABLED) && !defined(DL_IMMEDIATE_TRACE))
LOCAL const T_FUNC ph_table[] = {
#if defined(_SIMULATION_)
MAK_FUNC_0( dph_ph_ready_to_send , PH_READY_TO_SEND ), /* 0x4100 */
#else
MAK_FUNC_N( pei_not_supported , 0 ), /* 0x4100 */
#endif /* _SIMULATION_ */
MAK_FUNC_N( pei_not_supported , 0 ), /* 0x4101 */
#if defined (DL_TRACE_ENABLED) && !defined(DL_IMMEDIATE_TRACE)
MAK_FUNC_0( dl_trace_read , PH_TRACE_IND ) /* 0x4102 */
#else
MAK_FUNC_N( pei_not_supported , 0 ) /* 0x4102 */
#endif /* DL_TRACE_ENABLED && !DL_IMMEDIATE_TRACE*/
};
#endif /* _SIMULATION_||(DL_TRACE_ENABLED&& !DL_IMMEDIATE_TRACE) */
#endif /* DL_2TO1 */
#ifdef FF_EM_MODE
LOCAL const T_FUNC em_ul_table[] = {
MAK_FUNC_0( dl_em_dl_event_req , EM_DL_EVENT_REQ ), /* 0x3e0A*/
};
#endif /* FF_EM_MODE */
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : DL_PEI |
| STATE : code ROUTINE : pei_primitive |
+--------------------------------------------------------------------+
PURPOSE : Process protocol specific primitive.
*/
LOCAL SHORT pei_primitive (void * ptr)
{
GET_INSTANCE_DATA;
T_PRIM *prim = (T_PRIM*)ptr;
/*
* | |
* DL MDL
* | |
* +------v------------v------+
* | |
* | DL |
* | |
* +-------------^------------+
* |
* MPHC/PH
* |
*
*/
TRACE_FUNCTION ("pei_primitive()");
if (prim NEQ NULL)
{
ULONG opc = prim->custom.opc;
USHORT n;
const T_FUNC *table;
VSI_PPM_REC ((T_PRIM_HEADER*)prim, __FILE__, __LINE__);
PTRACE_IN (opc);
switch (SAP_NR(opc))
{
case SAP_NR(DL_UL): table = dl_table; n = TAB_SIZE (dl_table); break;
/*case SAP_NR(MPHC_UL):*/ /* same as MPHC_DL */
case SAP_NR(MPHC_DL):
table = mphc_table;
n = TAB_SIZE (mphc_table);
/*
* The opcodes for MPHC_DL start at 0x6d
*/
opc -= 0x6d;
break;
#if defined (DL_2TO1)
#if defined(_SIMULATION_)
case SAP_NR(L1TEST_UL):
case SAP_NR(L1TEST_DL): table = l1_test_table; n = TAB_SIZE (l1_test_table); break;
#endif /* _SIMULATION_ */
#else /* DL_2TO1 */
case SAP_NR(MDL_DL): table = mdl_table; n = TAB_SIZE (mdl_table); break;
#if defined (_SIMULATION_) || (defined (DL_TRACE_ENABLED) && !defined(DL_IMMEDIATE_TRACE))
case SAP_NR(PH_UL):
case SAP_NR(PH_DL): table = ph_table; n = TAB_SIZE (ph_table); break;
#endif /* _SIMULATION_||(DL_TRACE_ENABLED&&!DL_IMMEDIATE_TRACE) */
#endif /* DL_2TO1 */
#ifdef FF_EM_MODE
case EM_Ul:
table = em_ul_table;
n = TAB_SIZE (em_ul_table);
/*
* The opcodes for EM_Ul start at 0x0a
*/
opc -= 0x0a;
break;
#endif /* FF_EM_MODE*/
default : table = NULL; n = 0; break;
}
if (table)
{
#if defined (_SIMULATION_)
if (opc NEQ PH_READY_TO_SEND)
/*
* this simulates function call of layer 1 in the
* windows environment
*/
#endif /* _SIMULATION_ */
dl_data->dl_active = TRUE;
if (PRIM_NR(opc)<n)
{
table += PRIM_NR(opc);
#ifdef PALLOC_TRANSITION
/*lint -e661 (Warning -- Possible access of out-of-bounds) */
P_SDU(prim) = table->soff ? (T_sdu*) (((char*)&prim->data) + table->soff) : 0;
/*lint +e661 (Warning -- Possible access of out-of-bounds) */
#ifndef NO_COPY_ROUTING
P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER);
#endif /* NO_COPY_ROUTING */
#endif /* PALLOC_TRANSITION */
#if defined (DL_TRACE_ENABLED) && !defined(DL_2TO1)
if ((opc EQ DL_TRACE_REQ) OR (opc EQ PH_TRACE_IND))
/*lint -e661 (Warning -- Possible access of out-of-bounds) */
JUMP (table->func)();
/*lint +e661 (Warning -- Possible access of out-of-bounds) */
else
#endif /* DL_TRACE_ENABLED && !DL_2TO1 */
/*lint -e661 (Warning -- Possible access of out-of-bounds) */
JUMP (table->func) (P2D(prim));
/*lint +e661 (Warning -- Possible access of out-of-bounds) */
}
else
{
pei_not_supported (P2D(prim));
}
dl_data->dl_active = FALSE;
return PEI_OK;
}
#if defined (_SIMULATION_)
/* TDC is not able to send signals, therefore the redirection over primitives */
if (opc EQ DL_SIGNAL_EM_READ)
{ /* test ACI read of EM buffer only */
return dl_process_signal(DL_SIGNAL_EM_READ, NULL);
}
#endif /* _SIMULATION_ */
/*
* Primitive is no GSM Primitive
* then forward to the environment
*/
#ifdef GSM_ONLY
MY_PFREE (P2D(prim))
return PEI_ERROR;
#else
if (opc & SYS_MASK)
vsi_c_primitive (VSI_CALLER prim);
else
{
void* p = (void*)P2D(prim);
MY_PFREE (p);
return PEI_ERROR;
}
#endif
}
return PEI_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : DL_PEI |
| STATE : code ROUTINE : pei_not_supported |
+--------------------------------------------------------------------+
PURPOSE : An unsupported primitive is received.
*/
LOCAL void pei_not_supported (void * data)
{
TRACE_FUNCTION ("pei_not_supported()");
MY_PFREE (data);
}
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : DL_PEI |
| STATE : code ROUTINE : pei_init |
+--------------------------------------------------------------------+
PURPOSE : Initialize Protocol Stack Entity
*/
LOCAL SHORT pei_init (T_HANDLE handle)
{
dl_handle = handle;
TRACE_FUNCTION ("pei_init() " __DATE__ " " __TIME__);
#ifdef TI_PS_HCOMM_CHANGE
if (!cl_hcom_all_handles_open())
{
return PEI_ERROR;
}
#else /* for hCommHandles backward compatibility */
if (hCommDL < VSI_OK)
{
if ((hCommDL = vsi_c_open (VSI_CALLER DL_NAME)) < VSI_OK)
return PEI_ERROR;
}
if (hCommRR < VSI_OK)
{
if ((hCommRR = vsi_c_open (VSI_CALLER RR_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_EM_MODE
if (hCommMMI < VSI_OK)
{
if ((hCommMMI = vsi_c_open (VSI_CALLER ACI_NAME)) < VSI_OK)
return PEI_ERROR;
}
#endif /* FF_EM_MODE */
#endif
TRC_INIT ();
#if !defined(_SIMULATION_)
TRACE_EVENT (dl_version());
SYST_TRACE (dl_version());
#endif /* !_SIMULATION_ */
/*
* Initialize data base
*/
#if defined(DL_TRACE_ENABLED) && !defined(DL_IMMEDIATE_TRACE)
dl_trace_init ();
#endif /* DL_TRACE_ENABLED && !DL_IMMEDIATE_TRACE*/
com_init_data ();
dcch0_init_dl_data ();
sacch0_init_dl_data ();
#ifdef FF_EM_MODE
/*
initialise event flags
*/
em_init_dl_event_trace();
/*
initialise dl semaphor for EM event tracing
*/
em_dl_sem_init();
#endif /* FF_EM_MODE */
return PEI_OK;
}
#ifdef _SIMULATION_
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : DL_PEI |
| STATE : code ROUTINE : pei_exit |
+--------------------------------------------------------------------+
PURPOSE : Close Resources and terminate
*/
LOCAL SHORT pei_exit (void)
{
TRACE_FUNCTION ("pei_exit()");
#if defined(DL_TRACE_ENABLED) && !defined(DL_IMMEDIATE_TRACE)
dl_trace_exit ();
#endif /* DL_TRACE_ENABLED && !DL_IMMEDIATE_TRACE*/
#ifdef FF_EM_MODE
em_dl_sem_exit();
#endif /* FF_EM_MODE */
/*
* clean up communication
*/
#ifdef TI_PS_HCOMM_CHANGE
#else /* for hCommHandles backward compatibility */
vsi_c_close (VSI_CALLER hCommDL);
hCommDL = VSI_ERROR;
vsi_c_close (VSI_CALLER hCommRR);
hCommRR = VSI_ERROR;
vsi_c_close (VSI_CALLER hCommPL);
hCommPL = VSI_ERROR;
#ifdef FF_EM_MODE
vsi_c_close (VSI_CALLER hCommMMI);
hCommMMI = VSI_ERROR;
#endif /* FF_EM_MODE */
#endif
TRC_EXIT ();
return PEI_OK;
}
#endif /* _SIMULATION_ */
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : DL_PEI |
| STATE : code ROUTINE : pei_config |
+--------------------------------------------------------------------+
PURPOSE : Dynamic Configuration
*/
/* Implements Measure#36 */
#ifdef NCONFIG
#else /* NCONFIG */
LOCAL SHORT pei_config (T_PEI_CONFIG inString)
{
return PEI_OK;
}
#endif /* NCONFIG */
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : DL_PEI |
| STATE : code ROUTINE : dl_pei_config |
+--------------------------------------------------------------------+
PURPOSE : Dynamic Configuration
*/
/* Implements Measure#36 */
#ifdef NCONFIG
#else /* NCONFIG */
GLOBAL T_PEI_RETURN dl_pei_config ( char * inString, char * dummy )
{
return pei_config ( inString );
}
#endif /* NCONFIG */
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : DL_PEI |
| STATE : code ROUTINE : pei_monitor |
+--------------------------------------------------------------------+
PURPOSE : Monitoring of physical Parameters
*/
LOCAL SHORT pei_monitor (void ** monitor)
{
TRACE_FUNCTION ("pei_monitor()");
/* Implements Measure#32: Row 50 */
* monitor = &dl_mon;
return PEI_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : DL_PEI |
| STATE : code ROUTINE : pei_create |
+--------------------------------------------------------------------+
PURPOSE : Create the Protocol Stack Entity
*/
/*
* New Frame
*/
GLOBAL T_PEI_RETURN dl_pei_create (T_PEI_INFO **info)
{
static const T_PEI_INFO pei_info =
{
"DL",
{
pei_init,
#ifdef _SIMULATION_
pei_exit,
#else
NULL,
#endif
pei_primitive,
NULL, /* no timeout function */
pei_signal, /* signal function */
NULL, /* no run function */
/* Implements Measure#36 */
#ifdef NCONFIG
NULL, /* no pei_config function */
#else /* NCONFIG */
pei_config,
#endif /* NCONFIG */
pei_monitor,
},
#if defined (GPRS)
1536, /* Stack Size incresed for omaps00140330 */
#else
#if defined (FAX_AND_DATA)
1536, /* Stack Size incresed for omaps00140330 */
#else
1394, /* Stack Size incresed for omaps00140330 */
#endif
#endif
10+DL_SIGNAL_DATA_ELEMENTS, /* Queue Entries */
215, /* Priority */
0, /* number of timer */
/* flags */
#ifdef _TARGET_
#ifdef GPRS
PASSIVE_BODY|COPY_BY_REF|TRC_NO_SUSPEND|PRIM_NO_SUSPEND
#else
PASSIVE_BODY|COPY_BY_REF|TRC_NO_SUSPEND|PRIM_NO_SUSPEND
#endif
#else
PASSIVE_BODY|COPY_BY_REF
#endif
};
TRACE_FUNCTION ("pei_create");
/*
* Close Resources if open
*/
#ifdef _SIMULATION_
if (first_access)
first_access = FALSE;
else
pei_exit ();
#endif
/*
* export startup configuration data
*/
*info = (T_PEI_INFO *)&pei_info;
/*
* Initialize entity data
*/
/*
* Initialize Condat Coder Decoder and
* processes
*/
return PEI_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : DL_PEI |
| STATE : code ROUTINE : pei_signal |
+--------------------------------------------------------------------+
PURPOSE : Functional interface to signal a primitive.
*/
LOCAL SHORT pei_signal (T_SIGNAL_OPC opc, void *signal_data)
{
#ifdef TRACE_FKT
{
char buf[24];
sprintf(buf, "pei_signal (0x%lx)", (ULONG)opc);
TRACE_FUNCTION (buf);
PTRACE_IN(opc);
}
#elif defined(_SIMULATION_)
TRACE_EVENT_WIN_P1 ("pei_signal (0x%lx)", (ULONG)opc);
#endif
dl_process_signal ((ULONG)opc, signal_data);
return PEI_OK;
}
LOCAL int dl_process_signal (ULONG opc, void *signal_data)
{
/*TRACE_FUNCTION ("pei_process_signal()");*/
GET_INSTANCE_DATA;
switch (opc)
{
#if defined(DL_TRACE_ENABLED) && !defined (DL_IMMEDIATE_TRACE) && !defined(DL_2TO1)
case DL_TRACE_REQ: /* RR -> DL */
SYST_TRACE("call dl_trace_read_all()");
dl_trace_read_all ();
break;
case PH_TRACE_IND: /* ALR/TIL -> DL */
dl_trace_read ();
break;
#endif /* DL_TRACE_ENABLED && !DL_IMMEDIATE_TRACE &6 !DL_2TO1 */
#if defined(INVOKE_SIGNAL)
case DL_SIGNAL_ESTABLISH_IND:
sig_handle_drr_dl_establish_ind ((T_DL_SIGNAL_DATA *) signal_data);
break;
case DL_SIGNAL_ESTABLISH_CNF:
sig_handle_drr_dl_establish_cnf ((T_DL_SIGNAL_DATA *) signal_data);
break;
case DL_SIGNAL_DATA_IND:
sig_handle_com_data_ind ((T_DL_SIGNAL_DATA *) signal_data);
break;
case DL_SIGNAL_DATA_CNF:
sig_handle_drr_dl_data_cnf ((T_DL_SIGNAL_DATA *) signal_data);
break;
#if 0 /* happens in primitive context only */
case DL_SIGNAL_UNITDATA_IND:
sig_handle_drr_dl_unitdata_ind (dl_data, (T_DL_SIGNAL_DATA *) signal_data);
break;
#endif /* 0 */
case DL_SIGNAL_SHORT_UNITDATA_IND:
sig_handle_drr_dl_short_unitdata_ind ((T_DL_SIGNAL_DATA *) signal_data);
break;
case DL_SIGNAL_RELEASE_IND:
sig_handle_drr_dl_release_ind ((T_DL_SIGNAL_DATA *) signal_data);
break;
case DL_SIGNAL_RELEASE_CNF:
sig_handle_drr_dl_release_cnf ((T_DL_SIGNAL_DATA *) signal_data);
break;
case DL_SIGNAL_ERROR_IND:
sig_handle_drr_error_ind ((T_DL_SIGNAL_DATA *) signal_data);
break;
case DL_SIGNAL_FREE_POINTER:
sig_handle_com_free_pointer ((T_DL_SIGNAL_DATA *) signal_data);
break;
case DL_SIGNAL_CONCATENATE:
sig_handle_com_concatenate((T_DL_SIGNAL_DATA *) signal_data);
break;
#if defined(DL_TRACE_ENABLED)
case DL_SIGNAL_L2TRACE:
sig_handle_com_l2trace ((T_DL_SIGNAL_DATA *) signal_data);
break;
#endif /*DL_TRACE_ENABLED*/
case DL_SIGNAL_L3TRACE:
sig_handle_com_l3trace((T_DL_SIGNAL_DATA *) signal_data);
break;
#if defined(FF_EM_MODE)
case DL_SIGNAL_EM_IND:
sig_handle_dl_em_first_event_check ();
break;
case DL_SIGNAL_EM_WRITE:
sig_handle_dl_em_write (dl_data, (T_DL_SIGNAL_DATA *) signal_data);
break;
#if defined(_SIMULATION_)
case DL_SIGNAL_EM_READ:
{
T_MONITOR *dummy;
em_dl_sem_read ();
em_dl_sem_reset ();
pei_monitor (&dummy);
TRACE_EVENT_WIN (dummy->version);
}
break;
#endif /* _SIMULATION_ */
#endif /* FF_EM_MODE */
#endif /* INVOKE_SIGNAL */
default:
break;
}
#if defined(INVOKE_SIGNAL)
if (signal_data)
{
TRACE_EVENT_WIN_P1 ("pei_process_signal(): set data with idx=%u to FREE",
((T_DL_SIGNAL_DATA *)signal_data)->idx);
((T_DL_SIGNAL_DATA *)signal_data)->busy = FALSE;
}
#endif /* INVOKE_SIGNAL */
return PEI_OK;
}/* dl_process_signal */
GLOBAL UBYTE * dl_get_sacch_buffer (void)
{
GET_INSTANCE_DATA;
return dl_data->sacch_act_buffer.buf;
}
#endif /* DL_PEI_C */