diff src/g23m-gprs/sndcp/sndcp_suf.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-gprs/sndcp/sndcp_suf.c	Sun Jul 15 04:40:46 2018 +0000
@@ -0,0 +1,239 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GPRS (8441)
+|  Modul   :  sndcp_suf.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 is part of the entity SNDCP and implements all 
+|             procedures and functions as described in the 
+|             SDL-documentation (SU-statemachine)
++----------------------------------------------------------------------------- 
+*/ 
+
+/*---- HISTORY --------------------------------------------------------------*/
+
+#define ENTITY_SNDCP
+
+/*==== INCLUDES =============================================================*/
+
+#include "typedefs.h"    /* to get Condat data types */
+#include "vsi.h"        /* to get a lot of macros */
+#include "macdef.h"
+#include "prim.h"       /* to get the definitions of used SAP and directions */
+
+#include "dti.h"
+
+#include "sndcp.h"        /* to get the global entity definitions */
+#include "sndcp_f.h"       /* to get the functions to access the global arrays*/
+
+#include "sndcp_nus.h"   /* to get signals to service nu */
+#include "sndcp_cias.h"   /* to get signals to service cia */
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+#ifdef _SNDCP_DTI_2_
+
+/*
++------------------------------------------------------------------------------
+| Function    : su_get_nsapi
++------------------------------------------------------------------------------
+| Description : finde the affected nsapi in sn-PDU.
+|
+| Parameters  : ll_unitdata_req*
+| Returns     : the nsapi
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL U8 su_get_nsapi (T_LL_UNITDESC_REQ* ll_unitdesc_req) 
+{ 
+   T_desc3* desc3 = NULL;
+   U8 * sndcp_header = NULL;
+
+  /* Get the descriptor describing the memory area with the sndcp header */
+
+  desc3 = (T_desc3*)ll_unitdesc_req->desc_list3.first;
+  sndcp_header = (U8*)desc3->buffer;
+
+  TRACE_FUNCTION( "su_get_nsapi" );
+
+  return (*(sndcp_header + ENCODE_OFFSET_BYTE)) & 0xf;
+} /* sua_get_nsapi() */
+
+#else /* _SNDCP_DTI_2_ */
+
+/*
++------------------------------------------------------------------------------
+| Function    : su_get_nsapi
++------------------------------------------------------------------------------
+| Description : finde the affected nsapi in sn-PDU.
+|
+| Parameters  : ll_unitdata_req*
+| Returns     : the nsapi
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL UBYTE su_get_nsapi (T_LL_UNITDATA_REQ* ll_unitdata_req) 
+{ 
+  USHORT octet_offset = (ll_unitdata_req->sdu.o_buf) >> 3;
+
+  TRACE_FUNCTION( "su_get_nsapi" );
+
+  return ll_unitdata_req->sdu.buf[octet_offset] & 0xf;
+
+} /* su_get_nsapi() */
+
+#endif /* _SNDCP_DTI_2_ */
+
+/*
++------------------------------------------------------------------------------
+| Function    : su_init
++------------------------------------------------------------------------------
+| Description : The function su_init() .... 
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void su_init (void)
+{ 
+  TRACE_FUNCTION( "su_init" );
+
+  /*
+   * Not initialized:
+   * Members of sn_unitdata_q are not set to NULL.
+   * Members of npdu_number_q are not set to 0.
+   * Members of ll_unitdata_q are not set to NULL.
+   */
+
+  sndcp_data->su = & sndcp_data->su_base[0];
+  INIT_STATE(SU_0, SU_LLC_NOT_RECEPTIVE);
+#ifdef SNDCP_2to1
+  sndcp_data->su->sapi = PS_SAPI_3; 
+#else
+  sndcp_data->su->sapi = LL_SAPI_3; 
+#endif /*SNDCP_2to1*/
+
+  sndcp_data->su = & sndcp_data->su_base[1];
+  INIT_STATE(SU_1, SU_LLC_NOT_RECEPTIVE);
+#ifdef SNDCP_2to1
+  sndcp_data->su->sapi = PS_SAPI_5; 
+#else
+  sndcp_data->su->sapi = LL_SAPI_5; 
+#endif /*SNDCP_2to1*/
+
+  sndcp_data->su = & sndcp_data->su_base[2];
+  INIT_STATE(SU_2, SU_LLC_NOT_RECEPTIVE);
+#ifdef SNDCP_2to1
+  sndcp_data->su->sapi = PS_SAPI_9; 
+#else
+  sndcp_data->su->sapi = LL_SAPI_9; 
+#endif /*SNDCP_2to1*/
+
+  sndcp_data->su = & sndcp_data->su_base[3];
+  INIT_STATE(SU_3, SU_LLC_NOT_RECEPTIVE);
+#ifdef SNDCP_2to1
+  sndcp_data->su->sapi = PS_SAPI_11; 
+#else
+  sndcp_data->su->sapi = LL_SAPI_11; 
+#endif /*SNDCP_2to1*/
+  {
+    UBYTE sapi_index = 0;
+
+    for (sapi_index = 0; sapi_index < SNDCP_NUMBER_OF_SAPIS; sapi_index++) {
+      sndcp_data->su = & sndcp_data->su_base[sapi_index];
+      sndcp_data->su->n201_u = N201_U_DEFAULT;
+      sndcp_data->su->sn_unitdata_q_read = 0;
+      sndcp_data->su->sn_unitdata_q_write = 0;
+#ifdef _SNDCP_DTI_2_
+      sndcp_data->su->ll_unitdesc_q_read = 0;
+      sndcp_data->su->ll_unitdesc_q_write = 0;
+#else /* _SNDCP_DTI_2_ */
+      sndcp_data->su->ll_unitdata_q_read = 0;
+      sndcp_data->su->ll_unitdata_q_write = 0;
+#endif /* _SNDCP_DTI_2_ */
+      sndcp_data->su->cia_state = CIA_IDLE;
+    }
+  }
+
+  
+
+} /* su_init() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : su_next_sn_unitdata_req
++------------------------------------------------------------------------------
+| Description : If queue with sn_unitdata_req is
+| not empty, send SIG_SU_CIA_DATA_REQ with next prim from sn_unitdata_req queue
+|
+| Parameters  : sapi
+| Pre         : cia_state == CIA_IDLE
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void su_next_sn_unitdata_req (UBYTE sapi) 
+{ 
+  TRACE_FUNCTION( "su_next_sn_unitdata_req" );
+
+  if (sndcp_data->su->sn_unitdata_q_write !=
+      sndcp_data->su->sn_unitdata_q_read) {
+    /*
+     * Get sn_unitdata_req from queue.
+     */
+    T_SN_UNITDATA_REQ* sn_unitdata_req = 
+      sndcp_data->su->sn_unitdata_q[sndcp_data->su->sn_unitdata_q_read];
+    /*
+     * Get npdu_number from queue.
+     */
+    USHORT npdu_num = 
+      sndcp_data->su->npdu_number_q[sndcp_data->su->sn_unitdata_q_read];
+    UBYTE nsapi = sn_unitdata_req->nsapi;
+
+    sndcp_data->su->sn_unitdata_q[sndcp_data->su->sn_unitdata_q_read] = NULL;
+    sndcp_data->su->sn_unitdata_q_read = 
+      (sndcp_data->su->sn_unitdata_q_read + 1 ) % SN_UNITDATA_Q_LEN;
+
+    /*
+     * Cia is now busy. Send data.
+     */
+    sndcp_data->su->cia_state = CIA_BUSY;
+    sig_su_cia_cia_comp_req(sn_unitdata_req,
+                        npdu_num,
+                        nsapi,
+                        sapi);
+  }  else if (sndcp_data->su->cia_state == CIA_IDLE) {
+    UBYTE nsapi = 0;
+
+    for (nsapi = 0; nsapi < SNDCP_NUMBER_OF_NSAPIS; nsapi++) {
+      UBYTE used_sapi = 0;
+      BOOL used = FALSE;
+
+      sndcp_is_nsapi_used(nsapi, &used);
+      if (used) {
+        sndcp_get_nsapi_sapi(nsapi, &used_sapi);
+        if (used_sapi == sapi) {
+          sig_su_nu_ready_ind(nsapi);
+        }
+      }
+    }
+  }
+
+
+} /* su_next_sn_unitdata_req() */
+