FreeCalypso > hg > fc-magnetite
view src/g23m-gprs/grr/grr_gfpf.c @ 662:8cd8fd15a095
SIM speed enhancement re-enabled and made configurable
TI's original code supported SIM speed enhancement, but Openmoko had it
disabled, and OM's disabling of speed enhancement somehow caused certain
SIM cards to start working which didn't work before (OM's bug #666).
Because our FC community is much smaller in year 2020 than OM's community
was in their day, we are not able to find one of those #666-affected SIMs,
thus the real issue they had encountered remains elusive. Thus our
solution is to re-enable SIM speed enhancement and simply wait for if
and when someone runs into a #666-affected SIM once again. We provide
a SIM_allow_speed_enhancement global variable that allows SIM speed
enhancement to be enabled or disabled per session, and an /etc/SIM_spenh
file in FFS that allows it to enabled or disabled on a non-volatile
basis. SIM speed enhancement is now enabled by default.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 24 May 2020 05:02:28 +0000 |
parents | 219afcfc6250 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GPRS (8441) | Modul : GRR +----------------------------------------------------------------------------- | 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 : This module implements local functions for service GFP of | entity GRR. +----------------------------------------------------------------------------- */ #ifndef GRR_GFPF_C #define GRR_GFPF_C #endif #define ENTITY_GRR /*==== INCLUDES =============================================================*/ #include "typedefs.h" /* to get Condat data types */ #include "vsi.h" /* to get a lot of macros */ #include "macdef.h" #include "gprs.h" #include "gsm.h" /* to get a lot of macros */ #include "ccdapi.h" /* to get CCD API */ #include "prim.h" /* to get the definitions of used SAP and directions */ #include "message.h" #include "grr.h" /* to get the global entity definitions */ #include "grr_f.h" /* to get the global entity procedure definitions */ #include "grr_pgs.h" #include "grr_psis.h" #include "grr_css.h" #include "grr_meass.h" #include "grr_tcs.h" #include "grr_ctrls.h" #include <stdio.h> #include "cl_rlcmac.h" /*==== CONST ================================================================*/ /*==== DIAGNOSTICS ==========================================================*/ /*==== LOCAL VARS ===========================================================*/ /*==== PRIVATE FUNCTIONS ====================================================*/ /*==== PUBLIC FUNCTIONS =====================================================*/ /* +------------------------------------------------------------------------------ | Function : gfp_init +------------------------------------------------------------------------------ | Description : The function gfp_init() initialize all service relevant | variables. | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void gfp_init ( void ) { TRACE_FUNCTION( "gfp_init" ); INIT_STATE(GFP,GFP_IDLE); } /* gfp_init() */ /* +------------------------------------------------------------------------------ | Function : gfp_prcs_ctrl_msg +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL BOOL gfp_prcs_ctrl_msg ( UBYTE* l2_frame, UBYTE l2_channel, UBYTE relative_position, ULONG frame_number ) { T_MSGBUF * message_complete; UBYTE message_type; T_D_HEADER temp_header; BOOL ms_paging_group; BOOL address; BOOL result = FALSE; #ifdef REL99 T_TIME time_to_poll=0; #endif TRACE_FUNCTION( "gfp_prcs_ctrl_msg" ); grr_decode_rlcmac( l2_frame, &temp_header ); #ifdef _SIMULATION_ TRACE_EVENT_P1( "Control message at FN = %ld", frame_number ); #endif /* #ifdef _SIMULATION_ */ if( temp_header.payload EQ CTRL_BLK_NO_OPT OR temp_header.payload EQ CTRL_BLK_OPT ) { ULONG tc_user = TC_USER4; UBYTE trace_msg_type = D_MSG_TYPE_2ND_SEGMENT_c; if( temp_header.payload EQ CTRL_BLK_NO_OPT OR temp_header.d_ctrl.rbsn EQ 0 ) { trace_msg_type = temp_header.d_ctrl.msg_type; } if( trace_msg_type EQ D_DL_DUMMY_c ) { tc_user = TC_USER5; } TRACE_BINDUMP( hCommGRR, tc_user, cl_rlcmac_get_msg_name( trace_msg_type, RLC_MAC_ROUTE_DL ), l2_frame, MAX_L2_FRAME_SIZE ); /*lint !e569*/ message_complete = grr_handle_rlcmac_header( PACKET_MODE_PIM, &temp_header, frame_number ); if( message_complete NEQ NULL ) { message_type = grr_decode_grr( message_complete ); ms_paging_group = ( l2_channel EQ L2_PCHANNEL_PPCH ); /* * check address */ switch( message_type ) { case D_ACCESS_REJ_c: /* Packet Access Reject */ case D_CELL_CHAN_ORDER_c: /* Packet Cell Change Order */ case D_DL_ASSIGN_c: /* Packet Downlink Assignment */ case D_MEAS_ORDER_c: /* Packet Measurement Order */ case D_PAGING_REQ_c: /* Packet Paging Request */ case D_POLLING_REQ_c: /* Packet Polling Request */ case D_PRACH_PAR_c: /* Packet PRACH Parameters */ case D_QUEUING_NOT_c: /* Packet Queuing Notification */ case D_UL_ASSIGN_c: /* Packet Uplink Assignment */ case D_DL_DUMMY_c: /* Packet Downlink Dummy Control Block */ case PSI_1_c: /* Packet System Information Type 1 */ case PSI_2_c: /* Packet System Information Type 2 */ case PSI_3_c: /* Packet System Information Type 3 */ case PSI_3_BIS_c: /* Packet System Information Type 3 bis */ #if defined (REL99) AND defined (TI_PS_FF_EMR) case PSI_3_TER_c: /* Packet System Information Type 3 ter */ #endif case PSI_4_c: /* Packet System Information Type 4 */ case PSI_5_c: /* Packet System Information Type 5 */ #ifdef REL99 case PSI_8_c: /* Packet System Information Type 8 */ #endif address = grr_check_address( message_type,0xFF ); { /* the MS shall take into account the page mode info in any message on PCCCH */ MCAST( d_dl_assign, D_DL_ASSIGN ); sig_gfp_pg_mode( d_dl_assign->page_mode, ms_paging_group ); } break; default: case D_PDCH_RELEASE_c: case D_CTRL_PWR_TA_c: case D_TS_RECONFIG_c: case D_TBF_RELEASE_c: case D_UL_ACK_c: case PSI_13_c: address = FALSE; TRACE_EVENT( "gfp_prcs_ctrl_msg: unexpected control message type" ); break; } if( !address ) { return( result ); } /* 0460 - Section 10.4.5 * MS shall ignore the RRBP field if received as part of * packet access reject (or) packet queue notification (or) packet paging request meassages * Avoid sending Poll response */ if ( message_type NEQ D_ACCESS_REJ_c AND message_type NEQ D_QUEUING_NOT_c AND message_type NEQ D_PAGING_REQ_c ) { /* * save poll position */ if( temp_header.d_ctrl.sp ) { MCAST( d_poll_req, D_POLLING_REQ); if( message_type EQ D_POLLING_REQ_c ) { if( d_poll_req->ctrl_ack_type EQ 0 ) { sig_gfp_tc_poll_ind(frame_number,temp_header.d_ctrl.rrbp,CGRLC_POLL_RES_AB,temp_header.pctrl_ack); } else { sig_gfp_tc_poll_ind(frame_number,temp_header.d_ctrl.rrbp,CGRLC_POLL_RES_NB,temp_header.pctrl_ack); } } else if(psc_db->gprs_cell_opt.ctrl_ack_type) { sig_gfp_tc_poll_ind(frame_number,temp_header.d_ctrl.rrbp,CGRLC_POLL_RES_NB,temp_header.pctrl_ack); } else { sig_gfp_tc_poll_ind(frame_number,temp_header.d_ctrl.rrbp,CGRLC_POLL_RES_AB,temp_header.pctrl_ack); } #ifdef REL99 time_to_poll = grr_get_time_to_send_poll(temp_header.d_ctrl.rrbp); #endif } } /* if( message_type EQ ... ) { ULONG trace[5]; trace[0] = l2_frame[0] << 24; trace[0] |= l2_frame[1] << 16; trace[0] |= l2_frame[2] << 8; trace[0] |= l2_frame[3] << 0; trace[1] = l2_frame[4] << 24; trace[1] |= l2_frame[5] << 16; trace[1] |= l2_frame[6] << 8; trace[1] |= l2_frame[7] << 0; trace[2] = l2_frame[8] << 24; trace[2] |= l2_frame[9] << 16; trace[2] |= l2_frame[10] << 8; trace[2] |= l2_frame[11] << 0; trace[3] = l2_frame[12] << 24; trace[3] |= l2_frame[13] << 16; trace[3] |= l2_frame[14] << 8; trace[3] |= l2_frame[15] << 0; trace[4] = l2_frame[16] << 24; trace[4] |= l2_frame[17] << 16; trace[4] |= l2_frame[18] << 8; trace[4] |= l2_frame[19] << 0; TRACE_EVENT_P8( "RLC_CTRL: %08X%08X%08X%08X%08X%02X%02X%02X", trace[0], trace[1], trace[2], trace[3], trace[4], l2_frame[20], l2_frame[21], l2_frame[22] ); } */ switch( message_type ) { case D_ACCESS_REJ_c: /* Packet Access Reject */ { sig_gfp_tc_access_rej( ); } break; case D_QUEUING_NOT_c: /* Packet Queuing Notification */ { sig_gfp_tc_queuing_not( ); } break; case D_UL_ASSIGN_c: /* Packet Uplink Assignment */ { MCAST( d_ul_assign, D_UL_ASSIGN ); if( d_ul_assign->v_pers_lev ) { sig_gfp_psi_save_persistence_level( &d_ul_assign->pers_lev ); } sig_gfp_tc_ul_assign( ); result = TRUE; } break; case D_DL_ASSIGN_c: /* Packet Downlink Assignment */ { MCAST( d_dl_assign, D_DL_ASSIGN ); if( d_dl_assign->v_pers_lev ) { sig_gfp_psi_save_persistence_level( &d_dl_assign->pers_lev ); } sig_gfp_tc_dl_assign( ); result = TRUE; } break; case D_PAGING_REQ_c: /* Packet Paging Request */ { MCAST( d_paging_req, D_PAGING_REQ ); if( d_paging_req->v_pers_lev ) { sig_gfp_psi_save_persistence_level( &d_paging_req->pers_lev ); } sig_gfp_pg_req( ); } break; case PSI_1_c: /* Packet System Information Type 1 */ { sig_gfp_psi_1( ); } break; case PSI_2_c: /* Packet System Information Type 2 */ { sig_gfp_psi_2( relative_position ); } break; case PSI_3_c: /* Packet System Information Type 3 */ { sig_gfp_psi_3( relative_position ); } break; case PSI_3_BIS_c: /* Packet System Information Type 3 bis */ { sig_gfp_psi_3_bis( relative_position ); } break; #if defined (REL99) AND defined (TI_PS_FF_EMR) case PSI_3_TER_c: /* Packet System Information Type 3 ter */ { sig_gfp_psi_3_ter( relative_position ); } break; #endif case PSI_4_c: /* Packet System Information Type 4 */ { sig_gfp_psi_4( relative_position ); } break; case PSI_5_c: /* Packet System Information Type 5 */ { sig_gfp_psi_5( relative_position ); } break; #ifdef REL99 case PSI_8_c: /* Packet System Information Type 8 */ { sig_gfp_psi_8( relative_position ); } break; #endif case D_CELL_CHAN_ORDER_c: /* Packet Cell Change Order */ { #ifdef REL99 sig_gfp_ctrl_cc_order(time_to_poll); #else sig_gfp_ctrl_cc_order( ); #endif } break; case D_DL_DUMMY_c: /* Packet Downlink Dummy Control Block */ { MCAST( d_dl_dummy, D_DL_DUMMY ); if( d_dl_dummy->v_pers_lev ) { sig_gfp_psi_save_persistence_level( &d_dl_dummy->pers_lev ); } /* * This message is not send to any other service. */ } break; case D_MEAS_ORDER_c: /* Packet Measurement Order */ { sig_gfp_meas_order( ); } break; case D_POLLING_REQ_c: /* Packet Polling Request */ { /* * No signal to GRR, polling is handled with grr_poll_pos_ind */ } break; case D_PRACH_PAR_c: /* Packet PRACH Parameters */ { sig_gfp_psi_prach( ); } break; default: TRACE_ERROR( "gfp_prcs_ctrl_msg: unexpected control message type" ); break; } /* switch( message_type ) */ if( grr_data->pwr_ctrl_valid_flags.v_pwr_ctrl_param OR grr_data->pwr_ctrl_valid_flags.v_glbl_pwr_ctrl_param OR grr_data->pwr_ctrl_valid_flags.v_freq_param ) { grr_cgrlc_pwr_ctrl_req( FALSE ); } } /* if( message_complete NEQ NULL ) */ else { TRACE_EVENT_P1( "Incomplete control message at FN = %ld", frame_number ); } }/* if( temp_header.payload EQ CTRL_BLK_NO_OPT OR temp_header.payload EQ CTRL_BLK_OPT ) */ else { TRACE_ERROR( "gfp_prcs_ctrl_msg: unexpected paylaod type" ); TRACE_BINDUMP( hCommGRR, TC_USER4, cl_rlcmac_get_msg_name( D_MSG_TYPE_UNKNOWN_c, RLC_MAC_ROUTE_DL ), l2_frame, MAX_L2_FRAME_SIZE ); /*lint !e569*/ } return( result ); } /* gfp_prcs_ctrl_msg() */ /* +------------------------------------------------------------------------------ | Function : gfp_check_tfi +------------------------------------------------------------------------------ | Description : The function gfp_check_tfi() .... | | Parameters : ptr_header_i - header parameter | tn - timeslot | +------------------------------------------------------------------------------- */ GLOBAL BOOL gfp_check_tfi ( T_D_HEADER * ptr_header_i , UBYTE tn) { BOOL result; TRACE_FUNCTION( "gfp_check_tfi" ); grr_data->gfp.tfi_check_needed = TRUE; if(( ptr_header_i->payload EQ CTRL_BLK_NO_OPT) OR ((ptr_header_i->payload EQ CTRL_BLK_OPT) AND !(ptr_header_i->d_ctrl.ac))) { result = TRUE; } else if((ptr_header_i->payload EQ CTRL_BLK_OPT) AND ptr_header_i->d_ctrl.ac AND ptr_header_i->d_ctrl.d AND (ptr_header_i->d_ctrl.tfi EQ grr_data->downlink_tbf.tfi) AND ((0x80>>tn) & grr_data->downlink_tbf.ts_mask)) { grr_data->gfp.tfi_check_needed = FALSE; /*tfi correct ignore tfi in air message*/ result = TRUE; } else if((ptr_header_i->payload EQ CTRL_BLK_OPT) AND ptr_header_i->d_ctrl.ac AND !(ptr_header_i->d_ctrl.d) AND (ptr_header_i->d_ctrl.tfi EQ grr_data->uplink_tbf.tfi) AND ((0x80>>tn) & grr_data->uplink_tbf.ts_mask)) { grr_data->gfp.tfi_check_needed = FALSE; /*tfi correct ignore tfi in air message*/ result = TRUE; } else if(ptr_header_i->payload EQ 3) { result = TRUE; } else { result = FALSE; TRACE_EVENT_P7("wrong tfi in ctrl block pt=%d ac=%d d=%d tfi=%d dl_tfi=%d ul_tfi=%d msg_type=0x%x", ptr_header_i->payload, ptr_header_i->d_ctrl.ac, ptr_header_i->d_ctrl.d, ptr_header_i->d_ctrl.tfi, grr_data->downlink_tbf.tfi, grr_data->uplink_tbf.tfi, ptr_header_i->ptr_block[0]>>2); } return result; } /* gfp_check_tfi() */ /* +------------------------------------------------------------------------------ | Function : gfp_send_ctrl_block +------------------------------------------------------------------------------ | Description : The function gfp_send_ctrl_block() .... | | Parameters : dummy - description of parameter dummy | +------------------------------------------------------------------------------ X */ GLOBAL void gfp_send_ctrl_block (ULONG fn_i, UBYTE tn_i, UBYTE rrbp_i, UBYTE sp_i,UBYTE pctrl_ack_i , T_MSGBUF * ptr_ctrl_block_i ) { MCAST(d_dl_assign,D_DL_ASSIGN); MCAST(d_poll_req,D_POLLING_REQ); UBYTE msg_type; BOOL address; #ifdef REL99 T_TIME time_to_poll=0; #endif TRACE_FUNCTION( "gfp_send_ctrl_block" ); msg_type = ptr_ctrl_block_i->buf[0] >> 2; switch(msg_type) { #ifdef _TARGET_ case PSI_1_c : /* Packet System Information Type 1 */ /*TRACE_EVENT("PSI 1");*/ break; case PSI_2_c : /* Packet System Information Type 2 */ /*TRACE_EVENT("PSI 2");*/ break; case PSI_3_c : /* Packet System Information Type 3 */ /*TRACE_EVENT("PSI 3");*/ break; case PSI_3_BIS_c : /* Packet System Information Type 3 bis */ /*TRACE_EVENT("PSI 3bis");*/ break; #if defined (REL99) AND defined (TI_PS_FF_EMR) case PSI_3_TER_c : /*TRACE_EVENT("PSI 3ter");*/ #endif case PSI_4_c : /* Packet System Information Type 4 */ /*TRACE_EVENT("PSI 4");*/ break; #ifdef REL99 case PSI_8_c : /* Packet System Information Type 8 */ /*TRACE_EVENT("PSI 8");*/ break; #endif #endif /*_TARGET_ */ /* * the PSI5 should not be decoded on TARGET and in SIMULATION */ case PSI_5_c : /* Packet System Information Type 5 */ /*TRACE_EVENT("PSI 5");*/ break; /* * the PSI13 should be decoded on TARGET and in SIMULATION * * case PSI_13_c : * Packet System Information Type 13 * * TRACE_EVENT("PSI 13"); * break; */ default: msg_type = grr_decode_grr(ptr_ctrl_block_i); if(grr_data->gfp.tfi_check_needed) { /* check address within air message */ address = grr_check_address(msg_type,tn_i); } else { /* ignore address within airmessage, block was addressed with correct tfi in optional header*/ address = TRUE; } /* * save persistence level, even if address is wrong */ switch (msg_type ) { case D_DL_ASSIGN_c : case D_PAGING_REQ_c: case D_DL_DUMMY_c : if(d_dl_assign->v_pers_lev) { sig_gfp_psi_save_persistence_level( &(d_dl_assign->pers_lev) ); } break; } if (address AND grr_data->uplink_tbf.ti AND (grr_data->tbf_type EQ CGRLC_TBF_MODE_UL)) { /*4.60, 7.1.2.3a RLC/MAC procedures during contention resolution - the mobile station shall not accept a PACKET MEASUREMENT ORDER message, a PACKET CELL CHANGE ORDER message and a PACKET POWER CONTROL/TIMING ADVANCE message addressing the mobile station with the TFI value associated with the uplink TBF ; */ switch (msg_type) { case D_CTRL_PWR_TA_c : { MCAST(d_ctrl_pwr_ta,D_CTRL_PWR_TA); if (!grr_data->gfp.tfi_check_needed OR d_ctrl_pwr_ta->add4.v_glob_tfi) { TRACE_EVENT("CTRL_PWR_TA ignored - received during contention"); address = FALSE; } } break; case D_MEAS_ORDER_c : { MCAST(d_meas_order,D_MEAS_ORDER); if (!grr_data->gfp.tfi_check_needed OR d_meas_order->add1.v_glob_tfi) { TRACE_EVENT("MEAS_ORDER ignored - received during contention"); address = FALSE; } } break; case D_CELL_CHAN_ORDER_c : { MCAST(d_cell_chan_order,D_CELL_CHAN_ORDER); if (!grr_data->gfp.tfi_check_needed OR d_cell_chan_order->add1.v_glob_tfi) { TRACE_EVENT("CELL_CHAN_ORDER ignored - received during contention"); address = FALSE; } } break; default : break; } } if(address) { /* * handle poll position */ /* 0460 - Section 10.4.5 * MS shall ignore the RRBP field if received as part of * packet access reject (or) packet queue notification (or) packet paging request meassages * Avoid sending Poll response */ if( sp_i AND (msg_type NEQ D_UL_ACK_c) AND /* packet uplink ack/nack will be handled in grlc*/ (msg_type NEQ D_ACCESS_REJ_c) AND (msg_type NEQ D_PAGING_REQ_c ) ) { PALLOC(cgrlc_poll_req,CGRLC_POLL_REQ); cgrlc_poll_req->poll_fn = grr_calc_new_poll_pos(fn_i, rrbp_i); cgrlc_poll_req->tn = tn_i; cgrlc_poll_req->ctrl_ack = pctrl_ack_i; if ((msg_type EQ D_POLLING_REQ_c) AND (d_poll_req->ctrl_ack_type)) { cgrlc_poll_req->poll_b_type = CGRLC_POLL_RES_NB; } else if (msg_type EQ D_POLLING_REQ_c AND (d_poll_req->ctrl_ack_type EQ 0)) { cgrlc_poll_req->poll_b_type = CGRLC_POLL_RES_AB; } else { cgrlc_poll_req->poll_b_type = CGRLC_POLL_CTRL; } grr_data->l1_del_tbf_start_fn = grr_decode_tbf_start_rel (cgrlc_poll_req->poll_fn,1); PSEND(hCommGRLC,cgrlc_poll_req); #ifdef REL99 time_to_poll = grr_get_time_to_send_poll(rrbp_i); #endif } if(msg_type NEQ D_DL_DUMMY_c) { if (sp_i) { TRACE_EVENT_P3("correct add with Poll: msg_type=0x%2x,fn_i=%ld,rrbp=%d ", msg_type, fn_i, rrbp_i ); } else { TRACE_EVENT_P2("correct add at fn=%ld: msg_type = 0x%2x",fn_i,msg_type); } } /* if( msg_type EQ ... ) { ULONG trace[5]; trace[0] = ptr_ctrl_block_i->buf[0] << 24; trace[0] |= ptr_ctrl_block_i->buf[1] << 16; trace[0] |= ptr_ctrl_block_i->buf[2] << 8; trace[0] |= ptr_ctrl_block_i->buf[3] << 0; trace[1] = ptr_ctrl_block_i->buf[4] << 24; trace[1] |= ptr_ctrl_block_i->buf[5] << 16; trace[1] |= ptr_ctrl_block_i->buf[6] << 8; trace[1] |= ptr_ctrl_block_i->buf[7] << 0; trace[2] = ptr_ctrl_block_i->buf[8] << 24; trace[2] |= ptr_ctrl_block_i->buf[9] << 16; trace[2] |= ptr_ctrl_block_i->buf[10] << 8; trace[2] |= ptr_ctrl_block_i->buf[11] << 0; trace[3] = ptr_ctrl_block_i->buf[12] << 24; trace[3] |= ptr_ctrl_block_i->buf[13] << 16; trace[3] |= ptr_ctrl_block_i->buf[14] << 8; trace[3] |= ptr_ctrl_block_i->buf[15] << 0; trace[4] = ptr_ctrl_block_i->buf[16] << 24; trace[4] |= ptr_ctrl_block_i->buf[17] << 16; trace[4] |= ptr_ctrl_block_i->buf[18] << 8; trace[4] |= ptr_ctrl_block_i->buf[19] << 0; TRACE_EVENT_P8( "RLC_CTRL: %08X%08X%08X%08X%08X%02X%02X%02X", trace[0], trace[1], trace[2], trace[3], trace[4], ptr_ctrl_block_i->buf[20], ptr_ctrl_block_i->buf[21], ptr_ctrl_block_i->buf[22] ); } */ switch (msg_type ) { case D_ACCESS_REJ_c : /* Packet Access Reject */ sig_gfp_tc_access_rej_ptm(); break; case D_TS_RECONFIG_c: /* Packet Timeslot reconfigure */ sig_gfp_tc_ts_reconfig_ptm (); break; case D_UL_ASSIGN_c : /* Packet Uplink Assignment */ sig_gfp_tc_ul_assign_ptm (); break; case D_DL_ASSIGN_c : /* Packet Downlink Assignment */ sig_gfp_tc_dl_assign_ptm (); break; case D_TBF_RELEASE_c : /* Packet TBF release */ sig_gfp_tc_packet_tbf_rel_ptm(fn_i,rrbp_i,sp_i); break; case D_PAGING_REQ_c : /* Packet Paging Request */ sig_gfp_pg_req (); break; case D_UL_ACK_c : /* Packet Uplink Ack/Nack */ { MCAST(d_ul_ack,D_UL_ACK); if(grr_data->uplink_tbf.mac_mode EQ FIXED_ALLOCATION) { sig_gfp_tc_fix_alloc_ack_ptm(); } /* * send ta update, if pta is present and allocation bitmap is not present. * If pta and allocation bitmap is present, than the ta update is sent * with MPHP_ASSIGNMENT_REQ primitive. */ if( d_ul_ack->gprs_ul_ack_nack_info.v_pta AND ( (grr_data->uplink_tbf.mac_mode NEQ FIXED_ALLOCATION) OR (!(d_ul_ack->gprs_ul_ack_nack_info.v_f_alloc_ack AND d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.v_fa_s2)) ) ) { sig_gfp_tc_update_ta_req_ptm(); } } break; case PSI_1_c : /* Packet System Information Type 1 */ sig_gfp_psi_1_ptm (); break; case PSI_2_c : /* Packet System Information Type 2 */ sig_gfp_psi_2_ptm (); break; case PSI_3_c : /* Packet System Information Type 3 */ sig_gfp_psi_3_ptm (); break; case PSI_3_BIS_c : /* Packet System Information Type 3 bis */ sig_gfp_psi_3_bis_ptm (); break; #if defined (REL99) AND defined (TI_PS_FF_EMR) case PSI_3_TER_c : /* Packet System Information Type 3 ter */ sig_gfp_psi_3_ter_ptm (); #endif /*lint -fallthrough*/ case PSI_4_c : /* Packet System Information Type 4 */ sig_gfp_psi_4_ptm (); break; #ifdef REL99 case PSI_8_c : /* Packet System Information Type 8 */ sig_gfp_psi_8_ptm (); break; #endif case PSI_13_c : /* Packet System Information Type 13 */ sig_gfp_psi_13_ptm (); break; case D_CELL_CHAN_ORDER_c : /* Packet Cell Change Order */ #ifdef REL99 sig_gfp_ctrl_cc_order (time_to_poll); #else sig_gfp_ctrl_cc_order (); #endif break; case D_DL_DUMMY_c : /* Packet Downlink Dummy Control Block */ break; case D_MEAS_ORDER_c : /* Packet Measurement Order */ sig_gfp_meas_order (); break; case D_PDCH_RELEASE_c : /* Packet PDCH Release */ TRACE_EVENT_P4("pdch rel on tn %d: %4x-%4x-%4x", tn_i, ptr_ctrl_block_i->buf[0], ptr_ctrl_block_i->buf[1], ptr_ctrl_block_i->buf[2]);/*lint !e415 !e416*/ sig_gfp_tc_pdch_release_ptm ( tn_i ); break; case D_POLLING_REQ_c : /* Packet Polling Request */ break; case D_CTRL_PWR_TA_c : /* Packet control power timing advance Parameters */ sig_gfp_meas_ctrl_pwr_ta_ptm ( ); break; default: TRACE_ERROR( "CGRLC_DATA_IND with unexpected ctrl message typ " ); break; } /* switch (msg_type) */ if( grr_data->pwr_ctrl_valid_flags.v_pwr_ctrl_param OR grr_data->pwr_ctrl_valid_flags.v_glbl_pwr_ctrl_param OR grr_data->pwr_ctrl_valid_flags.v_freq_param ) { grr_cgrlc_pwr_ctrl_req( FALSE ); } } else { TRACE_EVENT_P3("not add to MS: msg_type = %2x fn_i=%ld sp=%d",msg_type,fn_i,sp_i); } break; } grr_data->l1_del_tbf_start_fn = GRR_INVALID_FN; }/* gfp_send_ctrl_block() */