diff g23m/condat/ms/src/aci/psa_psip.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/aci/psa_psip.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,564 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GSM-PS (6147)
+|  Modul   :  PSA_PSIP
++----------------------------------------------------------------------------- 
+|  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 defines the processing functions for the
+|             primitives sent to the protocol stack adapter by the DTI
+|             interface.
++----------------------------------------------------------------------------- 
+*/ 
+#if defined (FF_PSI) && defined (DTI)
+#define PSA_PSIP_C
+
+
+#include "aci_all.h"
+
+/*==== INCLUDES ===================================================*/
+#include "aci_cmh.h"
+#include "ati_cmd.h"
+#include "dti.h"      /* functionality of the dti library */
+
+#include "aci.h"
+#include "aci_lst.h"
+
+#include "dti_conn_mng.h"
+#include "dti_cntrl_mng.h"
+
+
+#include "psa_psi.h"
+#include "cmh_psi.h"
+#include "ati_src_psi.h"
+#include "ati_io.h"
+#include "aci_mem.h"
+#include "sap_dti.h"
+
+/*==== CONSTANTS ==================================================*/
+
+
+/*==== TYPES ======================================================*/
+GLOBAL T_ACI_LIST *psi_dev_list=NULL;
+
+/*==== EXPORT =====================================================*/
+
+
+/*==== VARIABLES ==================================================*/
+
+/*==== FUNCTIONS ==================================================*/
+
+/* for tracing of establishing of CMD channels for dual port version */
+
+
+
+/*
++----------------------------------------------------------------------+
+| PROJECT : GPRS (8441)         MODULE  : PSA_PSIP                   |
+| STATE   : finished            ROUTINE : find_psi_dev_no              |
++----------------------------------------------------------------------+
+
+  PURPOSE : search psi device number in psi device list
+*/
+LOCAL BOOL find_psi_dev_id ( U32 devId, void * elem )
+{
+  T_ACI_PSI *compared = (T_ACI_PSI *)elem;
+
+  if (compared NEQ NULL)
+  {
+    if (compared->devId EQ devId )
+    {
+      return TRUE;
+    }
+    else
+    {
+      return FALSE;
+    }
+  }
+  else
+  {
+     return FALSE;
+  }  
+}
+
+#ifdef _SIMULATION_
+/*
++----------------------------------------------------------------------+
+| PROJECT : GPRS (8441)          MODULE  : PSA_PSIP                    |
+| STATE   : finished             ROUTINE : mng_psi_dev_list_test       |
++----------------------------------------------------------------------+
+
+  PURPOSE : manage psi device list
+*/
+LOCAL BOOL mng_psi_dev_list_test ( T_PSI_CONN_IND_TEST *psi_conn_ind_test  )
+{
+  T_ACI_PSI *msg_ptr = NULL;
+  
+  if(psi_dev_list EQ NULL)
+  {/* there is no psi device list */
+    psi_dev_list = new_list();
+  }
+  msg_ptr = psi_find_element(psi_dev_list, psi_conn_ind_test->devId, find_psi_dev_id);
+  if(msg_ptr EQ NULL)
+  {/* added new device */
+    {
+      ACI_MALLOC(msg_ptr,sizeof(T_ACI_PSI));
+      msg_ptr->devId = psi_conn_ind_test->devId;
+      msg_ptr->psi_data_mode = psi_conn_ind_test->psi_data_mode; 
+      switch (psi_conn_ind_test->devId & DIO_TYPE_DAT_MASK)
+      {
+        case DIO_DATA_SER:
+          memcpy(&msg_ptr->psi_cap.dio_cap_ser,&psi_conn_ind_test->DIO_CAP_UN.DIO_CAP_SER, 
+                           sizeof(msg_ptr->psi_cap.dio_cap_ser));
+          break;
+        case DIO_DATA_MUX:
+          memcpy(&msg_ptr->psi_cap.dio_cap_ser_mux, &psi_conn_ind_test->DIO_CAP_UN.DIO_CAP_SER_MUX, 
+                           sizeof(msg_ptr->psi_cap.dio_cap_ser_mux));
+          break;
+        case DIO_DATA_PKT:
+           memcpy(&msg_ptr->psi_cap.dio_cap_pkt, &psi_conn_ind_test->DIO_CAP_UN.DIO_CAP_PKT, 
+                           sizeof(msg_ptr->psi_cap.dio_cap_pkt));
+           break;
+      }
+      insert_list(psi_dev_list,msg_ptr);
+      return (TRUE);
+    }
+  }
+  else
+  {/* new DIO capabilities for existing device */
+    return (FALSE);
+  }
+}
+#endif /* _SIMULATION_ */
+
+/*
++----------------------------------------------------------------------+
+| PROJECT : GPRS (8441)          MODULE  : PSA_PSIP                  |
+| STATE   : finished             ROUTINE : mng_psi_dev_list            |
++----------------------------------------------------------------------+
+
+  PURPOSE : manage psi device list
+*/
+LOCAL BOOL mng_psi_dev_list ( T_PSI_CONN_IND *psi_conn_ind  )
+{
+  T_ACI_PSI *msg_ptr = NULL;
+  
+  if(psi_dev_list EQ NULL)
+  {/* there is no psi device list */
+    psi_dev_list = new_list();
+  }
+  msg_ptr = psi_find_element(psi_dev_list, psi_conn_ind->devId, find_psi_dev_id);
+  if(msg_ptr EQ NULL)
+  {    /* added new device */
+       /*  if((psi_conn_ind->dio_cap->data_mode >= DTI_CPBLTY_CMD ) 
+              AND 
+       (psi_conn_ind->dio_cap->data_mode <=(DTI_CPBLTY_CMD|DTI_CPBLTY_PKT|DTI_CPBLTY_SER)))*/
+    {
+      ACI_MALLOC(msg_ptr,sizeof(T_ACI_PSI));
+      msg_ptr->devId = psi_conn_ind->devId;
+      msg_ptr->psi_data_mode = psi_conn_ind->psi_data_mode; 
+      switch (psi_conn_ind->devId & DIO_TYPE_DAT_MASK)
+      {
+        case DIO_DATA_SER:
+          if(psi_conn_ind->ptr_DIO_CAP NEQ NULL)
+          {
+            memcpy(&msg_ptr->psi_cap.dio_cap_ser,(T_DIO_CAP_SER *)&(psi_conn_ind->ptr_DIO_CAP), 
+                           sizeof(msg_ptr->psi_cap.dio_cap_ser));
+          }
+          break;
+        case DIO_DATA_MUX:
+          if(psi_conn_ind->ptr_DIO_CAP NEQ NULL)
+          {           
+            memcpy(&msg_ptr->psi_cap.dio_cap_ser_mux, (T_DIO_CAP_SER_MUX *)&(psi_conn_ind->ptr_DIO_CAP), 
+                           sizeof(msg_ptr->psi_cap.dio_cap_ser_mux));
+          }
+          break;
+        case DIO_DATA_PKT:
+          if(psi_conn_ind->ptr_DIO_CAP NEQ NULL)
+          {
+            memcpy(&msg_ptr->psi_cap.dio_cap_pkt, (T_DIO_CAP_PKT *)&(psi_conn_ind->ptr_DIO_CAP), 
+                           sizeof(msg_ptr->psi_cap.dio_cap_pkt));
+          }
+          break;
+      }
+      insert_list(psi_dev_list,msg_ptr);
+      return (TRUE);
+    }
+    /* else
+    { neither CMD, SER nor PKT mode 
+      return (FALSE);           
+    }*/
+  }
+  else
+  {/* new DIO capabilities for existing device */
+    return (FALSE);
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GPRS (8441)                MODULE  : PSA_PSIP            |
+| STATE   : code                       ROUTINE : PSI_erase_dev_elem  |
++--------------------------------------------------------------------+
+
+  PURPOSE : erase an entry element from the psi_dev_list list.
+
+*/
+LOCAL void PSI_erase_dev_elem(U32 devId)
+{
+  T_ACI_DTI_PRC_PSI *content;
+  content = psi_remove_element (psi_dev_list, devId, find_psi_dev_id);
+  ACI_MFREE (content);
+}
+#ifdef _SIMULATION_
+/*
++----------------------------------------------------------------------+
+| PROJECT : GPRS (8441)           MODULE  : PSA_PSI                    |
+| STATE   : finished              ROUTINE : psa_psi_conn_ind_test      |
++----------------------------------------------------------------------+
+
+  PURPOSE : processes the PSI_CONN_IND_TEST primitive send by PSI.
+            add new device to psi device list, create the ATI source and 
+            register the DIO capabilities in ACI
+*/
+
+GLOBAL const void psa_psi_conn_ind_test ( T_PSI_CONN_IND_TEST *psi_conn_ind_test )
+{
+  T_ACI_PSI *  msg_ptr;
+  UBYTE src_id = 0;
+  U32 dio_cap;
+
+  TRACE_FUNCTION ("psa_psi_conn_ind_test()");
+
+  dio_cap =psi_conn_ind_test->devId & DIO_TYPE_DAT_MASK;
+
+  if(mng_psi_dev_list_test(psi_conn_ind_test) EQ TRUE )
+  {
+    msg_ptr = psi_find_element(psi_dev_list, psi_conn_ind_test->devId, find_psi_dev_id); 
+    switch (dio_cap)
+    {
+      case DIO_DATA_SER:  /*lint -fallthrough*/        
+      case DIO_DATA_MUX:  /*lint -fallthrough*/        
+      case DIO_DATA_PKT:
+        /* Create a new AT source if driver supports AT commands */
+        if(psi_conn_ind_test->psi_data_mode EQ DRIVER_MODE_AT OR
+           psi_conn_ind_test->psi_data_mode EQ DRIVER_MODE_AT_DATA)
+        {
+          src_id = psi_new_source(psi_conn_ind_test->devId, NOT_PRESENT_8BIT, dio_cap);
+        }
+        cmhPSI_Ind(msg_ptr, src_id,dio_cap);
+        break;
+
+      default:
+        break;
+    }
+  }
+  else 
+  {/* second PSI_CONNECT_IND from same device or wrong convergence (mode) in 
+        DIO capabilities */
+    psaPSI_ConnRej(psi_conn_ind_test->devId);
+  }
+  /* free the primitive buffer */
+  PFREE (psi_conn_ind_test);
+}
+#endif /* _SIMULATION_ */
+/*
++----------------------------------------------------------------------+
+| PROJECT : GPRS (8441)           MODULE  : PSA_PSI                   |
+| STATE   : finished              ROUTINE : psa_psi_conn_ind        |
++----------------------------------------------------------------------+
+
+  PURPOSE : processes the PSI_CONN_IND primitive send by PSI.
+                   add new device to psi device list, create the ATI source and 
+                   register the DIO capabilities in ACI
+*/
+
+GLOBAL const void psa_psi_conn_ind ( T_PSI_CONN_IND *psi_conn_ind )
+{
+  T_ACI_PSI *  msg_ptr;
+  UBYTE src_id = 0;
+  U32 dio_cap;
+
+  TRACE_FUNCTION ("psa_psi_conn_ind()");
+  /* cmhPSI_SetDcbParToUnchanged( device_entry );*/
+
+  dio_cap =psi_conn_ind->devId & DIO_TYPE_DAT_MASK;
+
+  if(mng_psi_dev_list(psi_conn_ind) EQ TRUE )
+  {
+    msg_ptr = psi_find_element(psi_dev_list, psi_conn_ind->devId, find_psi_dev_id); 
+    switch (dio_cap)
+    {
+      case DIO_DATA_SER:  /*lint -fallthrough*/        
+      case DIO_DATA_MUX:  /*lint -fallthrough*/        
+      case DIO_DATA_PKT:
+        /* Create a new AT source if driver supports AT commands */
+        if(psi_conn_ind->psi_data_mode EQ DRIVER_MODE_AT OR
+           psi_conn_ind->psi_data_mode EQ DRIVER_MODE_AT_DATA)
+        {
+          src_id = psi_new_source(psi_conn_ind->devId, NOT_PRESENT_8BIT, dio_cap);
+        }
+        cmhPSI_Ind(msg_ptr, src_id,dio_cap);
+        break;
+
+      default:
+        break;
+    }
+  }
+  else 
+  {/* second PSI_CONNECT_IND from same device or wrong convergence (mode) in 
+        DIO capabilities */
+    psaPSI_ConnRej(psi_conn_ind->devId);
+  }
+   /* free the primitive buffer */
+  PFREE (psi_conn_ind);
+}
+
+
+
+/*
++----------------------------------------------------------------------+
+| PROJECT : GPRS (8441)           MODULE  : PSA_PSI                 |
+| STATE   : finished              ROUTINE : psa_psi_dti_close_ind      |
++----------------------------------------------------------------------+
+
+  PURPOSE : processes the PSI_DTI_CLOSE_IND primitive send by PSI.
+            this indicates the dti disconnection caused by the DIO driver
+*/
+
+GLOBAL const void psa_psi_dti_close_ind( T_PSI_DTI_CLOSE_IND *psi_dti_close_ind )
+{
+  T_ACI_PSI * msg_ptr;
+     
+  TRACE_FUNCTION ("psa_psi_dti_close_ind()");
+
+  msg_ptr = psi_find_element(psi_dev_list, psi_dti_close_ind->devId, find_psi_dev_id);
+  /* if the device_no does not exist in the psi_dev_list
+     the primitive is ignored */
+  if(msg_ptr NEQ NULL)
+  {            
+    cmhPSI_DTI_Close(psi_dti_close_ind->devId, PSI_DTI_CLS_IND, psi_dti_close_ind->link_id);
+  } 
+  else
+  {
+     TRACE_EVENT ("ERROR: DEVICE NOT FOUND.");
+  }
+  /* free the primitive buffer */
+  PFREE (psi_dti_close_ind);
+}
+
+/*
++----------------------------------------------------------------------+
+| PROJECT : GPRS (8441)           MODULE  : PSA_PSI                    |
+| STATE   : finished              ROUTINE : psa_psi_disconn_ind        |
++----------------------------------------------------------------------+
+
+  PURPOSE : processes the PSI_DISCONN_IND primitive send by PSI.
+  this indicates the disconnection of data call caused by the DIO driver
+*/
+GLOBAL const void psa_psi_disconn_ind ( T_PSI_DISCONN_IND *psi_disconn_ind )
+{
+   T_ACI_PSI * msg_ptr;
+   T_ACI_DTI_PRC_PSI *cmd;   
+
+   TRACE_FUNCTION ("psa_psi_disconn_ind()");    
+
+   msg_ptr = psi_find_element(psi_dev_list, psi_disconn_ind->devId, find_psi_dev_id);
+   cmd = cmhPSI_find_dlci (psi_src_params, psi_disconn_ind->devId,
+                    UART_DLCI_NOT_MULTIPLEXED);
+   /* if the device_no does not exist in the psi_dev_list the primitive is ignored */
+   if(msg_ptr NEQ NULL)
+   {
+    /*erase the source*/
+    psi_erase_source( cmd->srcId );
+    /*erase the src element in the <psi_src_params>*/
+    cmhPSI_erase_src_elem (cmd->srcId );
+    /*erase the devie from the device list*/
+    PSI_erase_dev_elem (psi_disconn_ind->devId);
+   } 
+   /* free the primitive buffer */
+   PFREE (psi_disconn_ind);
+}
+
+
+
+/*
++----------------------------------------------------------------------+
+| PROJECT : GPRS (8441)           MODULE  : PSA_PSI                 |
+| STATE   : finished              ROUTINE : psa_psi_dti_close_cnf      |
++----------------------------------------------------------------------+
+
+  PURPOSE : processes the PSI_DTI_CLOSE_CNF primitive sent by PSI.
+     this confirms the dti disconnection requested by PSI_DTI_CLOSE_REQ 
+*/
+GLOBAL const void psa_psi_dti_close_cnf ( T_PSI_DTI_CLOSE_CNF *psi_dti_close_cnf )
+{
+  T_ACI_PSI * msg_ptr;
+        
+  TRACE_FUNCTION ("psa_psi_dti_close_cnf()");    
+  msg_ptr = psi_find_element(psi_dev_list, psi_dti_close_cnf->devId, find_psi_dev_id);
+  /* if the devId does not exist in the psi_dev_list
+       the primitive is ignored */
+  if(msg_ptr NEQ NULL)
+  {                    
+    cmhPSI_DTI_Close(psi_dti_close_cnf->devId, PSI_DTI_CLS_CNF, psi_dti_close_cnf->link_id);          
+  }
+  /* psaPSI_CloseReq(psi_dti_close_cnf->devId);*/
+  /* free the primitive buffer */
+  PFREE (psi_dti_close_cnf);
+}
+
+
+/*
++----------------------------------------------------------------------+
+| PROJECT : GPRS (8441)           MODULE  : PSA_PSI                 |
+| STATE   : finished              ROUTINE : psa_psi_close_cnf      |
++----------------------------------------------------------------------+
+
+  PURPOSE : processes the PSI_CLOSE_CNF primitive sent by PSI.
+     this confirms the dti disconnection requested by PSI_CLOSE_REQ 
+*/
+GLOBAL const void psa_psi_close_cnf ( T_PSI_CLOSE_CNF *psi_close_cnf )
+{
+   T_ACI_PSI * msg_ptr;
+   T_ACI_DTI_PRC_PSI *cmd;
+        
+   TRACE_FUNCTION ("psa_psi_close_cnf()");    
+   msg_ptr = psi_find_element(psi_dev_list, psi_close_cnf->devId, find_psi_dev_id);
+   cmd = cmhPSI_find_dlci (psi_src_params, psi_close_cnf->devId,
+                    UART_DLCI_NOT_MULTIPLEXED);
+   /* if the devId does not exist in the psi_dev_list
+       the primitive is ignored */
+   if(msg_ptr NEQ NULL)
+   {                    
+      /*erase the source*/
+      psi_erase_source( cmd->srcId );
+      /*erase the src element in the <psi_src_params>*/
+      cmhPSI_erase_src_elem (cmd->srcId );
+      /*erase the devie from the device list*/
+      PSI_erase_dev_elem (psi_close_cnf->devId);   
+   }
+   /* free the primitive buffer */
+   PFREE (psi_close_cnf);
+}
+
+
+
+
+/*
++----------------------------------------------------------------------+
+| PROJECT : GPRS (8441)          MODULE  : PSA_PSI                 |
+| STATE   : finished             ROUTINE : psa_psi_dti_open_cnf        |
++----------------------------------------------------------------------+
+
+  PURPOSE : processes the PSI_DTI_OPEN_CNF primitive send by PSI.
+            this confirms the dti connection requested by PSI_DTI_OPEN_REQ
+*/
+GLOBAL const void psa_psi_dti_open_cnf ( T_PSI_DTI_OPEN_CNF *psi_dti_open_cnf )
+{
+  T_ACI_PSI * msg_ptr;
+     
+  TRACE_FUNCTION ("psa_psi_dti_open_cnf()");
+
+  msg_ptr = psi_find_element(psi_dev_list, psi_dti_open_cnf->devId, find_psi_dev_id);
+  /* if the devId does not exist in the psi_dev_list
+     the primitive is ignored */
+  if(msg_ptr NEQ NULL)
+  {
+    switch(psi_dti_open_cnf->cause)
+    {
+      case PSICS_SUCCESS:
+        cmhPSI_DTI_OpenCnf(psi_dti_open_cnf->devId, psi_dti_open_cnf->link_id, DTI_OK);
+        break;
+      case PSICS_INVALID_PARAMS:
+      case PSICS_DISCONNECT:
+      case PSICS_INTERNAL_DRV_ERROR:
+      default:
+        cmhPSI_DTI_OpenCnf(psi_dti_open_cnf->devId, psi_dti_open_cnf->link_id, DTI_ERROR);
+        break;
+    }              
+ }
+ /* free the primitive buffer */
+ PFREE (psi_dti_open_cnf);
+}
+
+
+/*
++----------------------------------------------------------------------+
+| PROJECT : GPRS (8441)          MODULE  : PSA_PSI                     |
+| STATE   : finished             ROUTINE : psa_psi_setconf_cnf         |
++----------------------------------------------------------------------+
+
+  PURPOSE : processes the PSI_DTI_SETCONF_CNF primitive send by PSI.
+            this confirms the changed driver configuration requested 
+            by PSI_SETCONF_REQ
+*/
+
+GLOBAL const void psa_psi_setconf_cnf (T_PSI_SETCONF_CNF *psi_setconf_cnf)
+{
+  TRACE_FUNCTION ("psa_psi_setconf_cnf()");
+  /* free the primitive buffer */
+  PFREE (psi_setconf_cnf);
+}
+
+
+/*
++---------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  :PSA_PSIP                        |
+|                            ROUTINE : psa_psi_line_state_cnf              |
++---------------------------------------------------------------------+
+
+  PURPOSE : 
+
+*/
+
+GLOBAL const void psa_psi_line_state_cnf(T_PSI_LINE_STATE_CNF *psi_line_state_cnf)
+{
+  T_ACI_DTI_PRC_PSI  *src_infos = NULL;
+
+  TRACE_FUNCTION("psa_psi_line_state_cnf ()");
+  
+  src_infos = cmhPSI_find_dlci (psi_src_params, psi_line_state_cnf->devId, UART_DLCI_NOT_MULTIPLEXED);
+    
+  if (src_infos EQ NULL)      
+  {
+    TRACE_EVENT_P1 ("[ERR] psa_psi_line_state_cnf: not found: device=%d;",psi_line_state_cnf->devId);
+  }
+  else
+  {
+    BITFIELD_CLEAR (src_infos->data_cntr, PSI_RING_RUNNING);
+  }
+
+  PFREE(psi_line_state_cnf);
+}
+
+/*
++---------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : PSA_PSIP                       |
+|                            ROUTINE : psa_psi_line_state_ind          |
++---------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+
+GLOBAL const void psa_psi_line_state_ind(T_PSI_LINE_STATE_IND *psi_line_state_ind )
+{
+  TRACE_FUNCTION("psa_psi_line_state_ind()");
+
+  cmhPSI_Line_State_Ind ( psi_line_state_ind->devId, psi_line_state_ind->line_state );
+
+  PFREE(psi_line_state_ind);
+}
+
+#endif /*FF_PSI*/
+/*==== EOF =======================================================*/
+