FreeCalypso > hg > fc-tourmaline
view src/condat/com/include/gsm.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 | 4e78acac3d88 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-PS (6147) | Modul : GSM +----------------------------------------------------------------------------- | 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 : Definition of global constants, types, and macros | for the GSM Protocol Stack +----------------------------------------------------------------------------- */ #ifndef GSM_H #define GSM_H #ifndef CCONST_CDG #include "mconst.cdg" /* MAX_BITSTREAM_LEN */ #endif /* CCONST_CDG */ #ifndef PCONST_CDG #include "pconst.cdg" /* MAX_PSTRUCT_LEN */ #endif /* PCONST_CDG */ /*==== CONSTANTS ==================================================*/ #define MAX_2_PRM 1 #define MAX_4_PRM 3 #define MAX_8_PRM 7 #define MAX_16_PRM 15 #define MAX_32_PRM 31 #define PRM_MASK 0x00FF /* protocol primitive mask*/ #define OPC_MASK 0xFF00 /* entity mask */ #define SYS_MASK 0x8000 /* system primitive mask */ #define SYS_CONFIG_REQ 0xF000 #define L3_CODING_OFFSET 32 /* coding offset in bits */ /* * Not Present Value */ #define NOT_PRESENT_8BIT 0xFF #define NOT_PRESENT_CHAR (CHAR)0xFF #define NOT_PRESENT_16BIT 0xFFFF #define NOT_PRESENT_32BIT 0xFFFFFFFFL #define INVALID_ADDRESS 0xFFFFFFFFL #define SET_NOT_PRESENT(A) ((A) = ((sizeof ((A)) EQ 1)\ ? NOT_PRESENT_8BIT\ : (sizeof ((A)) EQ 2)\ ? NOT_PRESENT_16BIT\ : NOT_PRESENT_32BIT)) #define IS_PRESENT(A) ((A) NEQ ((sizeof ((A)) EQ 1)\ ? NOT_PRESENT_8BIT\ : (sizeof ((A)) EQ 2)\ ? NOT_PRESENT_16BIT\ : NOT_PRESENT_32BIT)) /* VK 09-12-96 */ #ifndef NEW_FRAME /* * Static Configurations */ #ifndef TC_FUNC #define TC_FUNC 1 #endif #ifdef TRACE_FKT #define TRACE_FUNCTION(a) vsi_o_trace(VSI_CALLER TC_FUNC,a); #else // China change HM 6.07.00, one of this commented out #define TRACE_FUNCTION(a) //#define TRACE_FUNCTION(a) vsi_o_mtrace(a); #endif #ifndef TC_EVE #define TC_EVE 2 #endif #ifdef TRACE_EVE #define TRACE_EVENT(a) vsi_o_trace(VSI_CALLER TC_EVENT,a); #else #define TRACE_EVENT(a) #endif #ifndef TC_ERROR #define TC_ERROR 4 #endif #ifdef TRACE_ERR #define TRACE_ERROR(a) vsi_o_trace(VSI_CALLER TC_ERROR,a); #else #define TRACE_ERROR(a) #endif #ifndef TC_PRIM #define TC_PRIM 8 #endif #ifdef TRACE_PRIM #define TRACE_PRIMITIVE(a) vsi_o_trace(VSI_CALLER TC_PRIM,a); #else #define TRACE_PRIMITIVE(a) #endif #ifndef TC_SYSTEM #define TC_SYSTEM 16 #endif /* * Assert wrapper */ #if defined NDEBUG #define TRACE_ASSERT(e) ((void)0) #else #ifdef SHARED_VSI #define TRACE_ASSERT(e) if ( !(e) ) vsi_o_assert("",#e,__FILE__,__LINE__) #else #define TRACE_ASSERT(e) if ( !(e) ) vsi_o_assert(#e,__FILE__,__LINE__) #endif #endif #ifdef assert #undef assert #endif #define assert TRACE_ASSERT #endif /* NEW_FRAME */ /* * Memory Management(I) */ #ifdef OPTION_REF #define FREE_BUFFER(p) vsi_c_free(VSI_CALLER (void **)&p) /*lint -e773 Expression-like macro not parenthesized*/ #define NEW_BUFFER(p,s) T_PRIM *p = vsi_c_new(VSI_CALLER (T_VSI_CSIZE)((s)+sizeof(T_PRIM_HEADER))) /*lint +e773*/ #else #define FREE_BUFFER(p) #define NEW_BUFFER(p,s) UBYTE buf_##p [(s)+sizeof(T_PRIM_HEADER)]; T_PRIM *p=(T_PRIM*)p1 #endif #if !defined (_TMS470) #define Sprintf sprintf #else int sprintf( char *buffer, const char *format, ... ); #endif #ifndef NEW_FRAME #ifdef _TMS470 #define SET_PRIM_OPCODE(P,O) P->custom.opc = O; P->custom.opc2 = 0 #else #define SET_PRIM_OPCODE(P,O) P->custom.opc = O #endif #ifdef OPTION_LENGTH #define SEND_PRIM(E,P,O,T) SET_PRIM_OPCODE (P,O); vsi_c_send (VSI_CALLER hComm##E, P, sizeof(T_PRIM_HEADER) + sizeof (T)) #define SEND_PRIM_0(E,P,O) SET_PRIM_OPCODE (P,O); vsi_c_send (VSI_CALLER hComm##E, P, sizeof(T_PRIM_HEADER)) #define SEND_PRIM_SDU(E,P,O,T,L) SET_PRIM_OPCODE (P,O); vsi_c_send (VSI_CALLER hComm##E, P, (T_VSI_CSIZE) (sizeof(T_PRIM_HEADER) + sizeof (T) + (L) - SDU_TRAIL)) #else #define SEND_PRIM(E,P,O,T) SET_PRIM_OPCODE (P,O); vsi_c_send (VSI_CALLER hComm##E, P, sizeof(T_PRIM_HEADER) + sizeof (T)) #define SEND_PRIM_0(E,P,O) SET_PRIM_OPCODE (P,O); vsi_c_send (VSI_CALLER hComm##E, P, sizeof(T_PRIM_HEADER)) #define SEND_PRIM_SDU(E,P,O,T,L) SET_PRIM_OPCODE (P,O); vsi_c_send (VSI_CALLER hComm##E, P, (T_VSI_CSIZE) (sizeof(T_PRIM_HEADER) + sizeof (T) + (L) - SDU_TRAIL)) #endif #endif /* NEW_FRAME */ /* * declares a pointer variable (D) of the type T * and initialize it with the startaddress of the data part * of the primitive P */ #ifndef ALLOC_CHECK #if defined (_TMS470) AND defined (NWARN) #define PRIM_ACCESS(P,S) &P->data #else #define PRIM_ACCESS(P,S) P->data #endif #else #define PRIM_ACCESS(P,S) vsi_c_access(VSI_CALLER P,S) #endif /*lint -e773 Expression-like macro not parenthesized*/ #define PRIM_CAST(P,D,T) T *D = (T *) PRIM_ACCESS (P, sizeof (T)) /*lint +e773*/ /* * declares a pointer variable (D) of the type T and * initialize it with the start address of the global declared * buffer _decodedMsg[] wich contains the decoded message * structure before encoding or after decoding the message * with CCD. */ /*lint -e773 Expression-like macro not parenthesized*/ #define MSG_CAST(D,T) T *D = (T *) _decodedMsg /*lint +e773*/ /* * Memory Management(II) */ #ifndef NEW_FRAME #if defined (_TMS470) AND defined (NWARN) #define P2D(P) (&(P)->data) #else #define P2D(P) ((P)->data) #endif #define D2P(D) ((T_PRIM*)((T_PRIM_HEADER*)(D)-1)) #ifdef ALLOC_CHECK #define P2D_AC(P,T) PRIM_ACCESS(P,sizeof(T)) #else #define P2D_AC(P,T) P2D(P) #endif #define PRIM_TO_DATA P2D #define DATA_TO_PRIM D2P #define P_OPC(P) (P)->custom.opc #define P_OPC2(P) (P)->custom.opc2 #define P_LEN(P) (P)->custom.len #define P_TID(P) (P)->custom.tid #define P_SDU(P) (P)->custom.sdu #define D_OPC(D) P_OPC(D2P(D)) #define D_OPC2(D) P_OPC2(D2P(D)) #define D_LEN(D) P_LEN(D2P(D)) #define D_TID(D) P_TID(D2P(D)) #define D_SDU(D) P_SDU(D2P(D)) #define D_SDU_LEN(D) D_SDU(D)->l_buf #define D_SDU_OFF(D) D_SDU(D)->o_buf #define BITS_PER_BYTE 8 #define BYTELEN(BITLEN) ((BITLEN)<=0?0:((((BITLEN)-1)/BITS_PER_BYTE)+1)) #define PRIM_SIZE(D) (sizeof(T_PRIM_HEADER)+sizeof(*(D))) #define PRIM_SIZE_SDU(D) (PRIM_SIZE(D)+BYTELEN((D)->sdu.o_buf+(D)->sdu.l_buf)) #define PSIZE(D) (D_LEN(D)+((D_SDU(D)==0)?0:(BYTELEN(D_SDU_LEN(D)+D_SDU_OFF(D))-SDU_TRAIL))) #define SIZ(T) (sizeof(T_PRIM_HEADER)+sizeof(T)) #define SIZ_SDU(T,M) (SIZ(T)+BYTELEN((M)+ENCODE_OFFSET)-SDU_TRAIL) #define P_ALL(T) (T_PRIM *) vsi_c_new(VSI_CALLER (T_VSI_CSIZE)SIZ(T) ) #define P_ALL_SDU(T,M) (T_PRIM *) vsi_c_new(VSI_CALLER (T_VSI_CSIZE)SIZ_SDU(T,M)) #endif /* NEW_FRAME */ #define OFFSETOF(P,C) ((char*)&(P->C) - (char*)P) #ifdef NTRACE #define xxxNotify(A,B,C,D,E) #else #define xxxNotify(A,B,C,D,E) /* not used yet */ #endif #define ACT_PALLOC 0x01 #define ACT_PALLOC_SDU 0x02 #define ACT_PALLOC_MSG 0x03 #define ACT_PREUSE 0x04 #define ACT_PREUSE_SDU 0x05 #define ACT_PREUSE_MSG 0x06 #define ACT_PFREE 0x07 #define ACT_PSEND 0x08 #define ACT_PSTORE 0x09 #define ACT_PRETRIEVE 0x0A #define ACT_PACCESS 0x0B #define ACT_PPASS 0x0C #define ACT_PCAST 0x0D /*** memory alloction ***/ #ifndef NEW_FRAME #define PSENDX PSEND #define PALLOC(D,T) T_##T *D = (T_##T*)P2D(P_ALL(T_##T));\ D_OPC(D) = (T);\ D_OPC2(D) = 0;\ D_LEN(D) = SIZ(T_##T);\ D_SDU(D) = 0;\ xxxNotify(ACT_PALLOC,VSI_CALLER,__FILE__,__LINE__,D2P(D)) #define PALLOC_MSG(D,T,M) T_##T *D = (T_##T*)P2D(P_ALL_SDU(T_##T,BSIZE_##M));\ D_OPC(D) = (T);\ D_OPC2(D) = 0;\ D_LEN(D) = SIZ(T_##T);\ D_SDU(D) = &((D)->sdu);\ D_SDU_LEN(D) = (BSIZE_##M);\ D_SDU_OFF(D) = ENCODE_OFFSET;\ xxxNotify(ACT_PALLOC_MSG,VSI_CALLER,__FILE__,__LINE__,D2P(D)) #define PALLOC_SDU(D,T,N) T_##T *D = (T_##T*)P2D(P_ALL_SDU(T_##T,N));\ D_OPC(D) = (T);\ D_OPC2(D) = 0;\ D_LEN(D) = SIZ(T_##T);\ D_SDU(D) = &((D)->sdu);\ D_SDU_LEN(D) = (N);\ D_SDU_OFF(D) = ENCODE_OFFSET;\ xxxNotify(ACT_PALLOC_SDU,VSI_CALLER,__FILE__,__LINE__,D2P(D)) #define PREUSE(D0,D,T) T_##T *D = (T_##T*)P2D_AC(D2P(D0),T);\ D_OPC(D) = (T);\ D_OPC2(D) = 0;\ D_LEN(D) = SIZ(T_##T);\ D_SDU(D) = 0;\ xxxNotify(ACT_REUSE,VSI_CALLER,__FILE__,__LINE__,D2P(D)) #define PREUSE_MSG(D,T,M) T_##T *D = (T_##T*)P2D_AC(D2P(D0),T);\ D_OPC(D) = (T);\ D_OPC2(D) = 0;\ D_LEN(D) = SIZ(T_##T);\ D_SDU(D) = &((D)->sdu);\ D_SDU_LEN(D) = (BSIZE_##M);\ D_SDU_OFF(D) = ENCODE_OFFSET;\ xxxNotify(ACT_PREUSE_MSG,VSI_CALLER,__FILE__,__LINE__,D2P(D)) #define PREUSE_SDU(D,T,N) T_##T *D = (T_##T*)P2D_AC(D2P(D0),T);\ USHORT BSIZE_##N;\ D_OPC(D) = (T);\ D_OPC2(D) = 0;\ D_LEN(D) = SIZ(T_##T);\ D_SDU(D) = &((D)->sdu);\ D_SDU_LEN(D) = (N);\ D_SDU_OFF(D) = ENCODE_OFFSET;\ xxxNotify(ACT_PREUSE_SDU,VSI_CALLER,__FILE__,__LINE__,D2P(D)) #define PFREE(D) { void *z=(void*)D2P(D);\ vsi_c_free(VSI_CALLER (void **)&z);\ xxxNotify(ACT_PFREE,VSI_CALLER,__FILE__,__LINE__,D2P(D)); } #define PSEND(E,D) PTRACE_OUT(D_OPC(D));\ vsi_c_send (VSI_CALLER hComm##E, D2P(D), (T_VSI_CSIZE) PSIZE(D));\ xxxNotify(ACT_PSEND,VSI_CALLER,__FILE__,__LINE__,D2P(D)) #define PPASS(D0,D,T) T_##T *D = (T_##T*)P2D_AC(D2P(D0),T);\ D_OPC(D) = (T);\ xxxNotify(ACT_PPASS,VSI_CALLER,__FILE__,__LINE__,D2P(D)) #define PACCESS(D) xxxNotify(ACT_PACCESS,VSI_CALLER,__FILE__,__LINE__,D2P(D)) #endif /* NEW_FRAME */ /* * to achieve backward compatibility */ #if defined (NEW_FRAME) #ifdef TI_PS_HCOMM_CHANGE #define PSENDX(A,B) PSEND(_hComm##A,B) #define _hCommACI hCommACI #else #define PSENDX(A,B) PSEND(hComm##A,B) #endif #else #define PSENDX PSEND #endif #define PRETRIEVE /* NOT DEFINED YET */ #define MCAST(D,T) MSG_CAST(D,T_##T) #define PCAST(P,D,T) T_##T *D = (T_##T*)P2D_AC(P,T);\ P_OPC(P)=T;\ xxxNotify(ACT_PCAST,VSI_CALLER,__FILE__,__LINE__,D2P(D)) #define PCOPY(DEST,SOURCE) memcpy(DEST,SOURCE,PSIZE(SOURCE)-sizeof(T_PRIM_HEADER)) /*** trace primitive, trace state ***/ #ifndef NEW_FRAME #ifdef NTRACE #define SET_STATE(PROCESS,STATE) ENTITY_DATA->state[PROCESS] = STATE #define GET_STATE(PROCESS) ENTITY_DATA->state[PROCESS] #define PTRACE_IN(OPC) #define PTRACE_OUT(OPC) #else #define SET_STATE(PROCESS,STATE)\ ENTITY_DATA->state[PROCESS] =\ vsi_o_strace (VSI_CALLER\ PROCESS_NAME[PROCESS],\ PROCESS##_NAME [ ENTITY_DATA->state[PROCESS] ],\ PROCESS##_NAME [ STATE ],\ STATE ) #define GET_STATE(PROCESS)\ vsi_o_strace (VSI_CALLER\ PROCESS_NAME[PROCESS],\ PROCESS##_NAME [ ENTITY_DATA->state[PROCESS] ],\ NULL ,\ ENTITY_DATA->state[PROCESS] ) #define PTRACE_IN(OPC) vsi_o_ptrace (VSI_CALLER OPC, 0) #define PTRACE_OUT(OPC) vsi_o_ptrace (VSI_CALLER OPC, 1) #endif #endif /* NEW_FRAME */ /* * Timer, Jump Table, Configuration */ #ifdef OPTION_TIMER #define TSTART(i,h,v) tim_start_timer(i,h,v) #else #define TSTART(i,h,v) TIMER_START(VSI_CALLER h,v) #endif #ifdef OPTION_RELATIVE #define JUMP(a) (a+offset) #else #define JUMP(a) (a) #endif #ifdef OPTION_SET_CONFIG_ONLY #define GET_CONFIG(s,i) #else #define GET_CONFIG(s,i) pei_get_config(s,i) #endif /* Cause Concept (begin) */ /* * For a definition of the cause concept please refer to document number * 8443.711, named in February 2002 "cause_concept.doc" */ /* definitions for calling the macros */ /* DefinedBy bit */ #define DEFBY_STD 0 #define DEFBY_CONDAT 1 /* OriginatingSide bit */ #define ORIGSIDE_NET 0 #define ORIGSIDE_MS 1 /* * note that OriginatingEntity definitions are in the SAP GSMCOM, which is a * central (pseudo) SAP and the definitions are referenced in the using * "real" SAPs, like e.g. MNSS SAP for the originating entity SS */ /* need to decide whether to mask ORIGIN_ENTITY (max. 6 bits) in the following macro */ #define CAUSE_MAKE(DEFINED_BY, ORIGIN_SIDE, ORIGIN_ENTITY, CAUSE_VALUE) \ (USHORT)(((CAUSE_VALUE) & 0x00FF) |\ ((DEFINED_BY) << 15) |\ ((ORIGIN_SIDE) << 14) |\ ((ORIGIN_ENTITY) << 8)) /* Get the cause value without the originating entity */ #define GET_CAUSE_VALUE(cause) (UBYTE)((cause) & 0xFF) /* Get the entity originating the cause */ #define GET_CAUSE_ORIGIN_ENTITY(cause) (UBYTE)(((cause) >> 8) & 0x3F) /* Get the DefinedBy bit */ #define GET_CAUSE_DEFBY(cause) (UBYTE)((cause) >> 15) /* Get the OriginatingSide bit */ #define GET_CAUSE_ORIGSIDE(cause) (UBYTE)(((cause) >> 14) & 0x01) /* Determine if a cause is invalid */ #define IS_CAUSE_INVALID(cause) (((cause) & 0x80FF) EQ 0x80FF) /* Cause Concept (end) */ /*==== TYPES ======================================================*/ #if defined (_TMS470) && defined (NWARN) typedef struct { UBYTE x [MAX_PSTRUCT_LEN + ( L3_CODING_OFFSET + MAX_BITSTREAM_LEN ) / 8 + 1 ]; } T_PARAMETER; typedef struct { T_PRIM_HEADER custom; T_PARAMETER data; } T_PRIM; #else typedef struct { T_PRIM_HEADER custom; UBYTE data [MAX_PSTRUCT_LEN + ( L3_CODING_OFFSET + MAX_BITSTREAM_LEN ) / 8 + 1 ]; } T_PRIM; #endif /*==== EXPORT =====================================================*/ /* * Multithreading */ #ifdef OPTION_MULTITHREAD #if defined (ENTITY_CST) #define _ENTITY_PREFIXED(N) cst_##N #elif defined (ENTITY_ACI) #define _ENTITY_PREFIXED(N) aci_##N #elif defined (ENTITY_MFW) #define _ENTITY_PREFIXED(N) aci_##N #elif defined (ENTITY_MMI) #define _ENTITY_PREFIXED(N) aci_##N #elif defined (ENTITY_SMI) #define _ENTITY_PREFIXED(N) aci_##N #elif defined (ENTITY_SIM) #define _ENTITY_PREFIXED(N) sim_##N #elif defined (ENTITY_PL) #define _ENTITY_PREFIXED(N) pl_##N #elif defined (ENTITY_L1) #define _ENTITY_PREFIXED(N) l1_##N #elif defined (ENTITY_CC) #define _ENTITY_PREFIXED(N) cc_##N #elif defined (ENTITY_SS) #define _ENTITY_PREFIXED(N) ss_##N #elif defined (ENTITY_ESIM) #define _ENTITY_PREFIXED(N) esim_##N #elif defined (ENTITY_SMS) #define _ENTITY_PREFIXED(N) sms_##N #elif defined (ENTITY_MM) #define _ENTITY_PREFIXED(N) mm_##N #elif defined (ENTITY_RR) #define _ENTITY_PREFIXED(N) rr_##N #elif defined (ENTITY_DL) #define _ENTITY_PREFIXED(N) dl_##N #elif defined (ENTITY_L2R) #define _ENTITY_PREFIXED(N) l2r_##N #elif defined (ENTITY_TRA) #define _ENTITY_PREFIXED(N) tra_##N #elif defined (ENTITY_RLP) #define _ENTITY_PREFIXED(N) rlp_##N #elif defined (ENTITY_T30) #define _ENTITY_PREFIXED(N) t30_##N #elif defined (ENTITY_FAD) #define _ENTITY_PREFIXED(N) fad_##N #elif defined (ENTITY_RA) #define _ENTITY_PREFIXED(N) ra_##N #elif defined (ENTITY_WAP) #define _ENTITY_PREFIXED(N) wap_##N #elif defined (ENTITY_UDP) #define _ENTITY_PREFIXED(N) udp_##N #elif defined (ENTITY_IP) #define _ENTITY_PREFIXED(N) ip_##N #elif defined (ENTITY_RRLP) #define _ENTITY_PREFIXED(N) rrlp_##N #elif defined (ENTITY_PPP) #define _ENTITY_PREFIXED(N) ppp_##N #elif defined (ENTITY_BTI) #define _ENTITY_PREFIXED(N) bti_##N #elif defined (ENTITY_L1) #ifdef NEW_FRAME #include "ofe.h" #endif #elif defined (ENTITY_TAP) #define _ENTITY_PREFIXED(N) tap_##N #elif defined (ENTITY_PCO) #define _ENTITY_PREFIXED(N) pco_##N #elif defined (ENTITY_PAN) #define _ENTITY_PREFIXED(N) pan_##N #elif defined (ENTITY_TST) #define _ENTITY_PREFIXED(N) tst_##N #elif defined (ENTITY_APP) #define _ENTITY_PREFIXED(N) app_##N #endif #endif #endif