diff src/g23m-aci/uart/uart_drxs.c @ 162:53929b40109c

src/g23m-aci: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 11 Oct 2016 02:02:43 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-aci/uart/uart_drxs.c	Tue Oct 11 02:02:43 2016 +0000
@@ -0,0 +1,831 @@
+/* 
++----------------------------------------------------------------------------- 
+|  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 modul is part of the entity UART and implements all 
+|             functions to handles the incoming process internal signals as  
+|             described in the SDL-documentation (DRX-statemachine)
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef UART_DRXS_C
+#define UART_DRXS_C
+#endif /* !UART_DRXS_C */
+
+#define ENTITY_UART
+
+/*==== INCLUDES =============================================================*/
+
+#ifdef WIN32
+#include "nucleus.h"
+#endif /* WIN32 */
+#include "typedefs.h"   /* to get Condat data types */
+#include "vsi.h"        /* to get a lot of macros */
+#include "macdef.h"     /* to get a lot of macros */
+#include "custom.h"
+#include "gsm.h"        /* to get a lot of macros */
+#include "cnf_uart.h"   /* to get cnf-definitions */
+#include "mon_uart.h"   /* to get mon-definitions */
+#include "prim.h"       /* to get the definitions of used SAP and directions */
+#ifdef DTILIB
+#include "dti.h"        /* to get dti lib */
+#endif /* DTILIB */
+#include "pei.h"        /* to get PEI interface */
+#ifdef FF_MULTI_PORT
+#include "gsi.h"        /* to get definitions of serial driver */
+#else /* FF_MULTI_PORT */
+#ifdef _TARGET_
+#include "uart/serialswitch.h"
+#include "uart/traceswitch.h"
+#else /* _TARGET_ */
+#include "serial_dat.h" /* to get definitions of serial driver */
+#endif /* _TARGET_ */
+#endif /* FF_MULTI_PORT */
+#include "uart.h"       /* to get the global entity definitions */
+
+#include "uart_drxf.h"  /* to get the DRX function declarations */
+#include "uart_kers.h"  /* to get the KER signal declarations */
+#ifdef FF_MULTI_PORT
+#include "uart_ptxs.h"  /* to get signal definitions for service TX */
+#else /* FF_MULTI_PORT */
+#include "uart_txs.h"   /* to get signal definitions for service TX */
+#endif /* FF_MULTI_PORT */
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_drx_ready_mode_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_DRX_READY_MODE_REQ
+|
+| Parameters  : dlc_instance - dlc instance wich belongs to this DRX instance
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_drx_ready_mode_req (UBYTE dlc_instance)
+{
+  TRACE_ISIG( "sig_ker_drx_ready_mode_req" );
+
+  uart_data->drx->dlc_instance = dlc_instance;
+
+  switch( GET_STATE( UART_SERVICE_DRX ) )
+  {
+    case DRX_DEAD:
+      /*
+       * new DLC starts with enabled data flow
+       */
+      uart_data->drx->data_flow = UART_FLOW_ENABLED;
+
+#ifdef DTILIB
+      if((uart_data->drx->dti_drx_state NEQ DTI_CLOSED ) &&
+         (uart_data->drx->sending_state EQ UART_DRX_NOT_SENDING))
+      {
+        /*
+         * signal availability to higher layer if currently not sending
+         */
+        SET_STATE( UART_SERVICE_DRX, DRX_READY );
+#ifdef FLOW_TRACE
+        sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_DOWN, FLOW_TRACE_TOP, TRUE);
+#endif /* FLOW_TRACE */
+        dti_start(
+          uart_hDTI, 
+          uart_data->device, 
+          UART_DTI_UP_INTERFACE, 
+          uart_data->drx->dlc_instance);
+      }
+#else  /* DTILIB */
+      if((uart_data->drx->hComm_DRX_UPLINK NEQ VSI_ERROR ) &&
+         (uart_data->drx->sending_state EQ UART_DRX_NOT_SENDING))
+      {
+        /*
+         * signal availability to higher layer if currently not sending
+         */
+        PALLOC (dti_ready_ind, DTI_READY_IND);
+        SET_STATE( UART_SERVICE_DRX, DRX_READY );
+        dti_ready_ind->tui  = uart_data->tui_uart;
+        dti_ready_ind->c_id = drx_get_channel_id();
+#ifdef _SIMULATION_
+        dti_ready_ind->op_ack = 0;
+#endif /* _SIMULATION_ */
+#ifdef FLOW_TRACE
+        sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_DOWN, FLOW_TRACE_TOP, TRUE);
+#endif /* FLOW_TRACE */
+        PSEND (uart_data->drx->hComm_DRX_UPLINK, dti_ready_ind);
+      }
+#endif /* DTILIB */
+      else
+      {
+        /*
+         * no peer yet, just switch to NOT READY and wait
+         * for the signal SIG_KER_DRX_SET_DTI_PEER_REQ
+         */
+#ifdef DTILIB
+        if(uart_data->drx->dti_drx_state NEQ DTI_CLOSED )
+          dti_stop(
+            uart_hDTI, 
+            uart_data->device, 
+            UART_DTI_UP_INTERFACE, 
+            uart_data->drx->dlc_instance
+            );
+#endif /* DTILIB */
+        SET_STATE( UART_SERVICE_DRX, DRX_NOT_READY );
+      }
+      break;
+
+    case DRX_READY:
+    case DRX_NOT_READY:
+    case DRX_FLUSHING:
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_KER_DRX_READY_MODE_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_drx_ready_mode_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_drx_dead_mode_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_DRX_DEAD_MODE_REQ
+|
+| Parameters  : none
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_drx_dead_mode_req () 
+{ 
+  TRACE_ISIG( "sig_ker_drx_dead_mode_req" );
+  
+  switch( GET_STATE( UART_SERVICE_DRX ) )
+  {
+    case DRX_READY:
+      SET_STATE( UART_SERVICE_DRX, DRX_DEAD );
+      /*
+       * free all resources
+       */
+#ifdef DTILIB
+      uart_data->drx->dti_drx_state = DTI_CLOSED;
+#else  /* DTILIB */
+      uart_data->drx->hComm_DRX_UPLINK = VSI_ERROR;
+#endif /* DTILIB */
+      drx_free_resources();
+      break;
+
+    case DRX_FLUSHING:
+      sig_any_ker_flushed_ind(uart_data->drx->dlc_instance);
+      /* fall through */
+    case DRX_NOT_READY:
+      SET_STATE( UART_SERVICE_DRX, DRX_DEAD );
+
+#ifdef DTILIB
+      uart_data->drx->dti_drx_state = DTI_CLOSED;
+#else  /* DTILIB */
+      uart_data->drx->hComm_DRX_UPLINK = VSI_ERROR;
+#endif /* DTILIB */
+      if(uart_data->drx->sending_state EQ UART_DRX_NOT_SENDING)
+      {
+        /*
+         * signal that there is not any more data available
+         */
+        sig_drx_tx_data_not_available_ind(uart_data->drx->dlc_instance);
+        /*
+         * free all resources:
+         */
+        drx_free_resources();
+      }
+      else
+        uart_data->drx->sending_state = UART_DRX_INVALID;
+      break;
+
+    case DRX_DEAD:
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_KER_DRX_DEAD_MODE_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_drx_dead_mode_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_drx_enable_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_DRX_ENABLE_REQ
+|
+| Parameters  : none
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_drx_enable_req () 
+{
+  TRACE_ISIG( "sig_ker_drx_enable_req" );
+
+  uart_data->drx->data_flow = UART_FLOW_ENABLED;
+
+  switch( GET_STATE( UART_SERVICE_DRX ) )
+  {
+    case DRX_READY:
+      break;
+
+    case DRX_FLUSHING:
+    case DRX_NOT_READY:
+      /*
+       * if DRX is not already sending and there is some data to be sent out,
+       * notify service TX that there is data available
+       */
+      if(uart_data->drx->sending_state EQ UART_DRX_NOT_SENDING)
+      {
+        if(uart_data->drx->received_data)
+          sig_drx_tx_data_available_ind( uart_data->drx->dlc_instance,
+                                         uart_data->drx->received_data, 
+                                         uart_data->drx->read_pos);
+        else
+#ifdef DTILIB
+          if( uart_data->drx->dti_drx_state NEQ DTI_CLOSED )
+          {
+            SET_STATE( UART_SERVICE_DRX, DRX_READY );
+#ifdef FLOW_TRACE
+            sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_DOWN, FLOW_TRACE_TOP, TRUE);
+#endif /* FLOW_TRACE */
+            dti_start(
+              uart_hDTI, 
+              uart_data->device, 
+              UART_DTI_UP_INTERFACE, 
+              uart_data->drx->dlc_instance
+              );
+          }
+#else  /* DTILIB */
+          if(uart_data->drx->hComm_DRX_UPLINK NEQ VSI_ERROR)
+        {
+          /*
+           * nothing more to send,
+           * signal to higher layer that we are able to receive more data
+           */
+          PALLOC (dti_ready_ind, DTI_READY_IND);
+          SET_STATE( UART_SERVICE_DRX, DRX_READY );
+          dti_ready_ind->tui  = uart_data->tui_uart;
+          dti_ready_ind->c_id = drx_get_channel_id();
+#ifdef _SIMULATION_
+          dti_ready_ind->op_ack = 0;
+#endif /* _SIMULATION_ */
+#ifdef FLOW_TRACE
+          sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_DOWN, FLOW_TRACE_TOP, TRUE);
+#endif /* FLOW_TRACE */
+          PSEND (uart_data->drx->hComm_DRX_UPLINK, dti_ready_ind);
+        }
+#endif /* DTILIB */
+      }
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_KER_DRX_ENABLE_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_drx_enable_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_drx_disable_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_DRX_DISABLE_REQ
+|
+| Parameters  : none
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_drx_disable_req () 
+{
+  TRACE_ISIG( "sig_ker_drx_disable_req" );
+
+  uart_data->drx->data_flow = UART_FLOW_DISABLED;
+
+  switch( GET_STATE( UART_SERVICE_DRX ) )
+  {
+    case DRX_READY:
+      break;
+
+    case DRX_FLUSHING:
+    case DRX_NOT_READY:
+      /*
+       * stop sending if possible
+       */
+      if(uart_data->drx->sending_state EQ UART_DRX_NOT_SENDING)
+        sig_drx_tx_data_not_available_ind(uart_data->drx->dlc_instance);
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_KER_DRX_DISABLE_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_drx_disable_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tx_drx_sending_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TX_DRX_SENDING_REQ
+|
+| Parameters  : dummy - description of parameter dummy
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tx_drx_sending_req () 
+{ 
+  TRACE_ISIG( "sig_tx_drx_sending_req" );
+  
+  switch( GET_STATE( UART_SERVICE_DRX ) )
+  {
+    case DRX_FLUSHING:
+    case DRX_NOT_READY:
+      uart_data->drx->sending_state = UART_DRX_SENDING;
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_TX_DRX_SENDING_REQ unexpected" );
+      break;
+  }
+} /* sig_tx_drx_sending_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tx_drx_data_sent_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TX_DRX_DATA_SENT_REQ
+|
+| Parameters  : rest_data - generic data descriptor of "still to send" data
+|                     pos - current position in first rest data buffer
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tx_drx_data_sent_req ( T_desc2 *rest_data, USHORT pos ) 
+{
+  T_desc2 *next_desc;
+  T_desc2 *desc;
+
+  TRACE_ISIG( "sig_tx_drx_data_sent_req" );
+
+  switch( GET_STATE( UART_SERVICE_DRX ) )
+  {
+    case DRX_DEAD:
+      uart_data->drx->sending_state = UART_DRX_NOT_SENDING;
+      /*
+       * Since the service is dead, free all resources and the rest of data
+       */
+      drx_free_resources();
+      break;
+
+    case DRX_NOT_READY:
+      if(uart_data->drx->sending_state EQ UART_DRX_INVALID)
+      {
+        /*
+         * because we are in an invalid sending state, free all resources
+         */
+        drx_free_resources();
+      }
+      else
+      {
+        /*
+         * free all data descriptors in front of the remaining data
+         */
+        desc = uart_data->drx->received_data;
+        while((desc NEQ rest_data) && (desc NEQ NULL))
+        {
+          next_desc = (T_desc2 *)desc->next;           
+          MFREE (desc);                               
+          desc = next_desc;                            
+        }
+        /*
+         * set received_data descriptor to remaining data, remember position
+         */
+        uart_data->drx->received_data = desc;
+        uart_data->drx->read_pos      = pos;
+      }
+
+      uart_data->drx->sending_state = UART_DRX_NOT_SENDING;
+
+      if(uart_data->drx->data_flow EQ UART_FLOW_ENABLED)
+      {
+        if(uart_data->drx->received_data)
+        {
+          /*
+           * data flow is enabled and there is more data to send
+           */
+          sig_drx_tx_data_available_ind(uart_data->drx->dlc_instance,
+                                        uart_data->drx->received_data, 
+                                        uart_data->drx->read_pos);
+        }
+        else 
+          /*
+           * data flow is enabled but there is nothing more to send,
+           * so do positive flow control
+           */
+#ifdef DTILIB
+          if( uart_data->drx->dti_drx_state NEQ DTI_CLOSED )
+          {
+            SET_STATE( UART_SERVICE_DRX, DRX_READY );
+#ifdef FLOW_TRACE
+            sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_DOWN, FLOW_TRACE_TOP, TRUE);
+#endif /* FLOW_TRACE */
+            dti_start(
+              uart_hDTI, 
+              uart_data->device, 
+              UART_DTI_UP_INTERFACE, 
+              uart_data->drx->dlc_instance
+              );
+          }
+#else  /* DTILIB */
+          if(uart_data->drx->hComm_DRX_UPLINK NEQ VSI_ERROR)
+        {
+          PALLOC (dti_ready_ind, DTI_READY_IND);
+          SET_STATE( UART_SERVICE_DRX, DRX_READY );
+          dti_ready_ind->tui  = uart_data->tui_uart;
+          dti_ready_ind->c_id = drx_get_channel_id();
+#ifdef _SIMULATION_
+          dti_ready_ind->op_ack = 0;
+#endif /* _SIMULATION_ */
+#ifdef FLOW_TRACE
+          sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_DOWN, FLOW_TRACE_TOP, TRUE);
+#endif /* FLOW_TRACE */
+          PSEND (uart_data->drx->hComm_DRX_UPLINK, dti_ready_ind);
+        }
+#endif /* DTILIB */
+      }
+      break;
+
+    case DRX_FLUSHING:
+      /*
+       * free all data descriptors in front of the remaining data
+       */
+      desc = uart_data->drx->received_data;
+      while((desc NEQ rest_data) && (desc NEQ NULL))
+      {
+        next_desc = (T_desc2 *)desc->next;           
+        MFREE (desc);                               
+        desc = next_desc;                            
+      }
+      /*
+       * set received_data descriptor to remaining data, remember position
+       */
+      uart_data->drx->received_data = desc;
+      uart_data->drx->read_pos      = pos;
+
+      uart_data->drx->sending_state = UART_DRX_NOT_SENDING;
+
+      if(uart_data->drx->received_data)
+      {
+        if(uart_data->drx->data_flow EQ UART_FLOW_ENABLED)
+          /*
+           * data flow is enabled and there is more data to send
+           */
+          sig_drx_tx_data_available_ind(uart_data->drx->dlc_instance,
+                                        uart_data->drx->received_data, 
+                                        uart_data->drx->read_pos);
+      }
+      else 
+#ifdef DTILIB
+          if(( uart_data->drx->dti_drx_state NEQ DTI_CLOSED ) &&
+              (uart_data->drx->data_flow EQ UART_FLOW_ENABLED))
+          {
+            SET_STATE( UART_SERVICE_DRX, DRX_READY );
+            sig_any_ker_flushed_ind(uart_data->drx->dlc_instance);
+#ifdef FLOW_TRACE
+            sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_DOWN, FLOW_TRACE_TOP, TRUE);
+#endif /* FLOW_TRACE */
+            dti_start(
+              uart_hDTI, 
+              uart_data->device, 
+              UART_DTI_UP_INTERFACE, 
+              uart_data->drx->dlc_instance
+              );
+          }
+#else  /* DTILIB */
+        if((uart_data->drx->hComm_DRX_UPLINK NEQ VSI_ERROR) &&
+              (uart_data->drx->data_flow EQ UART_FLOW_ENABLED))
+      {
+        /*
+         * data flow is enabled but there is nothing more to send,
+         * so send flush signal and positive flow control
+         */
+        PALLOC (dti_ready_ind, DTI_READY_IND);
+        SET_STATE( UART_SERVICE_DRX, DRX_READY );
+        sig_any_ker_flushed_ind(uart_data->drx->dlc_instance);
+        dti_ready_ind->tui  = uart_data->tui_uart;
+        dti_ready_ind->c_id = drx_get_channel_id();
+#ifdef _SIMULATION_
+        dti_ready_ind->op_ack = 0;
+#endif /* _SIMULATION_ */
+#ifdef FLOW_TRACE
+        sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_DOWN, FLOW_TRACE_TOP, TRUE);
+#endif /* FLOW_TRACE */
+        PSEND (uart_data->drx->hComm_DRX_UPLINK, dti_ready_ind);
+      }
+#endif /* DTILIB */
+      else
+      {
+        /*
+         * data flushed
+         */
+        SET_STATE( UART_SERVICE_DRX, DRX_NOT_READY );
+#ifdef DTILIB
+        dti_stop(
+          uart_hDTI, 
+          uart_data->device, 
+          UART_DTI_UP_INTERFACE, 
+          uart_data->drx->dlc_instance
+          );
+#endif /* DTILIB */
+        sig_any_ker_flushed_ind(uart_data->drx->dlc_instance);
+      }
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_TX_DRX_DATA_SENT_REQ unexpected" );
+      break;
+  }
+} /* sig_tx_drx_data_sent_req() */
+
+
+
+#ifdef DTILIB
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_drx_disconnected_mode_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_DRX_DISCONNECTED_MODE_REQ
+|
+| Parameters  : none
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_drx_disconnected_mode_req () 
+{ 
+  TRACE_ISIG( "sig_ker_drx_disconnected_mode_req" );
+  
+  uart_data->drx->dti_drx_state = DTI_CLOSED;
+
+  switch(GET_STATE( UART_SERVICE_DRX) )
+  {
+    case DRX_READY:
+      SET_STATE( UART_SERVICE_DRX, DRX_NOT_READY );
+      break;
+    case DRX_NOT_READY:
+      break;
+    default:
+      TRACE_ERROR( "SIG_KER_DRX_DISCONNECTED_MODE_REQ unexpected" );
+      break;
+  }
+
+} /* sig_ker_drx_disconnected_mode_req() */
+    
+  
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_drx_set_dtilib_peer_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_DRX_SET_DTI_PEER_REQ
+|               which is used to inform the service DRX that from now on it
+|               needs to communicate with a (new) peer
+|
+| Parameters  : -
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_drx_set_dtilib_peer_req ()
+{
+  TRACE_ISIG( "sig_ker_drx_set_dtilib_peer_req" );
+
+  uart_data->drx->dti_drx_state = DTI_IDLE;
+
+  switch( GET_STATE( UART_SERVICE_DRX ) )
+  {
+    case DRX_READY:
+    case DRX_NOT_READY:
+      /*
+       * signal availability to higher layer if currently not sending
+       */
+      if((uart_data->drx->received_data EQ NULL)          &&
+         (uart_data->drx->data_flow EQ UART_FLOW_ENABLED) &&
+         (uart_data->drx->sending_state EQ UART_DRX_NOT_SENDING))
+      {
+        SET_STATE( UART_SERVICE_DRX, DRX_READY );
+#ifdef FLOW_TRACE
+        sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_DOWN, FLOW_TRACE_TOP, TRUE);
+#endif /* FLOW_TRACE */
+        dti_start(
+          uart_hDTI,
+          uart_data->device,
+          UART_DTI_UP_INTERFACE,
+          uart_data->drx->dlc_instance
+          );
+      }
+      else
+      {
+        SET_STATE( UART_SERVICE_DRX, DRX_NOT_READY );
+        dti_stop(
+          uart_hDTI, 
+          uart_data->device, 
+          UART_DTI_UP_INTERFACE,
+          uart_data->drx->dlc_instance
+          );
+      }
+      break;
+
+    case DRX_FLUSHING:
+    case DRX_DEAD:
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_KER_DRX_SET_DTI_PEER_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_drx_set_dtilib_peer_req() */
+
+
+#else  /* DTILIB */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_drx_set_dti_peer_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_DRX_SET_DTI_PEER_REQ
+|               which is used to inform the service DRX that from now on it
+|               needs to communicate with a (new) peer
+|
+| Parameters  : tui_peer    - transmission unit identifier of peer
+|               peer_handle - VSI handle of peer (channel has to be opened)
+|               c_id        - channel identifier of peer
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_drx_set_dti_peer_req (USHORT tui_peer, 
+                                          T_HANDLE peer_handle, 
+                                          UBYTE c_id) 
+{
+  USHORT i,pos;
+
+  TRACE_ISIG( "sig_ker_drx_set_dti_peer_req" );
+
+  /*
+   * set new vsi handle and
+   */
+  uart_data->drx->hComm_DRX_UPLINK = peer_handle;
+
+  /* 
+   * search position in table
+   */
+  pos = UART_INSTANCES * UART_MAX_NUMBER_OF_CHANNELS;
+  for(i = 0; i < pos; i++)
+  {
+    if((uart_cid_table[i].drx EQ uart_data->drx) ||
+       (uart_cid_table[i].c_id EQ c_id))
+    {
+      pos = i;
+    }
+  }
+
+  if(pos < (UART_INSTANCES * UART_MAX_NUMBER_OF_CHANNELS))
+  {
+    /*
+     * valid position in table, update entry
+     */
+    uart_cid_table[pos].c_id      = c_id;
+    uart_cid_table[pos].drx       = uart_data->drx;
+    uart_cid_table[pos].uart_data = uart_data;
+  }
+  else
+  {
+    /*
+     * create new entry in table
+     */
+    for(i = 0; i < UART_INSTANCES * UART_MAX_NUMBER_OF_CHANNELS; i++)
+    {
+      if(uart_cid_table[i].dtx EQ NULL)
+      {
+        /*
+         * free space found, insert data
+         */ 
+        uart_cid_table[i].c_id      = c_id;
+        uart_cid_table[i].drx       = uart_data->drx;
+        uart_cid_table[i].uart_data = uart_data;
+        break;
+      }
+    }
+  }
+
+  switch( GET_STATE( UART_SERVICE_DRX ) )
+  {
+    case DRX_READY:
+    case DRX_NOT_READY:
+      /*
+       * signal availability to higher layer if currently not sending
+       */
+      if((uart_data->drx->received_data EQ NULL)          &&
+         (uart_data->drx->data_flow EQ UART_FLOW_ENABLED) &&
+         (uart_data->drx->sending_state EQ UART_DRX_NOT_SENDING))
+      {
+        PALLOC (dti_ready_ind, DTI_READY_IND);
+        SET_STATE( UART_SERVICE_DRX, DRX_READY );
+        dti_ready_ind->tui  = uart_data->tui_uart;
+        dti_ready_ind->c_id = drx_get_channel_id();
+#ifdef _SIMULATION_
+        dti_ready_ind->op_ack = 0;
+#endif /* _SIMULATION_ */
+#ifdef FLOW_TRACE
+        sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_DOWN, FLOW_TRACE_TOP, TRUE);
+#endif /* FLOW_TRACE */
+        PSEND (uart_data->drx->hComm_DRX_UPLINK, dti_ready_ind);
+      }
+      else
+      {
+        SET_STATE( UART_SERVICE_DRX, DRX_NOT_READY );
+      }
+      break;
+
+    case DRX_FLUSHING:
+    case DRX_DEAD:
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_KER_DRX_SET_DTI_PEER_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_drx_set_dti_peer_req() */
+
+#endif /* DTILIB */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_drx_flush_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_DRX_FLUSH_REQ which is used
+|               to trigger flushing of the service.
+|
+| Parameters  : no parameters
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_drx_flush_req () 
+{
+  TRACE_ISIG( "sig_ker_drx_flush_req" );
+
+  switch( GET_STATE( UART_SERVICE_DRX ) )
+  {
+    case DRX_READY:
+      sig_any_ker_flushed_ind(uart_data->drx->dlc_instance);
+      break;
+
+    case DRX_NOT_READY:
+      if((uart_data->drx->received_data) &&
+         (uart_data->drx->sending_state NEQ UART_DRX_INVALID))
+      {
+        SET_STATE( UART_SERVICE_DRX, DRX_FLUSHING );
+      }
+      else
+      {
+        sig_any_ker_flushed_ind(uart_data->drx->dlc_instance);
+      }
+      break;
+
+    case DRX_FLUSHING:
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_KER_DRX_FLUSH_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_drx_flush_req() */