view src/g23m-gsm/mm/mm_em.h @ 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 fa8dc04885d8
children
line wrap: on
line source

/*
+-----------------------------------------------------------------------------
|  Project :
|  Modul   :
+-----------------------------------------------------------------------------
|  Copyright 2003 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 : Engineering Mode (EM) Declarations + Macros
|
+-----------------------------------------------------------------------------
*/
  
#ifndef MM_EM_H
#define MM_EM_H

#ifdef FF_EM_MODE
/* ---------------- data declarations for EM ----------------*/

/*
 * Ring buffer is by one bigger than max. number of prims, because it
 * needs always one empty entry
 */
#define EM_MM_BUFFER_SIZE             168           

/*
 * EM_MAX_MM_EVENTS defines maximum number of event traces for the engineering 
 * mode. The number is increased by one to ensure that the event numbers 
 * defined in the corresponding document are the same as in the sources.
 */
#define EM_MAX_MM_EVENTS              19

/*
 * The offset is used to indicate the source entity the event trace is from. 
 * L1/ALR = 0x00, DL = 0x2D, RR = 0x37, MM = 0x5F, 
 * CC = 0x78, SS = 0xAF, SMS = 0xBE, SIM = E1
 */
#define MM_OFFSET                   0x5F
#define EM_ESTABLISHED                 2
#define EM_FAILED                      3
#define EM_ACCEPT                      4
#define EM_REJECT                      5
#define EM_AUTOMATIC                   0
#define EM_MANUAL                      1
#define EM_LIMITED_SERVICE             8
#define EM_FULL_SERVICE                9
#define EM_NO_SERVICE                 10
#define EM_NORMAL_LUP                 11
#define EM_PERIODIC_LUP               12
#define EM_IMSI_ATTACH_LUP            13
#define EM_REQUEST                    14
#define EM_RESPONSE                   15
#define EM_CIPHERING                  14
#define EM_COMMAND                    15

/*
 * Type is combination of entity index(upper nibble) plus 
 * event number(lower nibble). To optimize the buffersize, 
 * the data is packed in the buffer as follows: type, length, value
 * Value is the combination of the additional parameters 
 * as defined in 8443.601, coded as UBYTE.
 */
#define MM_V_1            (1+MM_OFFSET)
#define MM_V_2            (2+MM_OFFSET)
#define MM_V_3            (3+MM_OFFSET)
#define MM_V_4            (4+MM_OFFSET)
#define MM_V_5            (5+MM_OFFSET)
#define MM_V_6            (6+MM_OFFSET)
#define MM_V_7            (7+MM_OFFSET)
#define MM_V_8            (8+MM_OFFSET)
#define MM_V_9            (9+MM_OFFSET)
#define MM_V_10          (10+MM_OFFSET)
#define MM_V_11          (11+MM_OFFSET)
#define MM_V_12          (12+MM_OFFSET)
#define MM_V_13          (13+MM_OFFSET)
#define MM_V_14          (14+MM_OFFSET)
#define MM_V_15          (15+MM_OFFSET)
#define MM_V_16          (16+MM_OFFSET)
#define MM_V_17          (17+MM_OFFSET)
#define MM_V_18          (18+MM_OFFSET)

EXTERN BOOL mm_v[EM_MAX_MM_EVENTS];

EXTERN UBYTE em_mm_event_buffer[EM_MM_BUFFER_SIZE];
EXTERN UBYTE em_mm_buffer_write;

/*----------------- Functions ---------------------*/


/*
 *  Mobility management primitives Engineering Mode
 *  Bitmask for the event tracing
 */
EXTERN void mm_em_mm_event_req         (T_EM_MM_EVENT_REQ       *em_mm_event_req);
EXTERN void mm_em_dl_event_req         (T_EM_DL_EVENT_REQ       *em_dl_event_req);
EXTERN void em_init_mm_event_trace     (void);

/*
 * If all entities are linked into one module this definitions
 * prefixes all this functions with the enity name
 */
#ifdef OPTION_MULTITHREAD
  #define em_write_buffer_2        _ENTITY_PREFIXED(em_write_buffer_2)
  #define em_write_buffer_3        _ENTITY_PREFIXED(em_write_buffer_3)
  #define em_write_buffer_3a       _ENTITY_PREFIXED(em_write_buffer_3a)
  #define em_write_buffer_3b       _ENTITY_PREFIXED(em_write_buffer_3b)  
  #define em_write_buffer_4        _ENTITY_PREFIXED(em_write_buffer_4)
  #define em_write_buffer_4a       _ENTITY_PREFIXED(em_write_buffer_4a)  
  #define em_write_buffer_4b       _ENTITY_PREFIXED(em_write_buffer_4b)
  #define em_write_buffer_4c       _ENTITY_PREFIXED(em_write_buffer_4c)  
  #define em_write_buffer_5a       _ENTITY_PREFIXED(em_write_buffer_5a)
  #define em_write_buffer_6        _ENTITY_PREFIXED(em_write_buffer_6)

  #define check_write_index     _ENTITY_PREFIXED(check_write_index)
#endif /*OPTION_MULTITHREAD*/

EXTERN UBYTE em_write_buffer_2  (UBYTE event_no);
EXTERN UBYTE em_write_buffer_3  (UBYTE event_no, UBYTE value);
EXTERN UBYTE em_write_buffer_3a  (UBYTE event_no, USHORT value);
EXTERN UBYTE em_write_buffer_3b (UBYTE event_no, ULONG value);
EXTERN UBYTE em_write_buffer_4 (UBYTE event_no, UBYTE value1, T_plmn *plmn);
EXTERN UBYTE em_write_buffer_4a (UBYTE event_no, UBYTE value1, USHORT value2);
EXTERN UBYTE em_write_buffer_4b (UBYTE event_no, UBYTE ident_type, UBYTE *value);
EXTERN UBYTE em_write_buffer_4c (UBYTE event_no, UBYTE ident_type, ULONG value);
EXTERN UBYTE em_write_buffer_5a (UBYTE event_no, UBYTE value, UBYTE mcc[SIZE_MCC], UBYTE mnc[SIZE_MNC]);
EXTERN UBYTE em_write_buffer_6 (UBYTE event_no, UBYTE loc_upd_type, T_loc_area_ident lai);



EXTERN UBYTE check_write_index (UBYTE n);



/* ---------------- Macro definitions ---------------------- */

#define EM_SIM_INSERT \
      /* SIM Insert */\
      if (mm_v[1])\
      {\
        mm_v[1] = em_write_buffer_2 (MM_V_1 );\
      }  /* mm_v[1] */

#define EM_SIM_REMOVE \
  /* SIM remove */\
  if (mm_v[2])\
  {\
    mm_v[2] = em_write_buffer_2 (MM_V_2 );\
  } /* mm_v[2] */

#define EM_SET_PLMN_SEARCH_MODE \
  /* Set PLMN search mode */\
  if (mm_v[3])\
  {\
    mm_v[3] = em_write_buffer_3 (MM_V_3 , plmn_mode_req->mode);\
  }  /* mm_v[3] */

#define EM_START_REGISTRATION_AUTO_MODE \
  /* Start registration auto mode */\
  if (mm_v[4])\
  {\
    mm_v[4] = em_write_buffer_5a (MM_V_4, SERVICE_MODE_FULL,\
                             mm_data->reg.actual_plmn.mcc,\
                             mm_data->reg.actual_plmn.mnc);\
  } /* mm_v[4] */

#define EM_START_REGISTRATION_MANUAL_MODE \
      /* Start registration manual mode */\
      if (mm_v[4])\
      {\
        mm_v[4] = em_write_buffer_5a (MM_V_4, service_mode, mm_data->mm.lai.mcc, mm_data->mm.lai.mnc);\
      } /* mm_v[4] */

#define EM_START_PLMN_LIST_REQUEST \
     /* Start PLMN list request */\
    if (mm_v[5])\
    {\
      mm_v[5] = em_write_buffer_2 (MM_V_5 );\
    }  /* mm_v[5] */

#define EM_CELL_SELECTION_RESELECTION \
 /* Cell selection/reselection */\
  if (mm_v[6])\
  {\
    mm_v[6] = em_write_buffer_5a (MM_V_6, rr_activate_cnf->op.service, rr_activate_cnf->plmn.mcc, rr_activate_cnf->plmn.mnc);\
  }  /* mm_v[6] */

#define EM_RESULT_PLMN_LIST \
/* MM Event Tracing */\
/* Result PLMN list */\
  if (mm_v[7])\
  {\
    mm_v[7] = em_write_buffer_4(MM_V_7, rr_abort_ind->plmn_avail, rr_abort_ind->plmn);\
  }  /* mm_v[7] */

#define EM_RR_CONECTION_REQUESTED \
  /* RR connection requested */\
  if (mm_v[8])\
  {\
    mm_v[8] = em_write_buffer_6 (MM_V_8, loc_upd_type, mm_data->mm.lai);\
  }  /* mm_v[8] */

#define EM_RR_CONECTION_ESTABLISHED \
  /* RR connection established */\
  if (mm_v[9])\
  {\
    mm_v[9] = em_write_buffer_2 (MM_V_9);\
  }  /* mm_v[9] */

#define EM_RR_CONNECTION_ESTABLISHED_2 \
      if (mm_count_connections (CM_PENDING) NEQ 0)\
      {\
        /* RR connection established */\
        if (mm_v[9])\
        {\
          /* Event number flag is set */\
          mm_v[9] = em_write_buffer_3a (MM_V_9, mm_data->rej_cause);\
        } /* mm_v[9] */\
      } /* mm_count_connections (CM_PENDING) */

#define EM_LOCATION_UPDATING \
                /* Location updating */\
              if (mm_v[10])\
              {\
                mm_v[10] = em_write_buffer_3 (MM_V_10, EM_ACCEPT);\
              }  /* mm_v[10 */

#define EM_LOCATION_UPDATING_REJECT \
  /* Location updating reject*/\
  if (mm_v[10])\
  {\
    mm_v[10]=em_write_buffer_4a ( MM_V_10, EM_REJECT, mm_data->limited_cause);\
  } /* mm_v[10] */

#define EM_TMSI_REALLOCATION_COMPLETE\
              /* TMSI reallocation complete */\
              if (mm_v[11])\
              {\
                mm_v[11]=em_write_buffer_3b (MM_V_11, mm_data->reg.tmsi);\
              }  /* mm_v[11] */

#define EM_IMSI_DETACH \
  /* IMSI detach */\
  if (mm_v[12])\
  { \
    mm_v[12] = em_write_buffer_2 (MM_V_12);\
  } /* mm_v[12] */

#define EM_IDENTITY_REQUEST_RESPONSE \
          /* Identity request/response */\
          if (mm_v[13])\
          {\
            switch (ident_req->ident.ident_type)\
            {\
                case ID_TYPE_IMSI:\
                case ID_TYPE_IMEI:\
                case ID_TYPE_IMEISV:  /*stores ident_type and IMSI|IMEI|IMEISV*/\
                  mm_v[13]=em_write_buffer_4b(MM_V_13, ident_req->ident.ident_type, ident_res->mob_id.ident_dig);\
                  break;\
                case ID_TYPE_TMSI:  /*stores ident_type and TMSI*/\
                  mm_v[13]=em_write_buffer_4c(MM_V_13, ident_req->ident.ident_type, mm_data->reg.tmsi);\
                  break;\
                default: /* Illegal mobile identity */\
                  break;\
            }/*switch*/\
          }  /* mm_v[13] */

#define EM_AUTHENTICATION(x) \
        /* Authentication reject*/\
        if (mm_v[14])\
        {\
          mm_v[14] = em_write_buffer_3 (MM_V_14, x);\
        }  /* mm_v[14] */

#define EM_CM_SERVICE_REQUESTED \
        /* CM service requested */\
        if (mm_v[15])\
        {\
          mm_v[15] = em_write_buffer_3 (MM_V_15, mm_data->pend_conn.comp);\
        } /* mm_v[15] */

#define EM_CM_SERVICE_ACCEPTED(x) \
          /* CM service accepted */\
          if (mm_v[16])\
          {\
            mm_v[16] = em_write_buffer_3 (MM_V_16, x);\
          }  /* mm_v[16] */

#define EM_CM_SERVICE_REJECT \
      /* CM service reject */\
      if (mm_v[17])\
      {\
        mm_v[17] = em_write_buffer_3a (MM_V_17, cm_serv_rej->rej_cause);\
      }  /* mm_v[17] */

#define EM_SERVICE_ABORTED \
        /* CM service aborted */\
        if (mm_v[18])\
        {\
         mm_v[18] = em_write_buffer_2 (MM_V_18);\
        }  /* mm_v[18] */

#else /*FF_EM_MODE not defined*/

  /*Macros will stay empty, if no EM */
#define EM_SIM_INSERT                                   /* Event 1*/
#define EM_SIM_REMOVE                                   /* Event 2*/
#define EM_SET_PLMN_SEARCH_MODE                         /* Event 3*/
#define EM_START_REGISTRATION_AUTO_MODE                 /* Event 4*/
#define EM_START_REGISTRATION_MANUAL_MODE               /* Event 4*/
#define EM_START_PLMN_LIST_REQUEST                      /* Event 5*/
#define EM_CELL_SELECTION_RESELECTION                   /* Event 6*/
#define EM_RESULT_PLMN_LIST                             /* Event 7*/
#define EM_RR_CONECTION_REQUESTED                       /* Event 8*/
#define EM_RR_CONECTION_ESTABLISHED                     /* Event 9*/
#define EM_RR_CONNECTION_ESTABLISHED_2                  /* Event 9*/
#define EM_LOCATION_UPDATING                            /* Event 10*/
#define EM_LOCATION_UPDATING_REJECT                     /* Event 10*/
#define EM_TMSI_REALLOCATION_COMPLETE                   /* Event 11*/
#define EM_IMSI_DETACH                                  /* Event 12*/
#define EM_IDENTITY_REQUEST_RESPONSE                    /* Event 13*/
#define EM_AUTHENTICATION(x)                            /* Event 14*/
#define EM_CM_SERVICE_REQUESTED                         /* Event 15*/
#define EM_CM_SERVICE_ACCEPTED(x)                       /* Event 16*/
#define EM_CM_SERVICE_REJECT                            /* Event 17*/
#define EM_SERVICE_ABORTED                              /* Event 18*/

#endif  /* FF_EM_MODE */
#endif /* MM_EM_H */