FreeCalypso > hg > fc-tourmaline
view src/g23m-aci/aci/psa_cc.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 : GSM-PS (6147) | Modul : PSA +----------------------------------------------------------------------------- | 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 : Definitions for the protocol stack adapter | Call Control ( CC ) +----------------------------------------------------------------------------- */ #ifndef PSA_CC_H #define PSA_CC_H #include "aci_lst.h" /*==== CONSTANTS ==================================================*/ #define DEF_CLIR_SUP (MNCC_CLR_SUP) /* default CLIR suppression */ #define DEF_BC1_UR (MNCC_UR_NOT_PRES) /* default user rate BC 1 */ #define DEF_BC2_UR (MNCC_UR_NOT_PRES) /* default user rate BC 2 */ #define DEF_BC1_BS (MNCC_BEARER_SERV_NOT_PRES) /* default bearer service BC 1 */ #define DEF_BC2_BS (MNCC_BEARER_SERV_NOT_PRES) /* default bearer service BC 2 */ #define DEF_BC1_CE (MNCC_CONN_ELEM_NOT_PRES) /* default connection element BC 1 */ #define DEF_BC2_CE (MNCC_CONN_ELEM_NOT_PRES) /* default connection element BC 2 */ #define DEF_BC1_SB (MNCC_STOP_1_BIT) /* default stop bits BC 1 */ #define DEF_BC2_SB (MNCC_STOP_1_BIT) /* default stop bits BC 2 */ #define DEF_BC1_DB (MNCC_DATA_8_BIT) /* default data bits BC 1 */ #define DEF_BC2_DB (MNCC_DATA_8_BIT) /* default data bits BC 2 */ #define DEF_BC1_PR (MNCC_PARITY_NONE) /* default parity BC 1 */ #define DEF_BC2_PR (MNCC_PARITY_NONE) /* default parity BC 2 */ #define DEF_BC1_FC (MNCC_NO_FLOW_CONTROL) /* default flow control BC 1 */ #define DEF_BC2_FC (MNCC_NO_FLOW_CONTROL) /* default flow control BC 2 */ #define DEF_BC1_MT (MNCC_MT_NONE) /* default flow control BC 1 */ #define DEF_BC2_MT (MNCC_MT_NONE) /* default flow control BC 2 */ #define DEF_BC1_TC (MNCC_ITC_NONE) /* default transfer cap BC 1 */ #define DEF_BC1_RA (MNCC_RATE_ADAPT_NONE) /* default rate adaption BC 1 */ #define DEF_UD_MD (MNCC_MD_NOT_PRES) /* default more user data */ #define DEF_UD_CL (MNCC_CL_NOT_PRES) /* default congest level user data */ #define DEF_RPT_IND (MNCC_RI_NOT_PRES) /* default repeat indicator */ #define DEF_OS_TOS (MNCC_TOS_NOT_PRES) /* default type of subaddress */ #define MAX_ALPHA (20) /* maximum length of alpha identifier */ #define MAX_DTMF_DIG (MAX_DIAL_LEN) /* maximum number of DTMF digits */ #define NO_ENTRY (-1) /* not a valid entry */ typedef enum /* call status */ { NO_VLD_CS = 0, /* not a valid call status */ CS_IDL, /* call idle */ CS_ACT_REQ, /* call active request */ CS_ACT, /* call active */ CS_HLD_REQ, /* call hold request */ CS_HLD, /* call held */ CS_DSC_REQ, /* call disconnect request */ CS_CPL_REQ, /* call completion request */ CS_MDF_REQ, /* call modification request */ CS_SAT_REQ /* call SAT request */ #ifdef FF_SAT_E , CS_SAT_CSD_REQ /* call SAT open CSD channel request */ #endif /* FF_SAT_E */ } T_CC_CLST; typedef enum /* data status */ { NO_VLD_DS = 0, /* not a valid data status */ DS_IDL, /* data idle */ DS_ACT_REQ, /* data active request */ DS_ACT, /* data active */ DS_DSC_REQ, /* data disconnect request */ DS_ABO_REQ, /* data abort request */ DS_MDF_REQ, /* data modification request */ DS_REST_REQ, /* data reestablishment request */ DS_STOP_REQ, /* data stop request */ DS_TCH_MDF /* data TCH modification expected */ } T_CC_DTST; typedef enum { NO_VLD_CT = 0, /* not a valid call type */ CT_MOC, /* mobile originated call */ CT_MTC, /* mobile terminated call */ CT_NI_MOC, /* network initiated mobile originated call */ CT_MOC_RDL /* redialling mobile originated call */ } T_CC_CLTP; typedef enum { NO_VLD_AS = 0, /* not a valid alert state */ AS_IDL, /* alerting not sended */ AS_PND, /* alerting pending */ AS_SND /* alerting sended */ } T_CC_ALST; typedef enum { NO_VLD_MT = 0, /* not a valid message type */ MT_SETUP, /* setup message */ MT_DISC, /* disconnect message */ MT_ALRT, /* alert message */ MT_PROC, /* proceeding message */ MT_SYNC, /* synchronization message */ MT_PROGR, /* progress message */ MT_CONN /* connected message */ } T_CC_MSGT; typedef enum { NO_VLD_BCRI = 0, /* not a valid bc request id */ BCRI_SAT /* bc request by SAT */ } T_BC_RQID; typedef enum { NO_VLD_CCBSS = 0, /* not a valid CCBS status */ CCBSS_PSSBL, /* CCBS is possible */ CCBSS_REQ /* CCBS registration requested */ } T_CC_CCBSS; typedef enum { NO_VLD_CD = 0, /* not a valid CD status */ CD_Requested, /* CD Request sent */ CD_Failed, /* CD Request failed (Reject, Error) */ CD_Succeeded, /* CD Request succeeded (Result) */ CD_Notified /* CD Notification received */ } T_CD_STAT; /* Wap States for the parameter CCShrdParm.wapStat */ #if defined (FF_WAP) || defined (FF_SAT_E) typedef enum { CC_WAP_STACK_DOWN = 0, /* Wapstack is down */ CC_WAP_STACK_UP /* Wapstack is activ */ } T_CC_WAP; #endif typedef enum { END_UNDEFINED = -1, NEAR_END, FAR_END } T_CC_INITIATER; typedef enum { TTY_STATE_NONE, TTY_STATE_IDLE, TTY_STATE_SYNC, TTY_STATE_BCAP, TTY_STATE_WAIT, TTY_STATE_ACTIVE } T_CC_TTY_STATE; typedef enum { ALS_CMD_NONE, ALS_CMD_SET, ALS_CMD_TEST } T_CC_ALS_CMD; /*==== TYPES ======================================================*/ typedef struct CCDTMFPrm { SHORT cId; /* DTMF related call id */ UBYTE cnt; /* count of DTMF to send */ UBYTE cur; /* current DTMF digit */ UBYTE dig[MAX_DTMF_DIG+1]; /* buffer for DTMF digits to send +'\0'*/ } T_CC_DTMF_PRM; /* * called party, dynamic structure */ typedef struct { UBYTE ton; /* type of number */ UBYTE npi; /* numbering plan identification */ UBYTE c_called_num; /* number of BCD digits */ UBYTE *called_num; /* bcd (unpacked) */ } T_dyn_called_party; /* * redirecting party, dynamic structure */ typedef struct { UBYTE ton; /* type of number */ UBYTE npi; /* numbering plan identification */ UBYTE present; /* presentation indicator */ UBYTE screen; /* screening indicator */ UBYTE c_redir_num; /* number of BCD digits */ UBYTE *redir_num; /* bcd (unpacked) */ } T_dyn_redir_party; /* * subaddress, dynamic structure */ typedef struct { UBYTE tos; /* type of subaddress */ UBYTE odd_even; /* odd / even indicator */ UBYTE c_subaddr; /* length of subaddress info */ UBYTE *subaddr; /* subaddress information */ } T_dyn_redir_party_sub; typedef struct CCCallTabl { UBYTE ti; /* transaction identifier */ UBYTE calStat; /* call status */ UBYTE calType; /* type of call */ UBYTE alrtStat; /* alerting status */ BOOL inBndTns; /* in-band tones flag */ UBYTE prgDesc; /* progress description */ T_MNCC_bcpara BC[2]; /* bearer capabilities */ UBYTE curBC; /* current bearer capability */ T_MNCC_calling_party clgPty; /* calling party address */ T_MNCC_calling_party_sub clgPtySub; /* calling party subaddress */ T_dyn_called_party cldPty; /* called party address */ T_MNCC_called_party_sub cldPtySub; /* called party subaddress */ T_dyn_redir_party rdrPty; /* Redirecting party */ T_dyn_redir_party_sub rdrPtySub; /* Redirecting party subaddress */ /*CHAR alphId[MAX_ALPHA+1];*/ /* alpha identifier */ T_ACI_PB_TEXT alphIdUni; /* alpha identifier */ UBYTE rptInd; /* repeat indicator */ UBYTE sigInf; /* signal information */ UBYTE prio; /* priority of call */ UBYTE CLIRsup; /* CLIR suppression */ UBYTE mptyStat; /* multiparty status */ UBYTE iId; /* invoke id */ UBYTE srvStat; /* service status */ UBYTE srvType; /* type of service */ UBYTE SSver; /* supplementary service version */ UBYTE opCode; /* SS operation code */ UBYTE CUGidx; /* CUG index */ UBYTE CUGprf; /* preferential CUG */ UBYTE OAsup; /* OA suppress */ USHORT rslt; /* result */ USHORT nrmCs; /* normal cause */ USHORT rejCs; /* rejection cause */ UBYTE failType; /* type of SS failure */ UBYTE rejPrb; /* reject problem code */ UBYTE errCd; /* return error code */ UBYTE ssDiag; /* SS diagnostic (CQ 23619 - %DIAG) */ UBYTE SATinv; /* SAT invocation flag */ UBYTE CCBSstat; /* CCBS status */ UBYTE CDStat; /* CD status */ UBYTE curCmd; /* current command executing */ S8 curSrc; /* current command source */ BOOL dtmfCmd; /* AT_CMD_VTS or AT_CMD_NONE */ UBYTE dtmfMode; /* DTMF_MOD_AUTO/DTMF_MOD_MAN_START/DTMF_MOD_MAN_STOP */ T_OWN dtmfSrc; /* current command source for DTMF */ T_OWN calOwn; /* owner of call */ #ifdef SIM_TOOLKIT BOOL SatDiscEvent; /* flag for DISC event for SAT */ #endif UBYTE rdlCnt; /* redial counter */ UBYTE rdlTimIndex; /* redial timer index for 5th and more attempts */ USHORT curCs; /* current cause of rejected call intended for %CPI reports*/ UBYTE numRawCauseBytes; /* Number of cause bytes-for SAT evt Download CTS cases*/ UBYTE *rawCauseBytes; /* Pointer to cause value sent by network*/ } T_CC_CALL_TBL; typedef struct CCShrdParm { T_ACI_CMOD_MOD CMODmode; SHORT cIdFail; /* holds failed call identifier */ SHORT cIdMPTY; /* holds multiparty root call id */ SHORT nrOfMOC; /* number of current MOC's */ SHORT nrOfMTC; /* number of current MTC's */ UBYTE chMod; /* channel mode */ UBYTE chType; /* channel type */ USHORT syncCs; /* synchronisation cause */ BOOL TCHasg; /* TCH assignment flag */ #ifdef FAX_AND_DATA T_ACI_BS_SPEED CBSTspeed; /* parameters passed to CC by CC_CNFG_REQ: for MTC */ T_ACI_CBST_NAM CBSTname; /* parameters passed to CC by CC_CNFG_REQ: for MTC */ T_ACI_CBST_CE CBSTce; /* parameters passed to CC by CC_CNFG_REQ: for MTC */ #endif /* FAX_AND_DATA */ UBYTE snsMode; /* single numbering scheme mode */ UBYTE iIdNxt; /* next available invoke id */ UBYTE cmpType; /* component type */ UBYTE msgType; /* message type */ T_CC_CALL_TBL *ctb[MAX_CALL_NR];/* max. nr of calls pointers to call table */ USHORT ccCs[MAX_CALL_NR]; /* Last CC cause for qAT_PlusCEER() */ S8 callType[MAX_CALL_NR]; /* Call type T_CC_CALL_TYPE has to survive call end */ T_CC_DTMF_PRM dtmf; /* dtmf parameter */ T_ACI_LIST *facility_list; /* List with stored MNCC_FACILITY_IND */ UBYTE wapStat; /* Wap connection status */ UBYTE als_cmd; /* ALS command: set or query */ UBYTE aocRsmpPend; /* resumption of AOC pending */ BOOL BC0_send_flag; /* Flag the 1st bearer capability for data call */ BOOL BC1_send_flag; /* Flag the 2nd bearer capability for data call */ UBYTE datStat; /* data connection status */ #ifdef FF_TTY UBYTE ctmReq; /* TTY/CTM Service to be requested */ UBYTE ctmState; /* State of TTY/CTM Service */ UBYTE ttyCmd; /* Type of TTY: HCO, VCO, bidirectional */ UBYTE ctmOvwr; /* overwrite CTM request for next call */ #endif T_ACI_CVHU_MODE cvhu; /* Voice Hangup Control */ } T_CC_SHRD_PRM; /*==== PROTOTYPES =================================================*/ EXTERN SHORT psaCC_NewCall ( SHORT cId ); EXTERN void psaCC_AcceptCall ( SHORT cId ); EXTERN void psaCC_ClearCall ( SHORT cId ); EXTERN void psaCC_HoldCall ( SHORT cId ); EXTERN void psaCC_RetrieveCall ( SHORT cId ); EXTERN SHORT psaCC_ModifyCall ( SHORT cId ); EXTERN void psaCC_Config ( void ); EXTERN void psaCC_BuildMPTY ( SHORT cId ); EXTERN void psaCC_Hold_RetrieveMPTY ( SHORT cId, T_CC_CLST call_stat, T_CC_CLST call_stat_new, UBYTE cId_new, UBYTE opc); EXTERN void psaCC_SplitMPTY ( SHORT cId ); EXTERN int psaCC_CountMPTY ( void ); EXTERN SHORT psaCC_ECT ( SHORT cId ); EXTERN SHORT psaCC_SendDTMF ( SHORT cId, UBYTE digit, UBYTE mode ); EXTERN void psaCC_send_satevent( UBYTE event, SHORT callId , T_CC_INITIATER actionSrc, BOOL check_SatDiscEvent ); GLOBAL void psaCC_init_mtcbearer( void ); GLOBAL void psaCC_Init ( void ); EXTERN SHORT psaCC_ctbNewEntry ( void ); EXTERN SHORT psaCC_ctbFindTi ( UBYTE ti2Find ); EXTERN SHORT psaCC_ctbFindCall ( T_OWN calOwn, T_CC_CLST calStat, T_CC_CLTP calType ); EXTERN BOOL psaCC_ctbCallInUse ( void ); EXTERN BOOL psaCC_ctbAnyCallInUse ( void ); EXTERN SHORT psaCC_ctbDialNr2CldAdr ( SHORT cId, CHAR * pDialStr ); EXTERN CHAR* psaCC_ctbClrAdr2Num ( SHORT cId, CHAR * pNumBuf, UBYTE maxSize ); EXTERN CHAR* psaCC_ctbClrAdr2Sub ( SHORT cId, CHAR * pSubBuf ); EXTERN CHAR* psaCC_ctbCldAdr2Num ( SHORT cId, CHAR * pNumBuf, UBYTE maxSize ); EXTERN CHAR* psaCC_ctbCldAdr2Sub ( SHORT cId, CHAR * pSubBuf ); EXTERN CHAR* psaCC_ctbRdrAdr2Num ( SHORT cId, CHAR * pNumBuf, UBYTE maxSize ); EXTERN CHAR* psaCC_ctbRdrAdr2Sub ( SHORT cId, CHAR * pSubBuf ); EXTERN T_ACI_PB_TEXT* psaCC_ctbGetAlpha ( SHORT cId ); #ifdef TRACING /* EXTERN void psaCC_ctbDump ( void ); EXTERN void psaCC_ctbDumpBC ( void ); */ EXTERN void psaCC_shrPrmDump ( void ); #endif /* TRACING */ EXTERN void psaCC_chngCalTypCnt ( SHORT cId, SHORT dlt ); EXTERN void psaCC_chkPrgDesc ( SHORT cId, UBYTE prgDesc, UBYTE msgType ); EXTERN SHORT psaCC_getMOCTi ( SHORT cId ); EXTERN void psaCC_retMOCTi ( UBYTE ti ); EXTERN void psaCC_setSpeechMode ( void ); EXTERN BOOL psaCC_phbSrchNumPlnTxt ( CHAR * inNum, UBYTE * inoutMaxLen, T_ACI_PB_TEXT * outTxt ); EXTERN BOOL psaCC_phbMfwSrchNumPlnTxt ( CHAR * inNum, T_ACI_PB_TEXT * outTxt ); EXTERN void psaCC_phbSrchNum ( SHORT cId, T_CC_CLTP call_type ); EXTERN BOOL psaCC_phbSrchName ( T_ACI_CMD_SRC srcId, T_ACI_PB_TEXT *srchName, T_CLPTY_PRM *calPrm ); EXTERN UBYTE psaCC_phbSrchECC ( CHAR* dialStr, BOOL srchECC ); EXTERN BOOL psaCC_phbNtryFnd ( UBYTE phb, T_CLPTY_PRM* calPrm ); EXTERN void psaCC_phbAddNtry ( UBYTE phb, SHORT cId, UBYTE clTp, T_CLPTY_PRM *cldPty ); EXTERN void psaCC_asmBuildMPTY ( void ); EXTERN void psaCC_asmHoldMPTY ( void ); EXTERN void psaCC_asmRetrieveMPTY ( void ); EXTERN void psaCC_asmSplitMPTY ( void ); EXTERN void psaCC_asmECT ( void ); EXTERN void psaCC_asmCUGInfo ( SHORT cId ); EXTERN void psaCC_asmCDReq ( const CHAR *number, const T_ACI_TOA *type, const CHAR *subaddr, const T_ACI_TOS *satype); EXTERN void psaCC_asmComponent ( SHORT cId ); EXTERN void psaCC_asmCCBSReq ( SHORT cId ); EXTERN void psaCC_dasmInvokeCmp ( SHORT cId, T_inv_comp *invCmp ); EXTERN void psaCC_dasmResultCmp ( SHORT cId, T_res_comp *resCmp ); EXTERN void psaCC_dasmErrorCmp ( SHORT cId, T_err_comp *errCmp ); EXTERN void psaCC_dasmRejectCmp ( SHORT cId, T_rej_comp *rejCmp ); EXTERN void psaCC_ProcessCmp ( T_MNCC_FACILITY_IND *mncc_facility_ind ); EXTERN void psaCC_InitCtbNtry ( SHORT idx ); EXTERN void psaCC_FreeRdrPty ( SHORT idx ); EXTERN void psaCC_FreeCtbNtry ( SHORT idx ); EXTERN BOOL psaCC_ctbIsValid ( SHORT cId ); EXTERN T_CC_CALL_TBL * psaCC_ctb ( SHORT cId ); EXTERN void psaCC_DumpFIE ( T_MNCC_fac_inf *fie ); EXTERN void psaCC_DTMFSent ( SHORT cId ); EXTERN void psaCC_StopDTMF ( SHORT cId ); EXTERN SHORT psaCC_BCapCode ( UBYTE reqId, SHORT cId ); EXTERN SHORT psaCC_BCapDecode ( UBYTE reqId, UINT16 bcLen1, UBYTE *bc1, UINT16 bcLen2, UBYTE *bc2); EXTERN SHORT psaCC_MPTY ( SHORT cId, UBYTE mpty_event ); EXTERN void psaCC_DTMFTimeout ( void ); /*==== EXPORT =====================================================*/ #ifdef PSA_CCF_C GLOBAL T_CC_SHRD_PRM ccShrdPrm; #else EXTERN T_CC_SHRD_PRM ccShrdPrm; #endif /* PSA_CCF_C */ #endif /* PSA_CC_H */ /*==== EOF =======================================================*/