view src/g23m-gsm/rr/rr_gprs.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 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 :  Declarations for the Protocol Stack Entity
|             Radio Resource / GPRS-enhancements
+-----------------------------------------------------------------------------
*/

#ifndef RR_GPRS_H
#define RR_GPRS_H

#define EXT_MEAS_START_CR  0x40

/* intermediate storage for data of paging indication */
typedef struct
{
  UBYTE id_type;
  UBYTE chan_need;
} T_PAGING_DATA;

typedef enum
{
  START_PROC_ACTIVATE_REQ,
  START_PROC_ENTER_LIMITED,
  START_PROC_NORMAL_CR,
  START_PROC_NORMAL_CS,
  START_PROC_CFG_CHG,
  START_PROC_GPRS_ACT,
  START_PROC_NOTHING
} T_START_PROC;

typedef struct
{
  UBYTE                 rr_sdu[24];
  UBYTE                 si13_sdu[24];
  UBYTE                 tma_in_progress;
  ULONG                 fn;
  UBYTE                 req_ref_idx;
  UBYTE                 gprs_indic;        /* flag MM wants GPRS or not         */
  UBYTE                 si13_received;     /* SI13 has been received            */
  ULONG                 ptmsi;             /* used PTMSI                        */
  ULONG                 ptmsi2;            /* used candidate PTMSI                        */
  ULONG                 tlli;              /* used tlli                         */
  T_p_chan_req_des      p_chan_req_des;    /* Requested channel characteristics */
  T_gprs_meas_results   gprs_meas_results; /* GPRS Measurement Results          */
  UBYTE                 mac_req;           /*                                   */
  T_PAGING_DATA         pag_dat;
  UBYTE                 cs_req;            /*                                   */
  UBYTE                 gprs_suspend;
  UBYTE                 gprs_resump;
  UBYTE                 rac;
  UBYTE                 page_mode;
  USHORT                split_pg;          /* split paging cycle                */
  UBYTE                 use_c31;
  UBYTE                 cr_pbcch_active;
  UBYTE                 cr_type;
  UBYTE                 cr_orig;
  T_START_PROC          start_proc;
  UBYTE                 reconn_cause;      /* cause sent with RRGRR_RECONNECT_REQ during PDCH Assignment procedure */
  UBYTE                 tbf_est;           /* indicate TBF establishment during PDCH Assignment / Cell Change Order */
  T_DL_DATA_IND        *dl_data_ind;       /* store DL primitive containing d_change_order until access to new cell */
  UBYTE                 bsic;          /* BSIC of the new cell during Cell Change Order and CR*/
  USHORT                arfcn;         /* ARFCN of the new cell during Cell Change Order and CR */
  BOOL                  cco_need_reconnect_cnf; /* Flag indicating the need to send RRGRR-RECONNECT-CNF */
  T_rai                 current_rai;       /* last rai assigned by the network to GMM */
  T_add_freq_list       add_freq_lists[RRGRR_BA_LIST_SIZE];  
  UBYTE                 num_add_freq_list;
  T_RRGRR_EXT_MEAS_REQ *rrgrr_ext_meas_req;     /* save the request for GPRS Ext Measurement */
  T_RRGRR_EXT_MEAS_CNF *rrgrr_ext_meas_cnf;     /* compiled result of the GPRS Ext Measurement */
  T_MPH_EXT_MEAS_CNF   *mph_ext_meas_cnf;       /* power measurement result during GPRS Ext Measurement */
  UBYTE                 mph_ext_meas_num;       /* number of carriers used in mph_ext_meas_cnf */
  UBYTE                 ext_meas_ctrl;          /* indicate a pending Ext Meas stop request  */
  BOOL                  is_nc2_used_in_si13;    /* NC state of SI13: NC2 or !NC2 */
  UBYTE                 nc_mode_of_pmo;         /* NC mode of Packet Measurement Order */
  BOOL                  cr_pcco_active;         /* PCCO in BCCH environment, cell not synced */
  BOOL                  ready_state;            /* TRUE  - we are in READY   STATE 
                                                 * FALSE - we are in STANDBY STATE 
                                                 * This is actually a GMM state, but has to 
                                                 * stored here for the NC2 handling and for
                                                 * calculating the C2/C32 values 
                                                 */

#ifdef REL99
  BOOL                  cbch_psi_valid;         /* CBCH info on PSI8 received from GRR */
  T_cbch                cbch_psi8;              /* This field is in GPRS data as this cbch info
                                                 * on PSI 8 could be present only when PBCCH
                                                 * is enabled. 
                                                 */
  BOOL                  cbch_info_rxvd_in_ptm;  /* This flag is set to indicate that CBCH information was received in
                                                 * packet transfer mode. MPH_CBCH_COFIG_REQ should be sent to ALR 
                                                 * only in idle mode. When transitioning again to idle mode
                                                 * if this flag is set, then CBCH info is given to ALR.
                                                 * During packet transfer mode, CBCH info could be received
                                                 * in SI4 or PSI8 or may need updateion because of dependent 
                                                 * parameters change in in PSI2 or other SI messages received in PTM.
                                                 */
  UBYTE                 nw_release;
#endif
  UBYTE                 ba_bcch_modified; /*This flag will be set only when BA(BCCH) is modified by PMO or PCCO*/
} T_GPRS_DATA;

#ifdef OPTION_MULTITHREAD
  #define hCommGRR        _ENTITY_PREFIXED(hCommGRR)
#endif

EXTERN T_HANDLE  hCommGRR;         /* GRR  Communication        */

/*
 * GPRS functions
 */
void  gprs_init_gprs_data                  (void);
void  gprs_get_table_n                     (const T_FUNC**                table,
                                            USHORT*                       n);

/* GPRS support functions for process DATA */
BOOL  dat_check_gprs_imm_ass               (T_MPH_UNITDATA_IND*           unitdata,
                                            T_D_IMM_ASSIGN*               imm_assign,
                                            UBYTE                         index);
void  dat_check_imm_ass_ext                (T_MPH_UNITDATA_IND*           unitdata,
                                            UBYTE                         index);
UBYTE dat_check_imm_assign_pch             (T_MPH_UNITDATA_IND*           unitdata,
                                            T_D_IMM_ASSIGN*               imm_assign);
UBYTE dat_check_imm_ass_rej                (UBYTE                         wait_ind);
UBYTE dat_check_packet_paging_ind          (T_MPH_PAGING_IND*             pag_ind);
void  dat_rrgrr_channel_req                (T_RRGRR_CHANNEL_REQ*          chan_req);

void  att_check_bsic                       (T_RRGRR_NCELL_SYNC_REQ*       check_bsic);
BOOL  dat_gprs_start_sabm                  (void);
void  dat_rrgrr_suspend_dcch_req           (T_RRGRR_SUSPEND_DCCH_REQ*     suspend_dcch_req);
void  dat_rrgrr_suspend_dcch_cnf           (void);
void  dat_rrgrr_reconnect_dcch_req         (T_RRGRR_RECONNECT_DCCH_REQ*   reconnect_dcch_req);
void  dat_rrgrr_reconnect_dcch_cnf         (UBYTE                         reconn_state);
void  dat_rrgrr_resumed_tbf_req            (T_RRGRR_RESUMED_TBF_REQ*      resumed_tbf_req);
void  dat_rrgrr_resumed_tbf_cnf            (void);
void  dat_rrgrr_data_ind                   (T_DL_DATA_IND*                dl_data_ind);
void  dat_rrgrr_change_order               (T_DL_DATA_IND*                dl_data_ind,
                                            T_D_CHANGE_ORDER*             d_change_order);
void  dat_ask_paging_ind                   (T_MPH_PAGING_IND*             pag_ind);
void  dat_ask_paging_ind_pa_only           (T_MPH_PAGING_IND*             pag_ind);
void  dat_stop_dcch_ind                    (UBYTE                         stop_cause);
void  dat_rrgrr_data_req                   (T_RRGRR_DATA_REQ*             data_req);
void  dat_rrgrr_gprs_data_req              (T_RRGRR_GPRS_DATA_REQ*        data_req);
BOOL  dat_check_packet_access              (void);
void  dat_rrgrr_rr_est_req                 (T_RRGRR_RR_EST_REQ*           est_req);
void  dat_rrgrr_rr_est_rsp                 (T_RRGRR_RR_EST_RSP*           rr_est_rsp);
void  dat_rrgrr_activate_req               (T_RRGRR_ACTIVATE_REQ*         act_req);
void  dat_set_gprs_resump                  (T_RR_RELEASE_IND*             rr_release_ind);
void  dat_gprs_suspend_req                 (void);
void  dat_gprs_set_suspended               (void);
#ifdef REL99
BOOL  dat_gprs_cell_in_ptm                 (void);
#endif


/* GPRS support functions for process ATTACHEMENT */
void  att_signal_gprs_support              (void);
void  att_for_sysinfo_type13               (T_MPH_UNITDATA_IND*          data_ind,
                                            T_D_SYS_INFO_13*             sys_info_13);
void  att_set_gprs_indication              (UBYTE                        gprs_indic);
void  att_add_ptmsi                        (T_MPH_IDENTITY_REQ*          mph_identity_req);
void  att_rrgrr_cr_ind                     (UBYTE                        type);
void  att_rrgrr_cr_req                     (T_RRGRR_CR_REQ*              cr_req);
void  att_rrgrr_stop_mon_ccch_req          (T_RRGRR_STOP_MON_CCCH_REQ*   stop_ccch);
void  att_check_gprs_supp                  (UBYTE                        v_gprs_ind,
                                            T_gprs_indic*                data);
void  att_rrgrr_start_mon_ccch_req         (T_RRGRR_START_MON_CCCH_REQ*  start_ccch);
void  att_rrgrr_start_mon_bcch_req         (T_RRGRR_START_MON_BCCH_REQ*  start_bcch);
BOOL  att_check_sync_results               (T_MPH_MEASUREMENT_IND*       mph_measurement_ind);
BOOL  att_gprs_is_avail                    (void);
BOOL  att_gprs_cell_has_pbcch              (void);
void  att_gprs_stop_pl                     (void);
void  att_rrgrr_update_ba_req              (T_RRGRR_UPDATE_BA_REQ*       ba_req);
void  att_gprs_cr_rsp                      (T_RRGRR_CR_RSP*              cr_rsp);
void  att_rrgrr_ext_meas_req               (T_RRGRR_EXT_MEAS_REQ*        ext_meas_req);
UBYTE rr_ext_meas_idx                      (USHORT                       arfcn);
void  att_rrgrr_ext_meas_stop_req          (T_RRGRR_EXT_MEAS_STOP_REQ*   ext_meas_stop_req);
void  att_rrgrr_meas_rep_req               (T_RRGRR_MEAS_REP_REQ*        s);
void  att_gprs_idle_req                    (T_MPH_IDLE_REQ*              idle_req);
BOOL  att_gprs_check_ncell                 (void);
void  att_start_cell_reselection_pbcch     (UBYTE mode);
void  att_cell_reselection_gprs_failed     (void);
/*XXX*/
void  gprs_rrgrr_stop_task                 (T_RRGRR_STOP_TASK_REQ*       stop_task);

void  gprs_rrgrr_fill_from_stored_sdu      (T_sdu*                       to,
                                            UBYTE*                       from);
void  gprs_rrgrr_store_sdu                 (UBYTE*                       to,
                                            T_sdu*                       from);
void  att_gprs_start_task                  (T_RRGRR_START_TASK_REQ*      start_task);
void  att_start_cell_selection_gprs        (UBYTE                        originator,U8 search_mode);
void  att_start_cell_reselection_gprs      (UBYTE                        mode);
void  gprs_init_data_cr                    (void);
void  att_convert_idle_c31_cr              (UBYTE                        index);
void  att_insert_c31_cr_data_in_cell       (UBYTE                        index);
BOOL  att_check_cell_c31                   (void);
void  att_check_c31_reselect_decision      (UBYTE                        start_now);
BOOL  att_check_c31_criterion              (UBYTE                        index);
UBYTE att_get_next_best_c32_index          (BOOL                         c31_calculated);
void  att_calculate_c31_c32                (UBYTE                        index);
void  att_rrgrr_standby_ind                (T_RRGRR_STANDBY_STATE_IND*   stdby);
void  att_rrgrr_ready_ind                  (T_RRGRR_READY_STATE_IND*     rdy);
#ifdef REL99
void  att_rrgrr_cbch_info_ind              (T_RRGRR_CBCH_INFO_IND*       cbch_info);
#endif
void att_gprs_sync_req( T_RRGRR_SYNC_REQ   *sync_req);
BOOL  is_nc2_used                          (void);
#ifdef REL99
UBYTE att_gprs_get_nw_release              (void);
#endif

/*
 * States of the GPRS Process
 * PIM   - Packet Idle Mode
 * PTM   - Packet Transfer Mode
 * PAM   - Packet Access Mode
 */
#define GPRS_NULL                  0 /* GPRS is not activated by MM */
#define GPRS_ACTIVATED             1 /* GPRS is activated by MM
                                      * and we are not on a cell */
#define GPRS_PIM_BCCH              2 /* RR has camped on a GPRS cell which has no PBCCH
                                      * RR is in idle mode
                                      */
#define GPRS_PAM_BCCH              3 /* GRR has requested the establishment of a TBF over CCCH */
#define GPRS_PTM_BCCH              4 /* GRR has established the TBF and transfer data */
#define GPRS_DEDI_SDCCH            5 /* GRR has requested a TBF but was assigned a SDCCH for further
                                      * signalling */
#define GPRS_PIM_PBCCH             6 /* GRR has camped on a GPRS cell which has a PBCCH
                                      * RR and GRR are in idle mode */
#define GPRS_PAM_PBCCH             7 /* GRR is establishing a TBF */
#define GPRS_PTM_PBCCH             8 /* GRR has established a TBF and transfers data */
#define GPRS_SUSPENDED_BCCH        9 /* RR is in or on its way to dedicated mode and was in a GPRS_*_BCCH state */
#define GPRS_SUSPENDED_PBCCH      10 /* RR is in or on its way to dedicated mode and was in a GPRS_*_PBCCH state */

EXTERN  const char * const
        STATE_GPRS_NAME[];
#define STATE_GPRS_NAME_INIT \
       "GPRS_NULL",          \
       "GPRS_ACTIVATED",     \
       "GPRS_PIM_BCCH",      \
       "GPRS_PAM_BCCH",      \
       "GPRS_PTM_BCCH",      \
       "GPRS_DEDI_SDCCH",    \
       "GPRS_PIM_PBCCH",     \
       "GPRS_PAM_PBCCH",     \
       "GPRS_PTM_PBCCH",     \
       "GPRS_SUSPENDED_BCCH",\
       "GPRS_SUSPENDED_PBCCH"


#define ESTCS_GPRS_1P     0x0478
#define ESTCS_GPRS_SB     0x0470
#define ESTCS_GPRS_PAGING 0x0481

#define TBF_EST_NONE      0
#define TBF_EST_PDCH      1
#define TBF_EST_CCO       2

#ifdef REL99
#define RR_GPRS_R97       0
#define RR_GPRS_R99       1
#define RR_GPRS_R4        2
#endif

#endif /* !RR_GPRS_H */