view src/cs/services/dar/dar_msg_ft.c @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/****************************************************************************/
/*                                                                          */
/*  File Name:  dar_msg_ft.c                                                */
/*                                                                          */
/*  Purpose:   This function is called when the DAR entity receives a new   */
/*             message in its mailbox and wants to process the message.     */
/*                                                                          */
/*                                                                          */
/*  Version   0.1                                                           */
/*                                                                          */
/*  Date                 Modification                                       */
/*  ------------------------------------                                    */
/*  17 October 2001    Create                                               */
/*                                                                          */
/*  Author     Stephanie Gerthoux                                           */
/*                                                                          */
/* (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved*/
/****************************************************************************/

#include "rv/rv_defined_swe.h"
#ifdef RVM_DAR_SWE
   #ifndef _WINDOWS
      #include "config/swconfig.cfg"
      #include "config/sys.cfg"
      #include "config/chipset.cfg"
   #endif

   #include <string.h>
   #include "rvm/rvm_gen.h"
   #include "dar/dar_api.h"
   #include "dar/dar_macro_i.h"
   #include "dar/dar_messages_i.h"
   #include "dar/dar_const_i.h"
   #include "dar/dar_diagnose_i.h"
   #include "dar/dar_error_hdlr_i.h"
   
   #ifndef _WINDOWS
      #include "timer/timer.h"
   #endif

   /**** Global variable ****/
   /* index used in the circular buffer*/
   UINT16 dar_current_index = 0;
   /* Write buffer*/
   extern char dar_write_buffer[DAR_MAX_BUFFER_SIZE];

   /* Get the dar_current status */
   extern T_DAR_RECOVERY_STATUS dar_current_status;

   /* Define a pointer to the Global Environment Control block  */
   extern T_DAR_ENV_CTRL_BLK *dar_gbl_var_p;

   /* Define the recovery buffer */
   extern UINT8 dar_recovery_buffer[DAR_RECOVERY_DATA_MAX_BUFFER_SIZE];

   /**** Extern functions ****/
   extern  void * dar_read_mbox (UINT8 mbox);

   extern void exception(void);

   /********************************************************************************/
   /* Function         dar_filter_request                                          */
   /*                                                                              */
   /* Description      This function checks if the use_id group_nb exists:         */
   /*                      - if the group_nb exists, it adds the warning and debug */
   /*                        masks in the dar_array_filter                         */
   /*                      - otherwise, this function add the new group_nb and the */
   /*                        masks in the dar_array_filter                         */
   /*                                                                              */
   /********************************************************************************/

   T_RV_RET dar_filter_request (T_DAR_FILTER_START *msg_p)
   {
      /* Declare local variables*/
      UINT8 index = 0; 

      /* check if the DAR entity is started */
      if (dar_gbl_var_p == NULL )
      {
         dar_error_trace(DAR_ENTITY_NOT_START);
         return(RV_NOT_READY);
      }

      /*** check if the group exists ****/
      /* If the group exists... */
      if(dar_search_group(msg_p->use_msg_parameter.group_nb,&index)== RV_OK)
      {
         /* Check the Dar level  */
         switch(msg_p->use_msg_parameter.level) 
         {
            case DAR_WARNING:
            {  /* The DAR entity wants to process Warning messages */
               /* add the mask_warning in the dar_filter array */
               dar_gbl_var_p ->dar_filter_array[index].mask_warning |= 
                                                           msg_p->use_msg_parameter.mask;
               dar_gbl_var_p ->dar_filter_array[index].mask_debug    = 0x00;

            break;
            }

            case DAR_DEBUG:
            {
               /* The DAR entity wants to process Debug messages                   */
               /* As the Warning messages are more important than debug messages,  */
               /* it processes warning message too                                 */
  
               /* add the mask_debug in the dar_filter array */
               dar_gbl_var_p ->dar_filter_array[index].mask_debug |= 
                                                            msg_p->use_msg_parameter.mask;

               /* add the mask_warning in the dar_filter array  */
               dar_gbl_var_p ->dar_filter_array[index].mask_warning |= 
                                                            msg_p->use_msg_parameter.mask;
            break;
            }
          
            case DAR_NO_DIAGNOSE:
            {
               /* The DAR entity doesn't want to process Diagnose messages         */
  
               /* delete the mask_debug in the dar_filter array */
               dar_gbl_var_p ->dar_filter_array[index].mask_debug = 0x00;

               /* delete the mask_warning in the dar_filter array  */
               dar_gbl_var_p ->dar_filter_array[index].mask_warning = 0x00;
               break;
            }

            default:
            {
               /* Unknow level has been received */
               DAR_TRACE_WARNING("A DAR unknow level has been received ");
               break; 
            }
         } /* switch(msg_p->use_msg_parameter.level) */
      } /* if (search_group(msg_p->use_msg_parameter.group_nb,*index_gbl_p)== RV_OK) */

      else
      {
         /* if the group doesn't exist and if there is enough space in the dar_filter_array */
         if ( dar_add_group(&index)== RV_OK)
         {
            /* ... add the group in the dar_array_filter */
            dar_gbl_var_p ->dar_filter_array[index].group_nb |= msg_p->use_msg_parameter.group_nb;
            /* Check the Dar level  */
            switch(msg_p->use_msg_parameter.level) 
            {
               case DAR_WARNING:
               {   /* The DAR entity wants to process Warning messages */
                   /* add the mask_warning in the dar_filter array */
                  dar_gbl_var_p ->dar_filter_array[index].mask_warning |= 
                                                           msg_p->use_msg_parameter.mask;
                  break;
               }

               case DAR_DEBUG:
               {
                  /* The DAR entity wants to process Debug messages                   */
                  /* As the Warning messages are more important than debug messages,  */
                  /* it processes warning message too                                 */
  
                  /* add the mask_debug in the dar_filter array */
                  dar_gbl_var_p ->dar_filter_array[index].mask_debug |= 
                                                            msg_p->use_msg_parameter.mask;

                  /* add the mask_warning in the dar_filter array  */
                  dar_gbl_var_p ->dar_filter_array[index].mask_warning |= 
                                                            msg_p->use_msg_parameter.mask;
               break;
               }

               default:
               {
                  /* Unknow level has been received */
                  DAR_TRACE_WARNING("A DAR unknow level has been received ");
                  break; 
                };
            } /* switch */
         }/* if ( add_group(msg_p->use_msg_parameter.group_nb,*index_gbl_p)== RV_OK)) */

         else 
         {
            /* There is not enough space in the dar_array_filter */
            DAR_TRACE_WARNING("Not enough space in the dar_array_filter for adding a new group ");
         }
      }
      return(RV_OK);
   }/* dar_filter_request   */


   /********************************************************************************/
   /*                                                                              */
   /*    Function Name:   dar_write_data_in_buffer                                 */
   /*                                                                              */
   /*    Purpose:  This function is called to store diagnose data in RAM buffer    */
   /*                                                                              */
   /*              note: In order to separate the different string, the data are   */
   /*              ----  stored  as follows:                                       */
   /*                                                                              */
   /*    Input Parameters:                                                         */
   /*        Pointer to the message to store                                       */
   /*        Data Format,                                                          */
   /*        Data level,                                                           */
   /*        Data Use Id,                                                          */
   /*                                                                              */
   /*    Output Parameters:                                                        */
   /*         Validation of the diagnose execution.                                */
   /*                                                                              */
   /*                                                                              */
   /*                                                                              */
   /*    Revision History:                                                         */
   /*        None.                                                                 */
   /*                                                                              */
   /********************************************************************************/
   T_RV_RET dar_write_data_in_buffer( T_DAR_WRITE_START *msg_p)
   {
      /* Local variables */
      UINT8   i = 0;
      UINT8 length = 0;
      
      /* Diagnose string length */
      length = (UINT16) strlen(msg_p->data_write.char_p);
   
      /***   Circular buffer to store data ***/
      /* Add 0xFF to separate 2 strings */
      dar_write_buffer[dar_current_index] = 0xF; 
      DAR_PLUS_PLUS(dar_current_index); /* to detected if it is the end of the buffer */
      dar_write_buffer[dar_current_index] = 0xF; 
      DAR_PLUS_PLUS(dar_current_index); /* to detected if it is the end of the buffer */


      /* The group_nb is 16 bit length, and the buffer is an UINT8 length */
      /* So the group_nb must be stocked by dividing it in 2 parts */
      dar_write_buffer[dar_current_index] = (msg_p->data_write.use_id.group_nb)>>8;
                                         /*add the 8 first bits of the Use id group*/
      DAR_PLUS_PLUS(dar_current_index);
      dar_write_buffer[dar_current_index] = msg_p->data_write.use_id.group_nb;
                                         /*add the 8 last bits of the Use id group*/
      DAR_PLUS_PLUS(dar_current_index);
      /* The mask is 16 bit length, and the buffer is an UINT8 length */
      /* So the mask must be stocked by dividing it in 2 parts */
      dar_write_buffer[dar_current_index] = (msg_p->data_write.use_id.mask)>>8;
                                         /* add the 8 first bits of the Use id mask */
      DAR_PLUS_PLUS(dar_current_index);
      dar_write_buffer[dar_current_index] = msg_p->data_write.use_id.mask;
                                         /* add the 8 last bits of the Use id mask */
      DAR_PLUS_PLUS(dar_current_index);

      /* Add the dar_level data */
      dar_write_buffer[dar_current_index] = msg_p->data_write.level;
      DAR_PLUS_PLUS(dar_current_index);

      /* circular buffer to store diagnose data in RAM buffer */
      for (i=0; i < length; i++ )
      {
         /* copy string in the RAM char by char*/
         dar_write_buffer[dar_current_index]=msg_p->data_write.char_p[i];
         
         /* detection of the end of the buffer */
         /* When current = DAR_MAX_BUFFER_SIZE , current = 0 */
         DAR_PLUS_PLUS(dar_current_index);
      }

      /* DAR information is redirected to standard trace */
      //DAR_SEND_TRACE("circular buffer : ",RV_TRACE_LEVEL_DEBUG_HIGH);
      //rvf_send_trace(msg_p->data_write.char_p, length, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_HIGH, DAR_USE_ID); 

      return(RV_OK);

   } /* dar_send_write_data */

   /********************************************************************************/
   /* Function         dar_empty_mb_and_save_data                                  */
   /*                                                                              */
   /* Description      This function is used to empty the mailbox and save data in */
   /*                  the RAM buffer                                              */
   /*                                                                              */
   /*    Input Parameters:                                                         */
   /*        Pointer to the message to store                                       */
   /*                                                       											  */                                                      
   /*    Output Parameters:                                                        */
   /*        Validation of the function execution.								                  */
   /*                                                                              */
   /*    Note:                                                                     */
   /*        None                                                                  */
   /*                                                                              */
   /********************************************************************************/                                                                               
   T_RV_RET dar_empty_mb_and_save_data(  T_DAR_INFO *buffer_p)
   {
      /* Declare local variables */
      UINT8       i        = 0;
      UINT16      length   = 0;
      T_RV_HDR    *msg_p   = ( T_RV_HDR*) dar_read_mbox(DAR_MBOX);

      /**** Empty the mail box ****/
      while(msg_p != NULL)
      {
         /* If it's a Write message, store it in the Ram */
         /* ( it is not interesting to store filter message ) */
         if ((msg_p->msg_id) == DAR_WRITE_REQ)
         {
            /* store themessage in the RAM*/
            dar_write_data_in_buffer((T_DAR_WRITE_START *)msg_p);
         }
         /* free the Header of the message */
         rvf_free_buf((T_RVF_BUFFER *) msg_p);

         /* Read the next message */ 
         msg_p = ( T_RV_HDR*) dar_read_mbox(DAR_MBOX);
      } /* while (msg_p != NULL) */

      /**** Store data in RAM buffer ****/            
      /* Diagnose string length */
      length = (UINT16) strlen(buffer_p);
      
      /**   Circular buffer to store data **/
      /* Add 0xFF to separate 2 strings */
      dar_write_buffer[dar_current_index] = 0xF; 
      DAR_PLUS_PLUS(dar_current_index); /* to detected if it is the end of the buffer */
      dar_write_buffer[dar_current_index] = 0xF; 
      DAR_PLUS_PLUS(dar_current_index); /* to detected if it is the end of the buffer */

      /* Add the dar_level data */
      dar_write_buffer[dar_current_index] = DAR_EXCEPTION;
      DAR_PLUS_PLUS(dar_current_index);
      /* circular buffer to store diagnose data in RAM buffer */
      for (i=0; i < length; i++ )
      {
         /* copy string in the RAM char by char*/
         dar_write_buffer[dar_current_index]=buffer_p[i];
         
         /* detection of the end of the buffer */
         /* When current = DAR_MAX_BUFFER_SIZE , current = 0 */
         DAR_PLUS_PLUS(dar_current_index);
      }

      return(RV_OK);

   }/* dar_empty_mb_and_save_data*/


#endif /* #ifdef RVM_DAR_SWE */



/********************************************************************************/
/*                                                                              */
/*              ------------------------------------------------                */
/*             |       WARNING       -      IMPORTANT           |               */
/*              ------------------------------------------------                */
/*                                                                              */
/*                                                                              */
/*    Function Name:   dar_lib                                                  */
/*                                                                              */
/*    Purpose:  This function is only used in order to have a function in the   */ 
/*               dar_lib when the DAR is NOT_COMPILED                           */
/*                                                                              */
/*    Input Parameters:                                                         */
/*         None                                                                 */
/*                                                                              */
/*    Output Parameters:                                                        */
/*         NONE                                                                 */
/*                                                                              */
/********************************************************************************/
void dar_lib(void)
{
}