diff src/g23m-fad/rlp/rlp_kerp.c @ 174:90eb61ecd093

src/g23m-fad: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 12 Oct 2016 05:40:46 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-fad/rlp/rlp_kerp.c	Wed Oct 12 05:40:46 2016 +0000
@@ -0,0 +1,708 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  CSD (8411)
+|  Modul   :  Rlp_kerp.c
++----------------------------------------------------------------------------- 
+|  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 defines the functions for processing
+|             of incomming primitives for the component
+|             Radio Link Protocol of the base station
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef RLP_KERP_C
+#define RLP_KERP_C
+#endif
+
+#define ENTITY_RLP
+
+/*==== INCLUDES ===================================================*/
+
+#include <string.h>
+#include "typedefs.h"
+#include "vsi.h"
+#include "macdef.h"
+#include "custom.h"
+#include "gsm.h"
+#include "cus_rlp.h"
+#include "prim.h"
+#include "tok.h"
+#include "rlp.h"
+
+/*==== CONST =======================================================*/
+
+/*==== TYPES =======================================================*/
+
+/*==== VAR EXPORT ==================================================*/
+
+/*==== VAR LOCAL ===================================================*/
+
+/*==== FUNCTIONS ===================================================*/
+
+/*
++------------------------------------------------------------------------------
+|  Function    : ker_rlp_attach_req
++------------------------------------------------------------------------------
+|  Description : Process primitive RLP_ATTACH_REQ received from L2R.
+|
+|  Parameters  : rlp_attach_req - 
+|                 
+|
+|  Return      : -
++------------------------------------------------------------------------------
+*/
+
+
+GLOBAL void ker_rlp_attach_req
+                  (
+                    T_RLP_ATTACH_REQ *rlp_attach_req
+                  )
+{
+  TRACE_FUNCTION ("ker_rlp_attach_req()");
+  PACCESS        (rlp_attach_req);
+
+  /*******************************/
+  /*
+   *  Initialize Shared Fax/Data memory
+   */
+  memset (rlp_data, 0, sizeof (T_RLP_DATA));
+
+  ker_init (); 
+  snd_init (&rlp_data->snd);
+  rcv_init ();
+
+  rlp_data->uplink_frame_trace   = FALSE;
+  rlp_data->downlink_frame_trace = FALSE;
+
+  rbm_reset(&rlp_data->rbm);
+  rlp_data_magic_num = RLP_DATA_MAGIC_NUM;       /* memory is initialized */
+
+  /*******************************/
+
+  switch (GET_STATE (KER))
+  {
+    case RLP_ADM_AND_DETACHED:
+      /*
+       * processing for state RLP_ADM_AND_DETACHED
+       */
+      
+      rlp_data->ker.Poll_xchg    = IW_IDLE;
+      rlp_data->ker.SABM_State   = ISW_IDLE;
+      rlp_data->ker.T1           = GEN_TO;
+      rlp_data->ker.T_ul         = (USHORT)UL_TO;
+      rlp_data->ker.BytesPerPrim = rlp_attach_req->bytes_per_prim;
+
+      ker_set_frame_size (rlp_attach_req->rate);
+
+      ker_get_frame_desc (rlp_data->ker.UI_Frame,
+                          &rlp_data->ker.UI_FrameDesc);
+
+      ker_get_frame_desc (rlp_data->ker.XID_C_Frame,
+                          &rlp_data->ker.XID_C_FrameDesc);
+
+      ker_get_frame_desc (rlp_data->ker.XID_R_Frame,
+                          &rlp_data->ker.XID_R_FrameDesc);
+
+      ker_get_frame_desc (rlp_data->ker.TEST_R_Frame,
+                          &rlp_data->ker.TEST_R_FrameDesc);
+      
+      ker_get_frame_desc (rlp_data->ker.REMAP_Frame,
+                          &rlp_data->ker.REMAP_FrameDesc);
+      
+      rlp_data->ker.TEST_R_State = IS_IDLE;
+      rlp_data->ker.UA_State     = IS_IDLE;
+      rlp_data->ker.UI_State     = IS_IDLE;
+      rlp_data->ker.XID_R_State  = IS_IDLE;
+      
+      ker_init_xid_data(rlp_attach_req);
+
+      SET_STATE (KER, RLP_ADM_AND_ATTACHED);
+      break; 
+
+    default:
+      break;
+  }
+  PFREE (rlp_attach_req);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function    : ker_rlp_detach_req
++------------------------------------------------------------------------------
+|  Description : Process primitive RLP_DETACH_REQ received from L2R.
+|
+|  Parameters  : rlp_detach_req -
+|                 
+|
+|  Return      : -
++------------------------------------------------------------------------------
+*/
+
+
+GLOBAL void ker_rlp_detach_req(T_RLP_DETACH_REQ *rlp_detach_req)
+{
+  TRACE_FUNCTION ("ker_rlp_detach_req()");
+  PACCESS        (rlp_detach_req);
+
+  /*
+  * processing for any kernel state
+  */
+  rlp_data->ker.DM_State = IS_IDLE;
+  ker_deinit_link_vars ();
+  SET_STATE (KER, RLP_ADM_AND_DETACHED);
+  {
+  PPASS (rlp_detach_req, rlp_detach_cnf, RLP_DETACH_CNF);
+  PSENDX (L2R, rlp_detach_cnf);
+  }
+  rlp_data_magic_num = 0;  /* memory is no more initialized */
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function    : ker_rlp_connect_req
++------------------------------------------------------------------------------
+|  Description : Process primitive RLP_CONNECT_REQ received from L2R.
+|
+|  Parameters  : rlp_connect_req - 
+|                  
+|
+|  Return      : -
++------------------------------------------------------------------------------
+*/
+
+
+GLOBAL void ker_rlp_connect_req
+                  (
+                    T_RLP_CONNECT_REQ *rlp_connect_req
+                  )
+{
+  TRACE_FUNCTION ("ker_rlp_connect_req()");
+  PACCESS        (rlp_connect_req);
+
+  switch (GET_STATE (KER))
+  {
+    case RLP_ADM_AND_ATTACHED:
+      /*
+       * processing for state RLP_ADM_AND_ATTACHED
+       */
+      rlp_data->ker.SABM_State = ISW_SEND;
+      rlp_data->ker.SABM_Count = 0;
+      rlp_data->ker.DM_State   = IS_IDLE;
+
+      SET_STATE (KER, RLP_PENDING_CONNECT_REQ);
+      break; 
+
+    default:
+      break;
+  }
+  PFREE (rlp_connect_req);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function    : ker_rlp_connect_res
++------------------------------------------------------------------------------
+|  Description : Process primitive RLP_CONNECT_RES received from L2R.
+|
+|  Parameters  : rlp_connect_res -
+|                 
+|
+|  Return      : -
++------------------------------------------------------------------------------
+*/
+
+
+GLOBAL void ker_rlp_connect_res
+                  (
+                    T_RLP_CONNECT_RES *rlp_connect_res
+                  )
+{
+  TRACE_FUNCTION ("ker_rlp_connect_res()");
+  PACCESS        (rlp_connect_res);
+
+  switch (GET_STATE (KER))
+  {
+    case RLP_PENDING_CONNECT_IND:
+    {
+      /*
+       * processing for state RLP_PENDING_CONNECT_IND
+       */
+      rlp_data->ker.ABit = rlp_connect_res->ack_flg;
+      
+      switch (rlp_data->ker.ABit)
+      {
+        case RLP_NAK:
+          rlp_data->ker.DM_State = IS_SEND;
+          rlp_data->ker.DM_FBit  = 1;
+          SET_STATE (KER, RLP_ADM_AND_ATTACHED);
+          break;
+
+        case RLP_ACK:
+          rlp_data->ker.UA_State = IS_SEND;
+          rlp_data->ker.UA_FBit  = 1;
+          ker_init_link_vars ();
+          SET_STATE (KER, RLP_CONNECTION_ESTABLISHED);
+          break;
+      }
+    }
+  }
+  PFREE (rlp_connect_res);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function    : ker_rlp_disc_req
++------------------------------------------------------------------------------
+|  Description : Process primitive RLP_DISC_REQ received from L2R.
+|
+|  Parameters  : rlp_disc_req - 
+|                 
+|
+|  Return      : -
++------------------------------------------------------------------------------
+*/
+
+
+GLOBAL void ker_rlp_disc_req
+                  (
+                    T_RLP_DISC_REQ *rlp_disc_req
+                  )
+{
+  TRACE_FUNCTION ("ker_rlp_disc_req()");
+  PACCESS        (rlp_disc_req);
+
+  switch (GET_STATE (KER))
+  {
+    case RLP_ADM_AND_DETACHED:
+    case RLP_ADM_AND_ATTACHED:
+      /*
+       * processing for state RLP_ADM_AND_DETACHED
+       */
+      break; 
+
+    default:
+      /*
+       * processing for any other state
+       */
+      TIMERSTOP (TT_HANDLE);
+
+      rlp_data->ker.DISC_State = ISW_SEND;
+      rlp_data->ker.DISC_Count = 0;
+
+      switch (rlp_data->ker.Poll_xchg)
+      {
+        case IW_IDLE:
+          rlp_data->ker.DISC_PBit = 1;
+          break;
+    
+        default:
+          rlp_data->ker.DISC_PBit = 0;
+          break;
+      }
+
+      ker_deinit_link_vars ();
+      rlp_data->ker.DISC_Ind = FALSE;
+
+      SET_STATE (KER, RLP_DISCONNECT_INITIATED);
+      TRACE_EVENT("#1");
+      break;
+  }
+  PFREE (rlp_disc_req);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function    : ker_rlp_reset_req
++------------------------------------------------------------------------------
+|  Description : Process primitive RLP_RESET_REQ received from L2R.
+|
+|  Parameters  : rlp_reset_req -
+|                 
+|
+|  Return      : -
++------------------------------------------------------------------------------
+*/
+
+
+GLOBAL void ker_rlp_reset_req
+                  (
+                    T_RLP_RESET_REQ *rlp_reset_req
+                  )
+{
+  TRACE_FUNCTION ("ker_rlp_reset_req()");
+  PACCESS        (rlp_reset_req);
+
+  switch (GET_STATE (KER))
+  {
+    case RLP_CONNECTION_ESTABLISHED:
+      /*
+       * processing for state RLP_CONNECTION_ESTABLISHED
+       */
+      TIMERSTOP (TT_HANDLE);
+      TIMERSTOP (TRCVR_HANDLE);
+      ker_reset_all_t_rcvs ();
+      
+      rlp_data->ker.SABM_State = ISW_SEND;
+      rlp_data->ker.SABM_Count = 0;
+      
+      ker_deinit_link_vars ();
+
+      SET_STATE (KER, RLP_PENDING_RESET_REQ);
+      break;
+  }
+  PFREE (rlp_reset_req);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function    : ker_rlp_reset_res
++------------------------------------------------------------------------------
+|  Description : Process primitive RLP_RESET_RES received from L2R.
+|
+|  Parameters  : rlp_reset_res - 
+|                 
+|
+|  Return      : -
++------------------------------------------------------------------------------
+*/
+
+
+GLOBAL void ker_rlp_reset_res
+                  (
+                    T_RLP_RESET_RES *rlp_reset_res
+                  )
+{
+  TRACE_FUNCTION ("ker_rlp_reset_res()");
+  PACCESS        (rlp_reset_res);
+
+  switch (GET_STATE (KER))
+  {
+    case RLP_PENDING_RESET_IND:
+      /*
+       * processing for state RLP_PENDING_RESET_IND
+       */
+      rlp_data->ker.UA_State = IS_SEND;
+      rlp_data->ker.UA_FBit  = 1;
+ 
+      ker_init_link_vars ();
+      SET_STATE (KER, RLP_CONNECTION_ESTABLISHED);
+      break;
+  }
+  PFREE (rlp_reset_res);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function    : ker_rlp_data_req
++------------------------------------------------------------------------------
+|  Description : Process primitive RLP_ATTACH_REQ received from L2R.
+|
+|  Parameters  : rlp_data_req -
+|                 
+|
+|  Return      : -
++------------------------------------------------------------------------------
+*/
+
+
+GLOBAL void ker_rlp_data_req
+                  (
+                    T_RLP_DATA_REQ *rlp_data_req
+                  )
+{
+  TRACE_FUNCTION ("ker_rlp_data_req()");
+  PACCESS        (rlp_data_req);
+
+  switch (GET_STATE (KER))
+  {
+    case RLP_CONNECTION_ESTABLISHED:
+      switch (rlp_data->ker.UL_Snd_State)
+      {
+        case IW_WAIT:
+          sbm_store_prim (rlp_data_req);
+          rlp_data->ker.UL_Snd_State = IW_IDLE;
+          return;
+      }
+      break; 
+  }
+  PFREE (rlp_data_req);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function    : ker_rlp_getdata_req
++------------------------------------------------------------------------------
+|  Description : Process primitive RLP_GETDATA_REQ received from L2R.
+|
+|  Parameters  : rlp_getdata_req -
+|                 
+|
+|  Return      : -
++------------------------------------------------------------------------------
+*/
+
+
+GLOBAL void ker_rlp_getdata_req
+                  (
+                    T_RLP_GETDATA_REQ *rlp_getdata_req
+                  )
+{
+  TRACE_FUNCTION ("ker_rlp_getdata_req()");
+  PACCESS        (rlp_getdata_req);
+
+  switch (GET_STATE (KER))
+  {
+    case RLP_CONNECTION_ESTABLISHED:
+    case RLP_PENDING_REMAP_REQ:
+    case RLP_REMAP_DATA:
+    {
+      T_RLP_DATA_IND *rlp_data_ind;
+      /*
+       * processing for states RLP_CONNECTION_ESTABLISHED
+       *                       RLP_PENDING_REMAP_REQ:
+       *                       RLP_REMAP_DATA:
+       */
+      
+      if (rbm_get_prim 
+            (
+              &rlp_data_ind,
+              &rlp_data->ker.LRReady,
+              &rlp_data->ker.LRFull
+            ))
+      {
+        /*
+         * primitive is ready for sending to L2R
+         */
+        PSENDX (L2R, rlp_data_ind);
+        rlp_data->ker.UL_Rcv_State = IW_IDLE;
+        TIMERSTOP (TUL_RCV_HANDLE);
+      }
+      else
+      {
+        /*
+         * no primitive is ready for sending to L2R
+         */
+        TIMERSTART(TUL_RCV_HANDLE, rlp_data->ker.T_ul);
+        rlp_data->ker.UL_Rcv_State = IW_WAIT;
+      }
+      break;
+    }
+  }
+  PFREE (rlp_getdata_req);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function    : ker_rlp_ui_req
++------------------------------------------------------------------------------
+|  Description : Process primitive RLP_UI_REQ received from L2R.
+|
+|  Parameters  : rlp_ui_req -
+|                 
+|
+|  Return      : 
++------------------------------------------------------------------------------
+*/
+
+
+GLOBAL void ker_rlp_ui_req
+                  (
+                    T_RLP_UI_REQ *rlp_ui_req
+                  )
+{
+  TRACE_FUNCTION ("ker_rlp_ui_req()");
+  PACCESS        (rlp_ui_req);
+
+  switch (GET_STATE (KER))
+  {
+    case RLP_ADM_AND_DETACHED:
+      /*
+       * processing for state RLP_ADM_AND_DETACHED
+       */
+      break; 
+
+    default:
+      ker_copy_sdu_to_frame 
+      (
+        &rlp_ui_req->sdu,
+        rlp_data->ker.UI_Frame,
+        0
+      );
+
+      rlp_data->ker.UI_State = IS_SEND;
+      rlp_data->ker.UI_PBit  = 0;
+      break;
+  }
+  PFREE (rlp_ui_req);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function    : ker_rlp_remap_req
++------------------------------------------------------------------------------
+|  Description : Process primitive RLP_REMAP_REQ received from L2R.
+|
+|  Parameters  : rlp_remap_req -
+|                 
+|
+|  Return      : 
++------------------------------------------------------------------------------
+*/
+
+
+GLOBAL void ker_rlp_remap_req
+                  (
+                    T_RLP_REMAP_REQ *rlp_remap_req
+                  )
+{
+	T_FRAME_NUM vr;
+  USHORT oldFrameSize;
+
+  TRACE_FUNCTION ("ker_rlp_remap_req()");
+  PACCESS        (rlp_remap_req);
+
+  switch (GET_STATE (KER))
+  {
+    case RLP_CONNECTION_ESTABLISHED:
+      /*
+       * processing for state RLP_CONNECTION_ESTABLISHED
+       */
+      rlp_data->ker.OldFrameSize = rlp_data->ker.FrameSize;
+
+      ker_set_frame_size(rlp_remap_req->rate);
+
+      if (rlp_data->ker.OldFrameSize NEQ rlp_data->ker.FrameSize)
+      {
+        ker_get_frame_desc (rlp_data->ker.UI_Frame,
+          &rlp_data->ker.UI_FrameDesc);
+        
+        ker_get_frame_desc (rlp_data->ker.XID_C_Frame,
+          &rlp_data->ker.XID_C_FrameDesc);
+        
+        ker_get_frame_desc (rlp_data->ker.XID_R_Frame,
+          &rlp_data->ker.XID_R_FrameDesc);
+        
+        ker_get_frame_desc (rlp_data->ker.TEST_R_Frame,
+          &rlp_data->ker.TEST_R_FrameDesc);
+        
+        ker_get_frame_desc (rlp_data->ker.REMAP_Frame,
+          &rlp_data->ker.REMAP_FrameDesc);
+        rlp_data->ker.Poll_xchg = IW_IDLE;
+        
+        TIMERSTOP (TT_HANDLE);
+        TIMERSTOP (TRCVR_HANDLE);
+        ker_reset_all_t_rcvs ();
+        rbm_reset_all_r_states();
+        TIMERSTOP (TXID_HANDLE); 
+        
+        SET_STATE(KERXID_C, ISW_IDLE);
+        
+        rlp_data->ker.DTX_SF      = DTX_N;
+
+        vr = rbm_prepare_remap (rlp_data->ker.FrameSize);
+          
+        ker_fill_remap_frame(vr);
+        
+        SET_STATE (KER, RLP_PENDING_REMAP_REQ);
+      }
+      break;
+
+    case RLP_PENDING_REMAP_REQ:
+    case RLP_REMAP_DATA:
+      /*
+       * processing for state RLP_PENDING_REMAP_REQ
+       */
+      oldFrameSize = rlp_data->ker.FrameSize;
+
+      ker_set_frame_size(rlp_remap_req->rate);
+
+      if (oldFrameSize NEQ rlp_data->ker.FrameSize)
+      {
+        ker_get_frame_desc (rlp_data->ker.UI_Frame,
+          &rlp_data->ker.UI_FrameDesc);
+        
+        ker_get_frame_desc (rlp_data->ker.XID_C_Frame,
+          &rlp_data->ker.XID_C_FrameDesc);
+        
+        ker_get_frame_desc (rlp_data->ker.XID_R_Frame,
+          &rlp_data->ker.XID_R_FrameDesc);
+        
+        ker_get_frame_desc (rlp_data->ker.TEST_R_Frame,
+          &rlp_data->ker.TEST_R_FrameDesc);
+        
+        ker_get_frame_desc (rlp_data->ker.REMAP_Frame,
+          &rlp_data->ker.REMAP_FrameDesc);
+        rlp_data->ker.Poll_xchg = IW_IDLE;
+        
+        TIMERSTOP (TT_HANDLE); 
+        
+        vr = rbm_prepare_remap (rlp_data->ker.FrameSize);
+          
+        ker_fill_remap_frame(vr);
+
+        if (GET_STATE (KER) EQ RLP_REMAP_DATA)
+        {
+          SET_STATE (KER, RLP_PENDING_REMAP_REQ);
+        }
+      }
+      break;
+  }
+  PFREE (rlp_remap_req);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function    : ker_rlp_remap_data_res
++------------------------------------------------------------------------------
+|  Description : Process primitive RLP_REMAP_DATA_RES received from L2R.
+|
+|  Parameters  : rlp_remap_data_res -
+|                 
+|
+|  Return      : -
++------------------------------------------------------------------------------
+*/
+
+
+GLOBAL void ker_rlp_remap_data_res
+                  (
+                    T_RLP_REMAP_DATA_RES *rlp_remap_data_res
+                  )
+{
+  TRACE_FUNCTION ("ker_rlp_remap_data_res()");
+  PACCESS        (rlp_remap_data_res);
+
+  switch (GET_STATE (KER))
+  {
+    case RLP_REMAP_DATA:
+      /*
+       * processing for state RLP_PENDING_REMAP_REQ
+       */
+      if (!ker_send_remap_data ())
+      {
+        PALLOC (rlp_remap_cnf, RLP_REMAP_CNF);
+        
+        sbm_reset_after_remap
+          (
+          rlp_data->ker.FrameSize, 
+          rlp_data->ker.RemapNr
+          );
+        
+        PSENDX (L2R, rlp_remap_cnf);
+        SET_STATE (KER, RLP_CONNECTION_ESTABLISHED);
+      }
+      break; 
+  }
+  PFREE (rlp_remap_data_res);
+}
+