FreeCalypso > hg > fc-tourmaline
comparison src/g23m-gprs/grr/grr_tcf.c @ 1:fa8dc04885d8
src/g23m-*: import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:25:50 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:4e78acac3d88 | 1:fa8dc04885d8 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : GPRS (8441) | |
4 | Modul : GRR | |
5 +----------------------------------------------------------------------------- | |
6 | Copyright 2002 Texas Instruments Berlin, AG | |
7 | All rights reserved. | |
8 | | |
9 | This file is confidential and a trade secret of Texas | |
10 | Instruments Berlin, AG | |
11 | The receipt of or possession of this file does not convey | |
12 | any rights to reproduce or disclose its contents or to | |
13 | manufacture, use, or sell anything it may describe, in | |
14 | whole, or in part, without the specific written consent of | |
15 | Texas Instruments Berlin, AG. | |
16 +----------------------------------------------------------------------------- | |
17 | Purpose : This module implements local functions for service TC of | |
18 | entity GRR. | |
19 +----------------------------------------------------------------------------- | |
20 */ | |
21 | |
22 #ifndef GRR_TCF_C | |
23 #define GRR_TCF_C | |
24 #endif | |
25 | |
26 #define ENTITY_GRR | |
27 | |
28 /*==== INCLUDES =============================================================*/ | |
29 | |
30 #include <stdio.h> | |
31 #include <string.h> | |
32 | |
33 #include "typedefs.h" /* to get Condat data types */ | |
34 #include "vsi.h" /* to get a lot of macros */ | |
35 #include "macdef.h" | |
36 #include "gprs.h" | |
37 #include "gsm.h" /* to get a lot of macros */ | |
38 #include "ccdapi.h" /* to get CCD API */ | |
39 #include "cnf_grr.h" /* to get cnf-definitions */ | |
40 #include "mon_grr.h" /* to get mon-definitions */ | |
41 #include "prim.h" /* to get the definitions of used SAP and directions */ | |
42 #include "message.h" /* to get air message definitions */ | |
43 #include "grr.h" /* to get the global entity definitions */ | |
44 | |
45 #include "grr_f.h" /* to get Process GRR global function definitions */ | |
46 #include "grr_tcf.h" /* to get Service TC global function definitions */ | |
47 #include "grr_tcs.h" /* to get Service TC inter signal definitions */ | |
48 #include "grr_ctrls.h" /* to get interface to service CTRL */ | |
49 #include "grr_cpaps.h" /* to get interface to service CPAP */ | |
50 #include "grr_meass.h" /* to get the definitions for interference measurements */ | |
51 #include "cl_rlcmac.h" | |
52 | |
53 /*==== CONST ================================================================*/ | |
54 | |
55 typedef enum | |
56 { | |
57 GRR_STORE_TYPE_NONE, | |
58 GRR_STORE_TYPE_TN_ALLOC_PWR, | |
59 GRR_STORE_TYPE_ALF_GAM, | |
60 GRR_STORE_TYPE_PWR_PAR | |
61 } T_GRR_STORE_TYPE; | |
62 | |
63 /* | |
64 * used in tc_calc_req | |
65 * | |
66 */ | |
67 #define RANDOM_VALUE 0xAAAA | |
68 | |
69 #define RANDOM_2BIT (RANDOM_VALUE & 0x0003) | |
70 #define RANDOM_3BIT (RANDOM_VALUE & 0x0007) | |
71 #define RANDOM_5BIT (RANDOM_VALUE & 0x001F) | |
72 | |
73 #define ONE_PHASE_MASK_11BIT (0x0000 | RANDOM_3BIT ) | |
74 #define SHORT_ACCESS_MASK_11BIT (0x0400 | RANDOM_3BIT ) | |
75 #define TWO_PHASE_MASK_11BIT (0x0600 | RANDOM_3BIT ) | |
76 #define PAGE_RESPONSE_MASK_11BIT (0x0620 | RANDOM_5BIT ) | |
77 #define CELL_UPDATE_MASK_11BIT (0x0640 | RANDOM_5BIT ) | |
78 #define MM_PROCEDURE_MASK_11BIT (0x0660 | RANDOM_5BIT ) | |
79 #define SINGLE_BLOCK_MASK_11BIT (0x0680 | RANDOM_5BIT ) | |
80 | |
81 #define ONE_PHASE_MASK_8BIT (0x0080 | RANDOM_2BIT ) | |
82 #define SHORT_ACCESS_MASK_8BIT (0x0000 | RANDOM_3BIT ) | |
83 #define TWO_PHASE_MASK_8BIT (0x0040 | RANDOM_3BIT ) | |
84 #define PAGE_RESPONSE_MASK_8BIT (0x0048 | RANDOM_3BIT ) | |
85 #define CELL_UPDATE_MASK_8BIT (0x0050 | RANDOM_3BIT ) | |
86 #define MM_PROCEDURE_MASK_8BIT (0x0058 | RANDOM_3BIT ) | |
87 #define SINGLE_BLOCK_MASK_8BIT (0x0060 | RANDOM_3BIT ) | |
88 | |
89 /* | |
90 * used in tc_handle_ra_con | |
91 */ | |
92 const UBYTE max_retrans_table[4] = {1,2,4,7}; | |
93 | |
94 const UBYTE tx_int_table[16] = {2,3,4,5,6,7,8,9,10,12,14,16,20,25,32,50}; | |
95 | |
96 const UBYTE s_table[16] = {12,15,20,30,41,55,76,109,163,217, | |
97 S_VALUE_RESERVED,S_VALUE_RESERVED,S_VALUE_RESERVED, | |
98 S_VALUE_RESERVED,S_VALUE_RESERVED,S_VALUE_RESERVED }; | |
99 | |
100 | |
101 | |
102 /*==== DIAGNOSTICS ==========================================================*/ | |
103 | |
104 /*==== LOCAL VARS ===========================================================*/ | |
105 | |
106 | |
107 /*==== PRIVATE FUNCTIONS ====================================================*/ | |
108 | |
109 LOCAL void tc_set_da_assignment (T_MPHP_ASSIGNMENT_REQ * ptr2prim_i); | |
110 LOCAL void tc_set_fa_assignment (T_MPHP_ASSIGNMENT_REQ * ptr2prim_i); | |
111 LOCAL void tc_set_dl_assignment (T_MPHP_ASSIGNMENT_REQ * ptr2prim_i); | |
112 | |
113 LOCAL void tc_close_gaps_in_ctrl_blk_seq( UBYTE index ); | |
114 | |
115 LOCAL void tc_prepare_send_tbf_release_req( T_TBF_TYPE tbf_type ); | |
116 | |
117 LOCAL BOOL tc_check_and_save_freq (void); | |
118 | |
119 LOCAL USHORT grr_convert_11bit_2_etsi ( USHORT eleven_bit ); | |
120 | |
121 LOCAL USHORT tc_one_phase_mask_11bit (void) | |
122 { | |
123 #ifdef _TARGET_ | |
124 return (0x0000 | (USHORT)grr_random_value(PCR_RND_INDEX, 8)); | |
125 #else | |
126 return ONE_PHASE_MASK_11BIT; | |
127 #endif | |
128 } | |
129 | |
130 LOCAL SHORT tc_short_access_mask_11bit (void) | |
131 { | |
132 #ifdef _TARGET_ | |
133 return (0x0400 | (USHORT)grr_random_value(PCR_RND_INDEX, 8) ); | |
134 #else | |
135 return SHORT_ACCESS_MASK_11BIT; | |
136 #endif | |
137 } | |
138 | |
139 LOCAL SHORT tc_two_phase_mask_11bit (void) | |
140 { | |
141 #ifdef _TARGET_ | |
142 return (0x0600 | (USHORT)grr_random_value(PCR_RND_INDEX, 8) ); | |
143 #else | |
144 return TWO_PHASE_MASK_11BIT; | |
145 #endif | |
146 } | |
147 | |
148 LOCAL SHORT tc_page_response_mask_11bit (void) | |
149 { | |
150 #ifdef _TARGET_ | |
151 return (0x0620 | (USHORT)grr_random_value(PCR_RND_INDEX, 32) ); | |
152 #else | |
153 return PAGE_RESPONSE_MASK_11BIT; | |
154 #endif | |
155 } | |
156 | |
157 LOCAL SHORT tc_cell_update_mask_11bit (void) | |
158 { | |
159 #ifdef _TARGET_ | |
160 return (0x0640 | (USHORT)grr_random_value(PCR_RND_INDEX, 32) ); | |
161 #else | |
162 return CELL_UPDATE_MASK_11BIT; | |
163 #endif | |
164 } | |
165 | |
166 LOCAL SHORT tc_mm_procedure_mask_11bit (void) | |
167 { | |
168 #ifdef _TARGET_ | |
169 return (0x0660 |(USHORT)grr_random_value(PCR_RND_INDEX, 32) ); | |
170 #else | |
171 return MM_PROCEDURE_MASK_11BIT; | |
172 #endif | |
173 } | |
174 | |
175 LOCAL SHORT tc_single_block_mask_11bit (void) | |
176 { | |
177 #ifdef _TARGET_ | |
178 return (0x0680 | (USHORT)grr_random_value(PCR_RND_INDEX, 32) ); | |
179 #else | |
180 return SINGLE_BLOCK_MASK_11BIT; | |
181 #endif | |
182 } | |
183 | |
184 LOCAL SHORT tc_one_phase_mask_8bit (void) | |
185 { | |
186 #ifdef _TARGET_ | |
187 return (0x0080 | (USHORT)grr_random_value(PCR_RND_INDEX, 4) ); | |
188 #else | |
189 return ONE_PHASE_MASK_8BIT; | |
190 #endif | |
191 } | |
192 | |
193 LOCAL SHORT tc_short_access_mask_8bit (void) | |
194 { | |
195 #ifdef _TARGET_ | |
196 return (0x0000 | (USHORT)grr_random_value(PCR_RND_INDEX, 8) ); | |
197 #else | |
198 return SHORT_ACCESS_MASK_8BIT; | |
199 #endif | |
200 } | |
201 | |
202 LOCAL SHORT tc_two_phase_mask_8bit (void) | |
203 { | |
204 #ifdef _TARGET_ | |
205 return (0x0040 | (USHORT)grr_random_value(PCR_RND_INDEX, 8) ); | |
206 #else | |
207 return TWO_PHASE_MASK_8BIT; | |
208 #endif | |
209 } | |
210 | |
211 LOCAL SHORT tc_page_response_mask_8bit (void) | |
212 { | |
213 #ifdef _TARGET_ | |
214 return (0x0048 | (USHORT)grr_random_value(PCR_RND_INDEX, 8) ); | |
215 #else | |
216 return PAGE_RESPONSE_MASK_8BIT; | |
217 #endif | |
218 } | |
219 | |
220 LOCAL SHORT tc_cell_update_mask_8bit (void) | |
221 { | |
222 #ifdef _TARGET_ | |
223 return (0x0050 | (USHORT)grr_random_value(PCR_RND_INDEX, 8) ); | |
224 #else | |
225 return CELL_UPDATE_MASK_8BIT; | |
226 #endif | |
227 } | |
228 | |
229 LOCAL SHORT tc_mm_procedure_mask_8bit (void) | |
230 { | |
231 #ifdef _TARGET_ | |
232 return (0x0058 | (USHORT)grr_random_value(PCR_RND_INDEX, 8) ); | |
233 #else | |
234 return MM_PROCEDURE_MASK_8BIT; | |
235 #endif | |
236 } | |
237 LOCAL SHORT tc_single_block_mask_8bit (void) | |
238 { | |
239 #ifdef _TARGET_ | |
240 return (0x0060 | (USHORT)grr_random_value(PCR_RND_INDEX, 8) ); | |
241 #else | |
242 return SINGLE_BLOCK_MASK_8BIT; | |
243 #endif | |
244 } | |
245 | |
246 /* | |
247 +------------------------------------------------------------------------------ | |
248 | Function : tc_set_hopping_par | |
249 +------------------------------------------------------------------------------ | |
250 | Description : This function handles the frequency parameters in a ul or dl | |
251 | assignment or ts reconfigure. | |
252 | | |
253 | Parameters : ptr2prim - pointer to the MPHP_ASSIGNMENT_REQ prim | |
254 | that has to be set up. | |
255 | freq_par - pointer to the received frequency parameter struct. | |
256 | | |
257 +------------------------------------------------------------------------------ | |
258 */ | |
259 GLOBAL BOOL tc_set_hopping_par ( T_freq_par *freq_par ) | |
260 { | |
261 BOOL result = FALSE; | |
262 T_p_frequency_par frequency_par; | |
263 | |
264 TRACE_FUNCTION( "tc_set_hopping_par" ); | |
265 | |
266 memset( &frequency_par, 0, sizeof( frequency_par ) ); | |
267 | |
268 if(freq_par->v_indi_encod) | |
269 { | |
270 result = grr_validate_ma_num_in_freq_par(freq_par,GRR_FREQ_PARAM_RECEIVED_IN_ASSIGNMENT); | |
271 | |
272 if(result) | |
273 { | |
274 result = grr_create_freq_list( freq_par->indi_encod.ma_num, | |
275 freq_par->indi_encod.maio, | |
276 &frequency_par.p_chan_sel, | |
277 &frequency_par.p_freq_list ); | |
278 } | |
279 else | |
280 { | |
281 TRACE_ERROR("error creating frequency list"); | |
282 result = FALSE; | |
283 } | |
284 | |
285 } /* if(freq_par->v_indi_encod) */ | |
286 else if(freq_par->v_di_encod1) | |
287 { | |
288 memcpy(&psc_db->gprs_ms_alloc_in_assignment.gprs_ms_alloc_ie, | |
289 &freq_par->di_encod1.gprs_ms_alloc_ie, sizeof(T_gprs_ms_alloc_ie)); | |
290 | |
291 psc_db->gprs_ms_alloc_in_assignment.ma_num = MA_NUMBER_4_ASSIGNMENT; | |
292 psc_db->rfl[MAX_RFL].num = NOT_SET; | |
293 | |
294 result = grr_create_freq_list( psc_db->gprs_ms_alloc_in_assignment.ma_num, | |
295 freq_par->di_encod1.maio, | |
296 &frequency_par.p_chan_sel, | |
297 &frequency_par.p_freq_list ); | |
298 } /* if(freq_par->v_di_encod1) */ | |
299 else if(freq_par->v_di_encod2) | |
300 { | |
301 /* | |
302 * processing of T_freq_par from assignment and non-assignment messages | |
303 * when direct encoding 2 is used, should be done in same object module as | |
304 * this involvs use of static array variables which are local to the | |
305 * object module they are used in(_local_dummy_list and _local_rfl_contents. | |
306 * Hence processing for both assignment and non-assignement messages is done | |
307 * in grr_f.c. If they are put in different files, we will have to duplicate | |
308 * the static arrays. | |
309 */ | |
310 result = | |
311 grr_cnv_freq_para_in_assignment_direct_enc_2(&frequency_par,freq_par); | |
312 | |
313 } /* if(freq_par->v_di_encod2) */ | |
314 else | |
315 { | |
316 TRACE_ERROR("FATAL ERROR: no frequency params in ul assignment!"); | |
317 } | |
318 | |
319 if( result EQ TRUE ) | |
320 { | |
321 grr_data->tc.freq_set.freq_par = frequency_par; | |
322 grr_data->tc.freq_set.tsc = freq_par->tsc; | |
323 } | |
324 | |
325 grr_data->tc.v_freq_set = result; | |
326 | |
327 return ( result ); | |
328 }/* tc_set_hopping_par */ | |
329 | |
330 | |
331 | |
332 /* | |
333 +------------------------------------------------------------------------------ | |
334 | Function : tc_get_send_nb_prim_and_set_freq | |
335 +------------------------------------------------------------------------------ | |
336 | Description : This function allocates a primitve depending on the hopping status | |
337 | and sets the frequency parameter of T_MPHP_SINGLE_BLOCK_REQ | |
338 | | |
339 | Parameters : | |
340 | | |
341 +------------------------------------------------------------------------------ | |
342 */ | |
343 LOCAL T_MPHP_SINGLE_BLOCK_REQ * tc_get_send_nb_prim_and_set_freq ( void ) | |
344 { | |
345 PALLOC( mphp_single_block_req, MPHP_SINGLE_BLOCK_REQ ); | |
346 | |
347 TRACE_FUNCTION( "tc_get_send_nb_prim_and_set_freq" ); | |
348 | |
349 memset( mphp_single_block_req, 0, sizeof( T_MPHP_SINGLE_BLOCK_REQ ) ); | |
350 | |
351 mphp_single_block_req->tsc = grr_data->tc.freq_set.tsc; | |
352 | |
353 grr_set_freq_par( &mphp_single_block_req->p_frequency_par ); | |
354 | |
355 return( mphp_single_block_req ); | |
356 }/* tc_get_send_nb_prim_and_set_freq */ | |
357 | |
358 /* | |
359 +------------------------------------------------------------------------------ | |
360 | Function : tc_check_and_save_freq | |
361 +------------------------------------------------------------------------------ | |
362 | Description : This function check if the freq_par is valid or not.. | |
363 | If it is hopping case, save the hoppinging freq. | |
364 | | |
365 | Parameters : void | |
366 | | |
367 +------------------------------------------------------------------------------ | |
368 */ | |
369 LOCAL BOOL tc_check_and_save_freq (void) | |
370 { | |
371 MCAST(d_dl_assign,D_DL_ASSIGN); /* T_D_DL_ASSIGN T_D_UL_ASSIGN T_D_TS_RECONFIG */ | |
372 MCAST(d_ul_assign,D_UL_ASSIGN); | |
373 MCAST(d_ts_reconfig,D_TS_RECONFIG); | |
374 | |
375 BOOL result = FALSE; | |
376 T_freq_par *freq_par = NULL; | |
377 BOOL mode_check = FALSE; | |
378 | |
379 TRACE_FUNCTION( "tc_check_and_save_freq" ); | |
380 | |
381 /* | |
382 * store frequeny parameters, if present. | |
383 * If not present, take from data base | |
384 */ | |
385 switch(d_dl_assign->msg_type) | |
386 { | |
387 case D_DL_ASSIGN: /* T_D_DL_ASSIGN */ | |
388 if(d_dl_assign->pda_trnc_grp.v_freq_par) | |
389 { /* replace possibly earlier stored freq params */ | |
390 freq_par = &d_dl_assign->pda_trnc_grp.freq_par; | |
391 } | |
392 if((grr_data->tbf_type EQ CGRLC_TBF_MODE_UL) OR (grr_data->tbf_type EQ CGRLC_TBF_MODE_DL_UL) ) | |
393 { | |
394 mode_check = TRUE; | |
395 } | |
396 break; | |
397 case D_UL_ASSIGN: /* T_D_UL_ASSIGN */ | |
398 if(d_ul_assign->v_freq_par) | |
399 { /* replace possibly earlier stored freq params */ | |
400 freq_par = &d_ul_assign->freq_par; | |
401 } | |
402 if((grr_data->tbf_type EQ CGRLC_TBF_MODE_DL) OR (grr_data->tbf_type EQ CGRLC_TBF_MODE_DL_UL)) | |
403 { | |
404 mode_check = TRUE; | |
405 } | |
406 | |
407 break; | |
408 case D_TS_RECONFIG: /* T_D_TS_RECONFIG */ | |
409 if(d_ts_reconfig->v_freq_par) | |
410 { /* replace possibly earlier stored freq params */ | |
411 freq_par = &d_ts_reconfig->freq_par; | |
412 } | |
413 break; | |
414 case D_UL_ACK: /* T_D_UL_ACK */ | |
415 break; | |
416 default: | |
417 TRACE_ERROR ( "Wrong message type in _decodedMsg" ); | |
418 break; | |
419 | |
420 } | |
421 /* If frequency parameter element present, assigns frequency parameters to the | |
422 uplink TBF. If this information element is not present the mobile station | |
423 shall use its previously assigned frequency parameters.*/ | |
424 | |
425 if( freq_par )/* save the hopping frequency */ | |
426 { | |
427 if(freq_par->v_arfcn) /*static*/ | |
428 { | |
429 T_FREQ_SET temp_freq_set; | |
430 temp_freq_set.freq_par.p_chan_sel.hopping = FALSE; | |
431 temp_freq_set.tsc = freq_par->tsc; | |
432 temp_freq_set.freq_par.p_chan_sel.p_rf_ch.arfcn = grr_g23_arfcn_to_l1(freq_par->arfcn); | |
433 | |
434 /* variable needed by hopping case must be reset.*/ | |
435 memset(&(temp_freq_set.freq_par.p_freq_list.p_rf_chan_no.p_radio_freq), 0, sizeof(temp_freq_set.freq_par.p_freq_list.p_rf_chan_no.p_radio_freq)); | |
436 temp_freq_set.freq_par.p_freq_list.p_rf_chan_cnt = 0; | |
437 | |
438 if ( mode_check EQ TRUE ) | |
439 { | |
440 /* checking the params already exist or not */ | |
441 if ( ( grr_data->tc.freq_set.freq_par.p_chan_sel.hopping EQ FALSE) | |
442 AND (temp_freq_set.tsc EQ grr_data->tc.freq_set.tsc) | |
443 AND ( temp_freq_set.freq_par.p_chan_sel.p_rf_ch.arfcn EQ | |
444 grr_data->tc.freq_set.freq_par.p_chan_sel.p_rf_ch.arfcn ) ) | |
445 { | |
446 TRACE_EVENT ("Frequency parameters are same"); | |
447 result = TRUE; | |
448 } | |
449 else | |
450 { | |
451 TRACE_EVENT ("Frequency parameters are changed, So discard it"); | |
452 result = FALSE; | |
453 } | |
454 } | |
455 else | |
456 { | |
457 /* If it is new entry, storing in the grr_data */ | |
458 result = TRUE; | |
459 grr_data->tc.v_freq_set = TRUE; | |
460 grr_data->tc.freq_set = temp_freq_set; | |
461 } | |
462 } | |
463 else | |
464 { /* hopping cases */ | |
465 result = tc_set_hopping_par( freq_par ); | |
466 } | |
467 } | |
468 else if ( grr_data->tc.v_freq_set )/* if it is a two phase assignment or there is already another TBF running*/ | |
469 { | |
470 result = TRUE; | |
471 } | |
472 else | |
473 { | |
474 result = FALSE; | |
475 TRACE_ERROR("FATAL ERROR: no freq params in assignment but needed!"); | |
476 } | |
477 | |
478 if(result EQ TRUE) | |
479 { | |
480 grr_data->pwr_ctrl_valid_flags.v_glbl_pwr_ctrl_param = TRUE; | |
481 grr_data->pwr_ctrl_valid_flags.v_freq_param = TRUE; | |
482 } | |
483 | |
484 return(result); | |
485 | |
486 }/* tc_check_and_save_freq */ | |
487 | |
488 | |
489 | |
490 | |
491 /* | |
492 +------------------------------------------------------------------------------ | |
493 | Function : tc_set_da_assignment | |
494 +------------------------------------------------------------------------------ | |
495 | Description : This function sets some parameter of T_MPHP_ASSIGNMENT_REQ is | |
496 | case of uplink dynamic allocation. | |
497 | | |
498 | Parameters : ptr2prim_i - ptr to MPHP_ASSIGNMENT_REQ | |
499 | | |
500 +------------------------------------------------------------------------------ | |
501 */ | |
502 LOCAL void tc_set_da_assignment (T_MPHP_ASSIGNMENT_REQ * ptr2prim_i) | |
503 { | |
504 MCAST(d_ul_assign,D_UL_ASSIGN);/* T_D_UL_ASSIGN */ | |
505 MCAST(d_ts_reconfig,D_TS_RECONFIG); | |
506 | |
507 TRACE_FUNCTION( "tc_set_da_assignment" ); | |
508 | |
509 if( d_ul_assign->msg_type EQ D_UL_ASSIGN_c) | |
510 { | |
511 | |
512 /* | |
513 * timing advance | |
514 */ | |
515 grr_handle_ta ( d_ul_assign->pta.v_ta_value, | |
516 d_ul_assign->pta.ta_value, | |
517 d_ul_assign->pta.v_ta_index_tn, | |
518 d_ul_assign->pta.ta_index_tn.ta_index, | |
519 d_ul_assign->pta.ta_index_tn.ta_tn, | |
520 0xFF, | |
521 0, | |
522 0, | |
523 &ptr2prim_i->p_timing_advance); | |
524 | |
525 /* bts output power control */ | |
526 if(d_ul_assign->dyn_alloc_p.v_p0) | |
527 { | |
528 ptr2prim_i->p_dl_power.p0 = d_ul_assign->dyn_alloc_p.p0; | |
529 ptr2prim_i->p_dl_power.pr_mode = d_ul_assign->dyn_alloc_p.pr_mode; | |
530 /* dynamic allocation must use mode a */ | |
531 ptr2prim_i->p_dl_power.bts_pwr_ctl_mode = MODE_A; | |
532 } | |
533 else | |
534 { | |
535 ptr2prim_i->p_dl_power.p0 = 0xff; /* 0xff -> invalid value */ | |
536 /* -> pr_mode and bts_pwr_ctl_mode don't care */ | |
537 } | |
538 | |
539 /* | |
540 * TBF starting time | |
541 */ | |
542 if(d_ul_assign->dyn_alloc_p.v_tbf_s_time) | |
543 { | |
544 ptr2prim_i->p_tbf_start.tbf_start_present = 1; | |
545 if(d_ul_assign->dyn_alloc_p.tbf_s_time.v_abs) | |
546 { | |
547 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_abs(&d_ul_assign->dyn_alloc_p.tbf_s_time.abs); | |
548 } | |
549 else if (d_ul_assign->dyn_alloc_p.tbf_s_time.v_rel) | |
550 { | |
551 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_rel(grr_data->dl_fn, | |
552 d_ul_assign->dyn_alloc_p.tbf_s_time.rel); | |
553 } | |
554 else | |
555 { /* this shall never happen */ | |
556 ptr2prim_i->p_tbf_start.fn = grr_data->dl_fn; | |
557 TRACE_ERROR("UL v_start_tbf but either rel nor abs tbf included"); | |
558 } | |
559 } | |
560 else if(grr_data->l1_del_tbf_start_fn NEQ GRR_INVALID_FN) | |
561 { | |
562 ptr2prim_i->p_tbf_start.tbf_start_present = 1; | |
563 ptr2prim_i->p_tbf_start.fn = grr_data->l1_del_tbf_start_fn; | |
564 } | |
565 else | |
566 { | |
567 ptr2prim_i->p_tbf_start.tbf_start_present = 0; | |
568 } | |
569 | |
570 /* | |
571 * mac mode | |
572 */ | |
573 if (d_ul_assign->dyn_alloc_p.xdyn_alloc) | |
574 { | |
575 ptr2prim_i->mac_mode = EDA; | |
576 } | |
577 else | |
578 { | |
579 ptr2prim_i->mac_mode = DA; | |
580 } | |
581 | |
582 /* | |
583 * uplink allocation structure | |
584 */ | |
585 if(d_ul_assign->dyn_alloc_p.v_ul_tfi_assign) | |
586 { | |
587 ptr2prim_i->p_ul_alloc.ul_tfi = d_ul_assign->dyn_alloc_p.ul_tfi_assign; | |
588 } | |
589 else | |
590 { | |
591 ptr2prim_i->p_ul_alloc.ul_tfi = grr_data->uplink_tbf.tfi; | |
592 } | |
593 ptr2prim_i->p_ul_alloc.ts_mask = grr_data->uplink_tbf.ts_usage; | |
594 | |
595 | |
596 /* | |
597 * dynamic allocation structure | |
598 */ | |
599 ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_gran = | |
600 d_ul_assign->dyn_alloc_p.usf_grant; | |
601 | |
602 if(d_ul_assign->dyn_alloc_p.v_tn_alloc EQ 1) | |
603 { | |
604 UBYTE i; | |
605 for(i = 0;i < 8;i++) | |
606 { | |
607 if(d_ul_assign->dyn_alloc_p.tn_alloc[i].v_usf) | |
608 { | |
609 ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_table[i] = | |
610 d_ul_assign->dyn_alloc_p.tn_alloc[i].usf; | |
611 } | |
612 } | |
613 } | |
614 else if (d_ul_assign->dyn_alloc_p.v_tn_alloc_pwr) | |
615 { | |
616 UBYTE i; | |
617 | |
618 for(i = 0;i < 8;i++) | |
619 { | |
620 if(d_ul_assign->dyn_alloc_p.tn_alloc_pwr.usf_array[i].v_usf_g) | |
621 { | |
622 ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_table[i] = | |
623 d_ul_assign->dyn_alloc_p.tn_alloc_pwr.usf_array[i].usf_g.usf; | |
624 } | |
625 } | |
626 | |
627 grr_store_type_tn_alloc_pwr( &d_ul_assign->dyn_alloc_p.tn_alloc_pwr ); | |
628 } | |
629 else | |
630 { | |
631 ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_table[0] = 5; | |
632 TRACE_EVENT("USF-Error: set (hardcoded) USF_TN0 = 0x05"); | |
633 } | |
634 | |
635 } | |
636 else if ( d_ts_reconfig->msg_type EQ D_TS_RECONFIG_c) | |
637 { | |
638 /* | |
639 * timing advance is handled in tc_set_dl_assignment | |
640 */ | |
641 /* grr_handle_ta ( d_ts_reconfig->gpta.v_ta_value, | |
642 d_ts_reconfig->gpta.ta_value, | |
643 d_ts_reconfig->gpta.v_ul_ta_index, | |
644 d_ts_reconfig->gpta.ul_ta_index, | |
645 d_ts_reconfig->gpta.ul_ta_tn, | |
646 0, | |
647 0, | |
648 0, | |
649 ptr2prim_i->p_timing_advance); | |
650 | |
651 */ | |
652 /* bts output power control */ | |
653 if(d_ts_reconfig->dyn_alloc_ts.v_p0) | |
654 { | |
655 ptr2prim_i->p_dl_power.p0 = d_ts_reconfig->dyn_alloc_ts.p0; | |
656 ptr2prim_i->p_dl_power.pr_mode = d_ts_reconfig->dyn_alloc_ts.pr_mode; | |
657 /* dynamic allocation must use mode a */ | |
658 ptr2prim_i->p_dl_power.bts_pwr_ctl_mode = MODE_A; | |
659 } | |
660 else | |
661 { | |
662 ptr2prim_i->p_dl_power.p0 = 0xff; /* 0xff -> invalid value */ | |
663 /* -> pr_mode and bts_pwr_ctl_mode don't care */ | |
664 } | |
665 | |
666 /* | |
667 * TBF starting time | |
668 */ | |
669 if(d_ts_reconfig->dyn_alloc_ts.v_tbf_s_time) | |
670 { | |
671 ptr2prim_i->p_tbf_start.tbf_start_present= 1; | |
672 if(d_ts_reconfig->dyn_alloc_ts.tbf_s_time.v_abs) | |
673 { | |
674 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_abs(&d_ts_reconfig->dyn_alloc_ts.tbf_s_time.abs); | |
675 } | |
676 else if (d_ts_reconfig->dyn_alloc_ts.tbf_s_time.v_rel) | |
677 { | |
678 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_rel(grr_data->dl_fn, | |
679 d_ts_reconfig->dyn_alloc_ts.tbf_s_time.rel); | |
680 } | |
681 else | |
682 { /* this shall never happen */ | |
683 ptr2prim_i->p_tbf_start.fn = grr_data->dl_fn%FN_MAX; | |
684 TRACE_ERROR("TS RECON UL v_start_tbf but either rel nor abs tbf included"); | |
685 } | |
686 } | |
687 else if(grr_data->l1_del_tbf_start_fn NEQ GRR_INVALID_FN) | |
688 { | |
689 ptr2prim_i->p_tbf_start.tbf_start_present = 1; | |
690 ptr2prim_i->p_tbf_start.fn = grr_data->l1_del_tbf_start_fn; | |
691 } | |
692 else | |
693 { | |
694 ptr2prim_i->p_tbf_start.tbf_start_present = 0; | |
695 } | |
696 | |
697 | |
698 /* | |
699 * mac mode | |
700 */ | |
701 if (d_ts_reconfig->dyn_alloc_ts.xdyn_alloc) | |
702 { | |
703 ptr2prim_i->mac_mode = EDA; | |
704 } | |
705 else | |
706 { | |
707 ptr2prim_i->mac_mode = DA; | |
708 } | |
709 | |
710 /* | |
711 * uplink allocation structure | |
712 */ | |
713 if(d_ts_reconfig->v_ul_tfi) | |
714 { | |
715 ptr2prim_i->p_ul_alloc.ul_tfi = d_ts_reconfig->ul_tfi; | |
716 } | |
717 else | |
718 { | |
719 ptr2prim_i->p_ul_alloc.ul_tfi = grr_data->uplink_tbf.tfi; | |
720 } | |
721 ptr2prim_i->p_ul_alloc.ts_mask = grr_data->uplink_tbf.ts_usage; | |
722 | |
723 | |
724 /* | |
725 * dynamic allocation structure | |
726 */ | |
727 ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_gran = d_ts_reconfig->dyn_alloc_ts.usf_grant; | |
728 | |
729 if(d_ts_reconfig->dyn_alloc_ts.v_tn_alloc EQ 1) | |
730 { | |
731 UBYTE i; | |
732 for(i = 0;i < 8;i++) | |
733 { | |
734 if(d_ts_reconfig->dyn_alloc_ts.tn_alloc[i].v_usf) | |
735 { | |
736 ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_table[i] = | |
737 d_ts_reconfig->dyn_alloc_ts.tn_alloc[i].usf; | |
738 } | |
739 } | |
740 } | |
741 else if (d_ts_reconfig->dyn_alloc_ts.v_tn_alloc_pwr) | |
742 { | |
743 UBYTE i; | |
744 | |
745 for(i = 0;i < 8;i++) | |
746 { | |
747 if(d_ts_reconfig->dyn_alloc_ts.tn_alloc_pwr.usf_array[i].v_usf_g) | |
748 { | |
749 ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_table[i] = | |
750 d_ts_reconfig->dyn_alloc_ts.tn_alloc_pwr.usf_array[i].usf_g.usf; | |
751 } | |
752 } | |
753 | |
754 grr_store_type_tn_alloc_pwr( &d_ts_reconfig->dyn_alloc_ts.tn_alloc_pwr ); | |
755 } | |
756 else | |
757 { | |
758 ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_table[0] = 5; | |
759 TRACE_EVENT("USF-Error: set (hardcoded) USF_TN0 = 0x05"); | |
760 } | |
761 } | |
762 else | |
763 { | |
764 TRACE_ERROR ( "Wrong message type in _decodedCtrlMsg" ); | |
765 } | |
766 | |
767 if(ptr2prim_i->p_tbf_start.tbf_start_present) | |
768 grr_data->uplink_tbf.tbf_start_fn = ptr2prim_i->p_tbf_start.fn; | |
769 else | |
770 grr_data->uplink_tbf.tbf_start_fn = CGRLC_STARTING_TIME_NOT_PRESENT; | |
771 | |
772 grr_data->uplink_tbf.st_tfi = ptr2prim_i->p_ul_alloc.ul_tfi; | |
773 | |
774 | |
775 | |
776 return; | |
777 }/*tc_set_da_assignment*/ | |
778 | |
779 | |
780 /* | |
781 +------------------------------------------------------------------------------ | |
782 | Function : tc_calc_fa_bitmap | |
783 +------------------------------------------------------------------------------ | |
784 | Description : This function calculates rhe allocation bitmap in | |
785 | case of fixed allocation | |
786 | | |
787 | Parameters : blks_or_blkps - indicates if blocks(0) or block periods(1) is used | |
788 | len - len of the allocation bitmap | |
789 | ptr2_alloc_map - ptr to the allocation bitmap array | |
790 | ptr2_fix_alloc - ptr to the fixed allocation struct | |
791 | | |
792 +------------------------------------------------------------------------------ | |
793 */ | |
794 GLOBAL void tc_calc_fa_bitmap (ULONG tbf_start, | |
795 UBYTE blks_or_blkps, | |
796 USHORT len, | |
797 UBYTE * ptr2_alloc_map, | |
798 T_p_fixed_alloc * ptr2_fix_alloc) | |
799 { | |
800 UBYTE i; | |
801 UBYTE help; | |
802 UBYTE tn[8]; | |
803 UBYTE x,y; | |
804 UBYTE len_1; | |
805 USHORT index; | |
806 | |
807 TRACE_FUNCTION( "tc_calc_fa_bitmap" ); | |
808 | |
809 /* | |
810 TRACE_EVENT_P9("FA bitmap: start_fn=%ld, blk=%d len=%ld bitmap: %d %d %d %d %d %d", | |
811 tbf_start, | |
812 blks_or_blkps, | |
813 len, | |
814 ptr2_alloc_map[0], | |
815 ptr2_alloc_map[1], | |
816 ptr2_alloc_map[2], | |
817 ptr2_alloc_map[3], | |
818 ptr2_alloc_map[4], | |
819 ptr2_alloc_map[5]); | |
820 | |
821 TRACE_EVENT_P9("%d %d %d %d %d %d %d %d %d", | |
822 ptr2_alloc_map[6], | |
823 ptr2_alloc_map[7], | |
824 ptr2_alloc_map[8], | |
825 ptr2_alloc_map[9], | |
826 ptr2_alloc_map[10], | |
827 ptr2_alloc_map[11], | |
828 ptr2_alloc_map[12], | |
829 ptr2_alloc_map[13], | |
830 ptr2_alloc_map[14]); | |
831 | |
832 TRACE_EVENT_P9("%d %d %d %d %d %d %d %d %d", | |
833 ptr2_alloc_map[15], | |
834 ptr2_alloc_map[16], | |
835 ptr2_alloc_map[17], | |
836 ptr2_alloc_map[18], | |
837 ptr2_alloc_map[19], | |
838 ptr2_alloc_map[20], | |
839 ptr2_alloc_map[21], | |
840 ptr2_alloc_map[22], | |
841 ptr2_alloc_map[23]); | |
842 TRACE_EVENT_P9("%d %d %d %d %d %d %d %d %d", | |
843 ptr2_alloc_map[24], | |
844 ptr2_alloc_map[25], | |
845 ptr2_alloc_map[26], | |
846 ptr2_alloc_map[27], | |
847 ptr2_alloc_map[28], | |
848 ptr2_alloc_map[29], | |
849 ptr2_alloc_map[30], | |
850 ptr2_alloc_map[31], | |
851 ptr2_alloc_map[32]); | |
852 */ | |
853 memset( tn, 0, sizeof(tn) ); | |
854 | |
855 if(blks_or_blkps) | |
856 { | |
857 /* | |
858 * block periods are used | |
859 */ | |
860 for(i=0;i<len;i++) | |
861 { | |
862 if(ptr2_alloc_map[i]) | |
863 { | |
864 ptr2_fix_alloc->bitmap[i] = grr_data->uplink_tbf.ts_usage; | |
865 } | |
866 else | |
867 ptr2_fix_alloc->bitmap[i] = 0; | |
868 } | |
869 ptr2_fix_alloc->size_bitmap = (UBYTE)len; | |
870 } | |
871 else | |
872 { | |
873 UBYTE L; | |
874 /* | |
875 * blocks are used | |
876 */ | |
877 /* | |
878 * determinate the timeslot positions | |
879 */ | |
880 help = grr_data->uplink_tbf.ts_usage; | |
881 index = 0; | |
882 for(i=0;i<=7;i++) | |
883 { | |
884 if(help >= (0x80 >> i)) | |
885 { | |
886 tn[index]=i; | |
887 index++; | |
888 help -= (0x80 >> i); | |
889 } | |
890 } | |
891 memset(ptr2_fix_alloc->bitmap,0,sizeof(ptr2_fix_alloc->bitmap)); | |
892 L = len - 1; | |
893 for(i=0;i<=L;i++) | |
894 { | |
895 if(ptr2_alloc_map[i]) | |
896 { | |
897 x = i / grr_data->uplink_tbf.nts; | |
898 y = i % grr_data->uplink_tbf.nts; | |
899 ptr2_fix_alloc->bitmap[x] |= 0x80 >> tn[y]; | |
900 } | |
901 } | |
902 ptr2_fix_alloc->size_bitmap = (UBYTE)len / grr_data->uplink_tbf.nts; | |
903 } | |
904 /* | |
905 * set fa_ctrl | |
906 */ | |
907 | |
908 | |
909 grr_data->tc.fa_ctrl.fa_type = FA_BITMAP; | |
910 | |
911 | |
912 grr_data->tc.fa_ctrl.current_alloc.alloc_start_fn = tbf_start; | |
913 | |
914 /* store end of fixed allocation */ | |
915 len_1 = ptr2_fix_alloc->size_bitmap - 1; | |
916 grr_data->tc.fa_ctrl.current_alloc.alloc_end_fn = | |
917 grr_decode_tbf_start_rel(grr_data->tc.fa_ctrl.current_alloc.alloc_start_fn,(USHORT)(len_1-1)); | |
918 | |
919 memcpy( &grr_data->tc.fa_ctrl.current_alloc.alloc, | |
920 ptr2_fix_alloc, | |
921 sizeof(T_p_fixed_alloc)); | |
922 | |
923 /* TRACE_EVENT_P9("L1 bitmap %d %d %d %d %d %d %d %d %d", | |
924 ptr2_fix_alloc->bitmap[0], | |
925 ptr2_fix_alloc->bitmap[1], | |
926 ptr2_fix_alloc->bitmap[2], | |
927 ptr2_fix_alloc->bitmap[3], | |
928 ptr2_fix_alloc->bitmap[4], | |
929 ptr2_fix_alloc->bitmap[5], | |
930 ptr2_fix_alloc->bitmap[6], | |
931 ptr2_fix_alloc->bitmap[7], | |
932 ptr2_fix_alloc->bitmap[8]); | |
933 | |
934 TRACE_EVENT_P9("%d %d %d %d %d %d %d %d %d", | |
935 ptr2_fix_alloc->bitmap[9], | |
936 ptr2_fix_alloc->bitmap[10], | |
937 ptr2_fix_alloc->bitmap[11], | |
938 ptr2_fix_alloc->bitmap[12], | |
939 ptr2_fix_alloc->bitmap[13], | |
940 ptr2_fix_alloc->bitmap[14], | |
941 ptr2_fix_alloc->bitmap[15], | |
942 ptr2_fix_alloc->bitmap[16], | |
943 ptr2_fix_alloc->bitmap[17]); | |
944 TRACE_EVENT_P9("%d %d %d %d %d %d %d %d %d", | |
945 ptr2_fix_alloc->bitmap[18], | |
946 ptr2_fix_alloc->bitmap[19], | |
947 ptr2_fix_alloc->bitmap[20], | |
948 ptr2_fix_alloc->bitmap[21], | |
949 ptr2_fix_alloc->bitmap[22], | |
950 ptr2_fix_alloc->bitmap[23], | |
951 ptr2_fix_alloc->bitmap[24], | |
952 ptr2_fix_alloc->bitmap[25], | |
953 ptr2_fix_alloc->bitmap[26]); | |
954 */ | |
955 } /* tc_calc_fa_bitmap() */ | |
956 | |
957 /* | |
958 +------------------------------------------------------------------------------ | |
959 | Function : tc_handle_final_alloc | |
960 +------------------------------------------------------------------------------ | |
961 | Description : This function handles the final allocation bit. | |
962 | | |
963 | Parameters : - | |
964 | | |
965 +------------------------------------------------------------------------------ | |
966 */ | |
967 GLOBAL void tc_handle_final_alloc (UBYTE final_allocation) | |
968 { | |
969 | |
970 TRACE_FUNCTION( "tc_handle_final_alloc" ); | |
971 | |
972 | |
973 | |
974 } /* tc_handle_final_alloc() */ | |
975 | |
976 /* | |
977 +------------------------------------------------------------------------------ | |
978 | Function : tc_set_fa_assignment | |
979 +------------------------------------------------------------------------------ | |
980 | Description : This function sets some parameter of T_MPHP_ASSIGNMENT_REQ is | |
981 | case of fixed allocation | |
982 | | |
983 | Parameters : ptr2prim_i - ptr to MPHP_ASSIGNMENT_REQ | |
984 | | |
985 +------------------------------------------------------------------------------ | |
986 */ | |
987 LOCAL void tc_set_fa_assignment (T_MPHP_ASSIGNMENT_REQ * ptr2prim_i) | |
988 { | |
989 /* ULONG var; */ | |
990 MCAST(d_ul_assign,D_UL_ASSIGN); /* T_D_UL_ASSIGN */ | |
991 MCAST(d_ts_reconfig,D_TS_RECONFIG); /* T_TS_RECONFIG */ | |
992 MCAST(d_ul_ack,D_UL_ACK); /* T_D_UL_ACK */ | |
993 | |
994 | |
995 | |
996 | |
997 TRACE_FUNCTION( "tc_set_fa_assignment" ); | |
998 | |
999 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
1000 if((d_ul_assign->msg_type EQ D_UL_ASSIGN_c) AND | |
1001 (ptr2prim_i->assign_cmd EQ UL_TP_ACCESS)) | |
1002 { | |
1003 /* training sequence code */ | |
1004 ptr2prim_i->tsc = d_ul_assign->freq_par.tsc; | |
1005 | |
1006 /* handle timing advance */ | |
1007 grr_handle_ta ( d_ul_assign->pta.v_ta_value, | |
1008 d_ul_assign->pta.ta_value, | |
1009 d_ul_assign->pta.v_ta_index_tn, | |
1010 d_ul_assign->pta.ta_index_tn.ta_index, | |
1011 d_ul_assign->pta.ta_index_tn.ta_tn, | |
1012 0xFF, | |
1013 0, | |
1014 0, | |
1015 &ptr2prim_i->p_timing_advance); | |
1016 | |
1017 /* Mac mode */ | |
1018 ptr2prim_i->mac_mode = FA; | |
1019 | |
1020 /* Handle single block allocation */ | |
1021 if(d_ul_assign->v_sin_alloc EQ TRUE ) | |
1022 { | |
1023 /* timeslot mask */ | |
1024 ptr2prim_i->p_ul_alloc.ts_mask = 0x80>>d_ul_assign->sin_alloc.tn; | |
1025 | |
1026 /* PO, BTS_POWER_MODE and PR_ MODE */ | |
1027 if(d_ul_assign->sin_alloc.v_bts_pwr_ctrl EQ TRUE ) | |
1028 { | |
1029 ptr2prim_i->p_dl_power.p0 = | |
1030 d_ul_assign->sin_alloc.bts_pwr_ctrl.p0; | |
1031 | |
1032 ptr2prim_i->p_dl_power.bts_pwr_ctl_mode = | |
1033 d_ul_assign->sin_alloc.bts_pwr_ctrl.mode; | |
1034 | |
1035 ptr2prim_i->p_dl_power.pr_mode = | |
1036 d_ul_assign->sin_alloc.bts_pwr_ctrl.pr_mode; | |
1037 } | |
1038 else | |
1039 { | |
1040 ptr2prim_i->p_dl_power.p0 = 0xff; | |
1041 } | |
1042 | |
1043 /* Downlink Control Timeslot */ | |
1044 ptr2prim_i->p_ul_alloc.p_fixed_alloc.dl_ctrl_ts = d_ul_assign->sin_alloc.tn; | |
1045 | |
1046 /* | |
1047 * handle TBF starting time | |
1048 * is always present in single block allocation | |
1049 */ | |
1050 if(d_ul_assign->sin_alloc.tbf_s_time.v_abs) | |
1051 { | |
1052 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_abs(&d_ul_assign->sin_alloc.tbf_s_time.abs); | |
1053 if(!grr_check_if_tbf_start_is_elapsed ( ptr2prim_i->p_tbf_start.fn, grr_data->ul_fn)) | |
1054 { | |
1055 /*Allocated Number of time slots are 1 */ | |
1056 ptr2prim_i->p_ul_alloc.p_fixed_alloc.size_bitmap = 1; | |
1057 ptr2prim_i->p_tbf_start.tbf_start_present=TRUE; | |
1058 ptr2prim_i->p_ul_alloc.p_fixed_alloc.bitmap[0] = 0x80 >> d_ul_assign->sin_alloc.tn; | |
1059 } | |
1060 else | |
1061 { | |
1062 TRACE_ERROR("TBF Starting time is ELAPSED in single block allocation!"); | |
1063 } | |
1064 } | |
1065 else if (d_ul_assign->sin_alloc.tbf_s_time.v_rel) | |
1066 { | |
1067 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_rel(grr_data->dl_fn, | |
1068 (USHORT)(d_ul_assign->sin_alloc.tbf_s_time.rel)); | |
1069 if(!grr_check_if_tbf_start_is_elapsed ( ptr2prim_i->p_tbf_start.fn, grr_data->ul_fn)) | |
1070 { | |
1071 /*Allocated Number of time slots are 1 */ | |
1072 ptr2prim_i->p_ul_alloc.p_fixed_alloc.size_bitmap = 1; | |
1073 ptr2prim_i->p_tbf_start.tbf_start_present=TRUE; | |
1074 ptr2prim_i->p_ul_alloc.p_fixed_alloc.bitmap[0] = 0x80 >> d_ul_assign->sin_alloc.tn; | |
1075 } | |
1076 else | |
1077 { | |
1078 TRACE_ERROR("TBF Starting time is ELAPSED in single block allocation!"); | |
1079 } | |
1080 } | |
1081 }/* single block */ | |
1082 } | |
1083 else | |
1084 #endif | |
1085 if( d_ul_assign->msg_type EQ D_UL_ASSIGN_c) | |
1086 { | |
1087 /* | |
1088 * timing advance | |
1089 */ | |
1090 | |
1091 grr_handle_ta ( d_ul_assign->pta.v_ta_value, | |
1092 d_ul_assign->pta.ta_value, | |
1093 d_ul_assign->pta.v_ta_index_tn, | |
1094 d_ul_assign->pta.ta_index_tn.ta_index, | |
1095 d_ul_assign->pta.ta_index_tn.ta_tn, | |
1096 0xFF, | |
1097 0, | |
1098 0, | |
1099 &ptr2prim_i->p_timing_advance); | |
1100 | |
1101 if(d_ul_assign->f_alloc_ul.v_bts_pwr_ctrl) | |
1102 { | |
1103 ptr2prim_i->p_dl_power.p0 = d_ul_assign->f_alloc_ul.bts_pwr_ctrl.p0; | |
1104 ptr2prim_i->p_dl_power.bts_pwr_ctl_mode = | |
1105 d_ul_assign->f_alloc_ul.bts_pwr_ctrl.mode; | |
1106 ptr2prim_i->p_dl_power.pr_mode = | |
1107 d_ul_assign->f_alloc_ul.bts_pwr_ctrl.pr_mode; | |
1108 } | |
1109 else | |
1110 { | |
1111 ptr2prim_i->p_dl_power.p0 = 0xff; | |
1112 } | |
1113 | |
1114 /* | |
1115 * mac mode | |
1116 */ | |
1117 ptr2prim_i->mac_mode = FA; | |
1118 /* | |
1119 * uplink allocation structure | |
1120 */ | |
1121 if(d_ul_assign->f_alloc_ul.v_ul_tfi_assign) | |
1122 { | |
1123 ptr2prim_i->p_ul_alloc.ul_tfi = d_ul_assign->f_alloc_ul.ul_tfi_assign; | |
1124 } | |
1125 else | |
1126 { | |
1127 ptr2prim_i->p_ul_alloc.ul_tfi = grr_data->uplink_tbf.tfi; | |
1128 } | |
1129 ptr2prim_i->p_ul_alloc.ts_mask = grr_data->uplink_tbf.ts_usage; | |
1130 /* | |
1131 * fixed allocation structure | |
1132 * half duplex mode is ignored, only valid for MS class 19 to 29 | |
1133 */ | |
1134 | |
1135 /* | |
1136 * TBF STARTING TIME for fixed allocation structure | |
1137 */ | |
1138 if(d_ul_assign->f_alloc_ul.tbf_s_time.v_abs) | |
1139 { | |
1140 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_abs(&d_ul_assign->f_alloc_ul.tbf_s_time.abs); | |
1141 } | |
1142 else if (d_ul_assign->f_alloc_ul.tbf_s_time.v_rel) | |
1143 { | |
1144 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_rel(grr_data->dl_fn, | |
1145 d_ul_assign->f_alloc_ul.tbf_s_time.rel); | |
1146 } | |
1147 else | |
1148 { /* this shall never happen */ | |
1149 ptr2prim_i->p_tbf_start.fn = (grr_data->dl_fn+13)%FN_MAX; | |
1150 TRACE_ERROR("NO STARTING TIME IN FIXED ALLOCATION!!"); | |
1151 } | |
1152 ptr2prim_i->p_tbf_start.tbf_start_present = 1; | |
1153 /* | |
1154 * Downlink Control Timeslot | |
1155 */ | |
1156 ptr2prim_i->p_ul_alloc.p_fixed_alloc.dl_ctrl_ts = d_ul_assign->f_alloc_ul.dl_ctrl_ts; | |
1157 grr_data->tc.fa_ctrl.dl_ctrl_ts = d_ul_assign->f_alloc_ul.dl_ctrl_ts; | |
1158 /* | |
1159 * ALLOCATION BITMAP | |
1160 */ | |
1161 if(d_ul_assign->f_alloc_ul.v_block_struct) | |
1162 { | |
1163 tc_calc_fa_bitmap(ptr2prim_i->p_tbf_start.fn, /*starting time of cuurent tbf*/ | |
1164 d_ul_assign->f_alloc_ul.block_struct.bl_o_bl_per,/* blocks or block periods*/ | |
1165 d_ul_assign->f_alloc_ul.block_struct.a_map_len, /* bitmap length*/ | |
1166 d_ul_assign->f_alloc_ul.block_struct.alloc_map, /* ptr to alloc struct*/ | |
1167 &ptr2prim_i->p_ul_alloc.p_fixed_alloc); /* ptr to fix sttruct*/ | |
1168 } | |
1169 else if(d_ul_assign->f_alloc_ul.v_alloc_map) | |
1170 { | |
1171 tc_calc_fa_bitmap(ptr2prim_i->p_tbf_start.fn, /*starting time of cuurent tbf*/ | |
1172 0, /* blocks : default*/ | |
1173 d_ul_assign->f_alloc_ul.c_alloc_map, /* bitmap length*/ | |
1174 d_ul_assign->f_alloc_ul.alloc_map, /* ptr to alloc struct*/ | |
1175 &ptr2prim_i->p_ul_alloc.p_fixed_alloc); /* ptr to fix sttruct*/ | |
1176 } | |
1177 /* | |
1178 * check final allocation | |
1179 */ | |
1180 grr_data->tc.fa_ctrl.current_alloc.final_alloc = d_ul_assign->f_alloc_ul.final_alloc; | |
1181 } | |
1182 else if ( d_ts_reconfig->msg_type EQ D_TS_RECONFIG_c) | |
1183 { | |
1184 /* | |
1185 * timing advance is handled in tc_set_dl_assignment | |
1186 */ | |
1187 | |
1188 if(d_ts_reconfig->f_alloc_re.v_bts_pwr_ctrl) | |
1189 { | |
1190 ptr2prim_i->p_dl_power.p0 = d_ts_reconfig->f_alloc_re.bts_pwr_ctrl.p0; | |
1191 ptr2prim_i->p_dl_power.bts_pwr_ctl_mode = | |
1192 d_ts_reconfig->f_alloc_re.bts_pwr_ctrl.mode; | |
1193 ptr2prim_i->p_dl_power.pr_mode = | |
1194 d_ts_reconfig->f_alloc_re.bts_pwr_ctrl.pr_mode; | |
1195 } | |
1196 else | |
1197 { | |
1198 ptr2prim_i->p_dl_power.p0 = 0xff; | |
1199 } | |
1200 | |
1201 /* | |
1202 * mac mode | |
1203 */ | |
1204 ptr2prim_i->mac_mode = FA; | |
1205 /* | |
1206 * uplink allocation structure | |
1207 */ | |
1208 if(d_ts_reconfig->v_ul_tfi) | |
1209 { | |
1210 ptr2prim_i->p_ul_alloc.ul_tfi = d_ts_reconfig->ul_tfi; | |
1211 } | |
1212 else | |
1213 { | |
1214 ptr2prim_i->p_ul_alloc.ul_tfi = grr_data->uplink_tbf.tfi; | |
1215 } | |
1216 ptr2prim_i->p_ul_alloc.ts_mask = grr_data->uplink_tbf.ts_usage; | |
1217 /* | |
1218 * fixed allocation structure | |
1219 * half duplex mode is ignored, only valid for MS class 19 to 29 | |
1220 */ | |
1221 /* | |
1222 * TBF STARTING TIME for fixed allocation structure | |
1223 */ | |
1224 if(d_ts_reconfig->f_alloc_re.tbf_s_time.v_abs) | |
1225 { | |
1226 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_abs(&d_ts_reconfig->f_alloc_re.tbf_s_time.abs); | |
1227 } | |
1228 else if (d_ts_reconfig->f_alloc_re.tbf_s_time.v_rel) | |
1229 { | |
1230 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_rel(grr_data->dl_fn, | |
1231 d_ts_reconfig->f_alloc_re.tbf_s_time.rel); | |
1232 } | |
1233 else | |
1234 { /* this shall never happen */ | |
1235 ptr2prim_i->p_tbf_start.fn = (grr_data->dl_fn+13)%FN_MAX; | |
1236 TRACE_ERROR("NO STARTING TIME IN FIXED ALLOCATION!!"); | |
1237 } | |
1238 ptr2prim_i->p_tbf_start.tbf_start_present = 1; | |
1239 /* | |
1240 * Downlink Control Timeslot | |
1241 */ | |
1242 ptr2prim_i->p_ul_alloc.p_fixed_alloc.dl_ctrl_ts = d_ts_reconfig->f_alloc_re.dl_ctrl_ts; | |
1243 grr_data->tc.fa_ctrl.dl_ctrl_ts = d_ts_reconfig->f_alloc_re.dl_ctrl_ts; | |
1244 /* | |
1245 * ALLOCATION BITMAP | |
1246 */ | |
1247 if(d_ts_reconfig->f_alloc_re.v_block_struct) | |
1248 { | |
1249 tc_calc_fa_bitmap(ptr2prim_i->p_tbf_start.fn, /*starting time of cuurent tbf*/ | |
1250 d_ts_reconfig->f_alloc_re.block_struct.bl_o_bl_per, /* blocks or block periods*/ | |
1251 d_ts_reconfig->f_alloc_re.block_struct.a_map_len, /* bitmap length*/ | |
1252 d_ts_reconfig->f_alloc_re.block_struct.alloc_map, /* ptr to alloc struct*/ | |
1253 &ptr2prim_i->p_ul_alloc.p_fixed_alloc); /* ptr to fix sttruct*/ | |
1254 } | |
1255 else if(d_ts_reconfig->f_alloc_re.v_alloc_map) | |
1256 { | |
1257 tc_calc_fa_bitmap(ptr2prim_i->p_tbf_start.fn, /*starting time of cuurent tbf*/ | |
1258 0, /* blocks : default*/ | |
1259 d_ts_reconfig->f_alloc_re.c_alloc_map, /* bitmap length*/ | |
1260 d_ts_reconfig->f_alloc_re.alloc_map, /* ptr to alloc struct*/ | |
1261 &ptr2prim_i->p_ul_alloc.p_fixed_alloc); /* ptr to fix sttruct*/ | |
1262 } | |
1263 /* | |
1264 * check final allocation | |
1265 */ | |
1266 grr_data->tc.fa_ctrl.current_alloc.final_alloc = d_ts_reconfig->f_alloc_re.final_alloc; | |
1267 } | |
1268 else if ( d_ul_ack->msg_type EQ D_UL_ACK_c) | |
1269 { | |
1270 /* | |
1271 * Timing Advance in packet uplink ack/nack with fixed allocation | |
1272 */ | |
1273 if(d_ul_ack->gprs_ul_ack_nack_info.v_pta) | |
1274 { | |
1275 grr_handle_ta ( d_ul_ack->gprs_ul_ack_nack_info.pta.v_ta_value, | |
1276 d_ul_ack->gprs_ul_ack_nack_info.pta.ta_value, | |
1277 d_ul_ack->gprs_ul_ack_nack_info.pta.v_ta_index_tn, | |
1278 d_ul_ack->gprs_ul_ack_nack_info.pta.ta_index_tn.ta_index, | |
1279 d_ul_ack->gprs_ul_ack_nack_info.pta.ta_index_tn.ta_tn, | |
1280 0xFF, | |
1281 0, | |
1282 0, | |
1283 &ptr2prim_i->p_timing_advance); | |
1284 } | |
1285 else | |
1286 { | |
1287 grr_handle_ta ( 0, | |
1288 0, | |
1289 0xFF, | |
1290 0, | |
1291 0, | |
1292 0xFF, | |
1293 0, | |
1294 0, | |
1295 &ptr2prim_i->p_timing_advance); | |
1296 } | |
1297 | |
1298 /* | |
1299 * mac mode | |
1300 */ | |
1301 ptr2prim_i->mac_mode = FA; | |
1302 /* | |
1303 * uplink allocation structure | |
1304 */ | |
1305 | |
1306 /*no change, therefore take from database*/ | |
1307 ptr2prim_i->p_ul_alloc.ul_tfi = grr_data->uplink_tbf.tfi; | |
1308 ptr2prim_i->p_ul_alloc.ts_mask = grr_data->uplink_tbf.ts_usage; | |
1309 /* | |
1310 * fixed allocation structure | |
1311 * half duplex mode is ignored, only valid for MS class 19 to 29 | |
1312 */ | |
1313 /* | |
1314 * TBF STARTING TIME for fixed allocation structure | |
1315 */ | |
1316 if(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) | |
1317 { | |
1318 if(d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.tbf_s_time.v_abs) | |
1319 { | |
1320 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_abs(&d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.tbf_s_time.abs); | |
1321 } | |
1322 else if (d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.tbf_s_time.v_rel) | |
1323 { | |
1324 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_rel(grr_data->dl_fn, | |
1325 d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.tbf_s_time.rel); | |
1326 } | |
1327 else | |
1328 { /* this shall never happen */ | |
1329 ptr2prim_i->p_tbf_start.fn = (grr_data->dl_fn+13)%FN_MAX; | |
1330 TRACE_ERROR("NO STARTING TIME IN FIXED ALLOCATION!! struct problem"); | |
1331 } | |
1332 } | |
1333 else | |
1334 { /* this shall never happen */ | |
1335 ptr2prim_i->p_tbf_start.fn = (grr_data->dl_fn+13)%FN_MAX; | |
1336 TRACE_ERROR("NO STARTING TIME IN FIXED ALLOCATION!!"); | |
1337 } | |
1338 ptr2prim_i->p_tbf_start.tbf_start_present = 1; | |
1339 | |
1340 | |
1341 /* | |
1342 * Downlink Control Timeslot, take from database | |
1343 */ | |
1344 ptr2prim_i->p_ul_alloc.p_fixed_alloc.dl_ctrl_ts = grr_data->tc.fa_ctrl.dl_ctrl_ts; | |
1345 /* | |
1346 * ALLOCATION BITMAP | |
1347 */ | |
1348 if(d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.v_block_struct) | |
1349 { | |
1350 tc_calc_fa_bitmap(ptr2prim_i->p_tbf_start.fn, /* starting time of cuurent tbf*/ | |
1351 d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.block_struct.bl_o_bl_per,/* blocks or block periods*/ | |
1352 d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.block_struct.a_map_len, /* bitmap length */ | |
1353 d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.block_struct.alloc_map, /* ptr to alloc struct*/ | |
1354 &ptr2prim_i->p_ul_alloc.p_fixed_alloc); /* ptr to fix sttruct*/ | |
1355 } | |
1356 else if(d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.v_alloc_map) | |
1357 { | |
1358 tc_calc_fa_bitmap(ptr2prim_i->p_tbf_start.fn, /*starting time of cuurent tbf*/ | |
1359 0, /* blocks : default*/ | |
1360 d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.c_alloc_map, /* bitmap length*/ | |
1361 d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.alloc_map, /* ptr to alloc struct*/ | |
1362 &ptr2prim_i->p_ul_alloc.p_fixed_alloc); /* ptr to fix sttruct*/ | |
1363 } | |
1364 /* | |
1365 * check final allocation | |
1366 */ | |
1367 grr_data->tc.fa_ctrl.current_alloc.final_alloc = d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.final_alloc; | |
1368 } | |
1369 else | |
1370 { | |
1371 TRACE_ERROR ( "Wrong message type in _decodedCtrlMsg" ); | |
1372 } | |
1373 | |
1374 if(ptr2prim_i->p_tbf_start.tbf_start_present) | |
1375 grr_data->uplink_tbf.tbf_start_fn = ptr2prim_i->p_tbf_start.fn; | |
1376 else | |
1377 grr_data->uplink_tbf.tbf_start_fn = CGRLC_STARTING_TIME_NOT_PRESENT; | |
1378 | |
1379 grr_data->uplink_tbf.st_tfi = ptr2prim_i->p_ul_alloc.ul_tfi; | |
1380 | |
1381 | |
1382 return; | |
1383 } /* tc_set_fa_assignment() */ | |
1384 | |
1385 | |
1386 /* | |
1387 +------------------------------------------------------------------------------ | |
1388 | Function : tc_set_dl_assignment | |
1389 +------------------------------------------------------------------------------ | |
1390 | Description : This function sets some parameter of T_MPHP_ASSIGNMENT_REQ is | |
1391 | case of downlink allocation | |
1392 | | |
1393 | Parameters : ptr2prim_i - ptr to MPHP_ASSIGNMENT_REQ | |
1394 | | |
1395 +------------------------------------------------------------------------------ | |
1396 */ | |
1397 LOCAL void tc_set_dl_assignment (T_MPHP_ASSIGNMENT_REQ * ptr2prim_i) | |
1398 { | |
1399 MCAST(d_dl_assign, D_DL_ASSIGN); /* T_D_DL_ASSIGN */ | |
1400 MCAST(d_ts_reconfig,D_TS_RECONFIG); | |
1401 | |
1402 TRACE_FUNCTION( "tc_set_dl_assignment" ); | |
1403 if( d_dl_assign->msg_type EQ D_DL_ASSIGN_c) | |
1404 { | |
1405 /* | |
1406 * timing advance | |
1407 */ | |
1408 grr_handle_ta ( d_dl_assign->pta.v_ta_value, | |
1409 d_dl_assign->pta.ta_value, | |
1410 0xFF, | |
1411 0, | |
1412 0, | |
1413 d_dl_assign->pta.v_ta_index_tn, | |
1414 d_dl_assign->pta.ta_index_tn.ta_index, | |
1415 d_dl_assign->pta.ta_index_tn.ta_tn, | |
1416 &ptr2prim_i->p_timing_advance); | |
1417 /* | |
1418 * TBF starting time | |
1419 */ | |
1420 | |
1421 if(d_dl_assign->pda_trnc_grp.v_tbf_s_time) | |
1422 { | |
1423 ptr2prim_i->p_tbf_start.tbf_start_present = 1; | |
1424 if(d_dl_assign->pda_trnc_grp.tbf_s_time.v_abs) | |
1425 { | |
1426 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_abs(&d_dl_assign->pda_trnc_grp.tbf_s_time.abs); | |
1427 } | |
1428 else if (d_dl_assign->pda_trnc_grp.tbf_s_time.v_rel) | |
1429 { | |
1430 ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_rel(grr_data->dl_fn, | |
1431 d_dl_assign->pda_trnc_grp.tbf_s_time.rel); | |
1432 } | |
1433 else | |
1434 { /* this shall never happen */ | |
1435 ptr2prim_i->p_tbf_start.fn = grr_data->dl_fn%FN_MAX; | |
1436 TRACE_ERROR("DL v_start_tbf but either rel nor abs tbf included"); | |
1437 } | |
1438 } | |
1439 else if(grr_data->l1_del_tbf_start_fn NEQ GRR_INVALID_FN) | |
1440 { | |
1441 ptr2prim_i->p_tbf_start.tbf_start_present = 1; | |
1442 ptr2prim_i->p_tbf_start.fn = grr_data->l1_del_tbf_start_fn; | |
1443 } | |
1444 else | |
1445 { | |
1446 ptr2prim_i->p_tbf_start.tbf_start_present = 0; | |
1447 } | |
1448 | |
1449 | |
1450 if(d_dl_assign->v_bts_pwr_ctrl) | |
1451 { | |
1452 ptr2prim_i->p_dl_power.p0 = d_dl_assign->bts_pwr_ctrl.p0; | |
1453 ptr2prim_i->p_dl_power.bts_pwr_ctl_mode = d_dl_assign->bts_pwr_ctrl.mode; | |
1454 ptr2prim_i->p_dl_power.pr_mode = d_dl_assign->bts_pwr_ctrl.pr_mode; | |
1455 } | |
1456 else | |
1457 { | |
1458 ptr2prim_i->p_dl_power.p0 = 0xff; | |
1459 } | |
1460 /* | |
1461 * mac mode | |
1462 */ | |
1463 ptr2prim_i->mac_mode = d_dl_assign->mac_mode; | |
1464 | |
1465 /* | |
1466 * downlink allocation structure | |
1467 */ | |
1468 if(d_dl_assign->pda_trnc_grp.v_dl_tfi_assign) | |
1469 { | |
1470 ptr2prim_i->p_dl_alloc.dl_tfi = d_dl_assign->pda_trnc_grp.dl_tfi_assign; | |
1471 } | |
1472 else | |
1473 { | |
1474 ptr2prim_i->p_dl_alloc.dl_tfi = grr_data->downlink_tbf.tfi; | |
1475 } | |
1476 ptr2prim_i->p_dl_alloc.ts_mask = d_dl_assign->ts_alloc; | |
1477 | |
1478 } | |
1479 else if ( d_ts_reconfig->msg_type EQ D_TS_RECONFIG_c) | |
1480 { | |
1481 /* TS Reconfigure allways contains ul assign -> TBF starting time | |
1482 * is handled there | |
1483 */ | |
1484 if(d_ts_reconfig->v_dl_tfi) | |
1485 { | |
1486 ptr2prim_i->p_dl_alloc.dl_tfi = d_ts_reconfig->dl_tfi; | |
1487 } | |
1488 else | |
1489 { | |
1490 ptr2prim_i->p_dl_alloc.dl_tfi = grr_data->downlink_tbf.tfi; | |
1491 } | |
1492 ptr2prim_i->p_dl_alloc.ts_mask = grr_data->downlink_tbf.ts_usage; | |
1493 /* | |
1494 * timing advance | |
1495 */ | |
1496 grr_handle_ta ( d_ts_reconfig->gpta.v_ta_value, | |
1497 d_ts_reconfig->gpta.ta_value, | |
1498 d_ts_reconfig->gpta.v_ul_ta_index, | |
1499 d_ts_reconfig->gpta.ul_ta_index, | |
1500 d_ts_reconfig->gpta.ul_ta_tn, | |
1501 d_ts_reconfig->gpta.v_dl_ta_index, | |
1502 d_ts_reconfig->gpta.dl_ta_index, | |
1503 d_ts_reconfig->gpta.dl_ta_tn, | |
1504 &ptr2prim_i->p_timing_advance); | |
1505 } | |
1506 else | |
1507 { | |
1508 TRACE_ERROR ( "Wrong message type in _decodedCtrlMsg" ); | |
1509 } | |
1510 | |
1511 | |
1512 if(ptr2prim_i->p_tbf_start.tbf_start_present) | |
1513 grr_data->downlink_tbf.tbf_start_fn = ptr2prim_i->p_tbf_start.fn; | |
1514 else | |
1515 grr_data->downlink_tbf.tbf_start_fn = CGRLC_STARTING_TIME_NOT_PRESENT; | |
1516 | |
1517 grr_data->downlink_tbf.st_tfi = ptr2prim_i->p_dl_alloc.dl_tfi; | |
1518 grr_data->downlink_tbf.polling_bit = 0xFF; | |
1519 | |
1520 | |
1521 | |
1522 return; | |
1523 } /* tc_set_dl_assignment() */ | |
1524 | |
1525 | |
1526 | |
1527 /*==== PUBLIC FUNCTIONS =====================================================*/ | |
1528 | |
1529 | |
1530 | |
1531 /* | |
1532 +------------------------------------------------------------------------------ | |
1533 | Function : tc_gen_rand | |
1534 +------------------------------------------------------------------------------ | |
1535 | Description : This function generates a random value between db.prach.s | |
1536 | and (db.prach.tx_int -1) | |
1537 | | |
1538 | Parameters : void | |
1539 | | |
1540 +------------------------------------------------------------------------------ | |
1541 */ | |
1542 GLOBAL USHORT tc_gen_rand ( void ) | |
1543 { | |
1544 USHORT result ; | |
1545 UBYTE i; | |
1546 TRACE_FUNCTION( "tc_gen_rand" ); | |
1547 | |
1548 /* | |
1549 * the "-1" defined in ETS 04.60 will be done by tc_random_value() | |
1550 * | |
1551 */ | |
1552 i = tx_int_table[psc_db->prach.tx_int]; | |
1553 | |
1554 result = (USHORT)grr_random_value (S_T_RND_INDEX, i ); | |
1555 | |
1556 result += s_table[psc_db->prach.s_prach]; | |
1557 | |
1558 #ifndef _TARGET_ | |
1559 TRACE_EVENT_P2("S, S+1 ..:%d tx_init:%d",result, i); | |
1560 #endif /* _TARGET_ */ | |
1561 | |
1562 return (result); | |
1563 | |
1564 } /* tc_gen_rand() */ | |
1565 | |
1566 | |
1567 | |
1568 /* | |
1569 +------------------------------------------------------------------------------ | |
1570 | Function : tc_calc_req | |
1571 +------------------------------------------------------------------------------ | |
1572 | Description : The function tc_calc_req() generate the message | |
1573 | Packet Access Request. | |
1574 | | |
1575 | Parameters : void | |
1576 | | |
1577 +------------------------------------------------------------------------------ | |
1578 */ | |
1579 GLOBAL USHORT tc_calc_req ( void ) | |
1580 { | |
1581 USHORT channel_request_data = 0; | |
1582 | |
1583 TRACE_FUNCTION( "tc_calc_req" ); | |
1584 | |
1585 switch(psc_db->gprs_cell_opt.ab_type) | |
1586 { | |
1587 case AB_8_BIT: | |
1588 switch(grr_data->uplink_tbf.access_type) | |
1589 { | |
1590 case CGRLC_AT_ONE_PHASE: | |
1591 channel_request_data = tc_one_phase_mask_8bit(); | |
1592 channel_request_data |= ((grr_get_gprs_ms_class( )-1)<<2); | |
1593 break; | |
1594 case CGRLC_AT_SHORT_ACCESS: | |
1595 channel_request_data = tc_short_access_mask_8bit(); | |
1596 channel_request_data |= ((grr_data->uplink_tbf.nr_blocks-1)<<3); | |
1597 break; | |
1598 case CGRLC_AT_TWO_PHASE: | |
1599 channel_request_data=tc_two_phase_mask_8bit(); | |
1600 break; | |
1601 case CGRLC_AT_PAGE_RESPONSE: | |
1602 channel_request_data=tc_page_response_mask_8bit(); | |
1603 break; | |
1604 case CGRLC_AT_CELL_UPDATE: | |
1605 channel_request_data=tc_cell_update_mask_8bit(); | |
1606 break; | |
1607 case CGRLC_AT_MM_PROCEDURE: | |
1608 channel_request_data=tc_mm_procedure_mask_8bit(); | |
1609 break; | |
1610 case CGRLC_AT_SINGLE_BLOCK: | |
1611 channel_request_data=tc_single_block_mask_8bit(); | |
1612 break; | |
1613 default: | |
1614 break; | |
1615 } | |
1616 break; | |
1617 | |
1618 case AB_11_BIT: | |
1619 switch(grr_data->uplink_tbf.access_type) | |
1620 { | |
1621 case CGRLC_AT_ONE_PHASE: | |
1622 channel_request_data=tc_one_phase_mask_11bit(); | |
1623 channel_request_data |= ((grr_get_gprs_ms_class( )-1)<<5); | |
1624 channel_request_data |= (grr_data->uplink_tbf.prio<<3); | |
1625 break; | |
1626 case CGRLC_AT_SHORT_ACCESS: | |
1627 channel_request_data=tc_short_access_mask_11bit(); | |
1628 channel_request_data |= (grr_data->uplink_tbf.prio<<3); | |
1629 channel_request_data |= ((grr_data->uplink_tbf.nr_blocks-1)<<5); | |
1630 break; | |
1631 case CGRLC_AT_TWO_PHASE: | |
1632 channel_request_data=tc_two_phase_mask_11bit(); | |
1633 channel_request_data |= (grr_data->uplink_tbf.prio<<3); | |
1634 break; | |
1635 case CGRLC_AT_PAGE_RESPONSE: | |
1636 channel_request_data=tc_page_response_mask_11bit(); | |
1637 break; | |
1638 case CGRLC_AT_CELL_UPDATE: | |
1639 channel_request_data=tc_cell_update_mask_11bit(); | |
1640 break; | |
1641 case CGRLC_AT_MM_PROCEDURE: | |
1642 channel_request_data=tc_mm_procedure_mask_11bit(); | |
1643 break; | |
1644 case CGRLC_AT_SINGLE_BLOCK: | |
1645 channel_request_data=tc_single_block_mask_11bit(); | |
1646 break; | |
1647 default: | |
1648 channel_request_data = 0; | |
1649 break; | |
1650 } | |
1651 channel_request_data = grr_convert_11bit_2_etsi(channel_request_data); | |
1652 TRACE_EVENT_P1("11 bit Channel Request: 0x%X", channel_request_data); | |
1653 break; | |
1654 default: | |
1655 break; | |
1656 } | |
1657 return(channel_request_data); | |
1658 | |
1659 } /* tc_calc_req() */ | |
1660 | |
1661 | |
1662 | |
1663 /* | |
1664 +------------------------------------------------------------------------------ | |
1665 | Function : tc_check_p_level | |
1666 +------------------------------------------------------------------------------ | |
1667 | Description : The function tc_check_p_level() checks the p-level for the | |
1668 | PDU's radio priority aigainst a random value and returns | |
1669 | wheather to send the random access or to continue with | |
1670 | calculating. | |
1671 | | |
1672 | Parameters : void | |
1673 | | |
1674 +------------------------------------------------------------------------------ | |
1675 */ | |
1676 GLOBAL T_CHECK_P_LEVEL tc_check_p_level ( void ) | |
1677 { | |
1678 UBYTE p_level,i; | |
1679 T_CHECK_P_LEVEL result; | |
1680 TRACE_FUNCTION( "tc_check_p_level" ); | |
1681 | |
1682 /* | |
1683 * get value between 0 and 15 | |
1684 */ | |
1685 i = (UBYTE) grr_random_value (PLEV_RND_INDEX, 16); | |
1686 | |
1687 p_level = psc_db->prach.pers_lev.plev[grr_data->uplink_tbf.prio]; | |
1688 | |
1689 if(p_level EQ 15) | |
1690 { | |
1691 /* | |
1692 * transmission in every case forbitten, because refer to ETS the value 0xf | |
1693 * have to be interpreted as 16 and i is in every case more little (0 <= i <= 15). | |
1694 * This case should be avoided (dead lock!) and have to be checked | |
1695 * in tc_start_access() | |
1696 */ | |
1697 TRACE_ERROR("unexpected persistence_level_value"); | |
1698 result = C_P_LEVEL_DO_NOT_SEND; | |
1699 } | |
1700 else | |
1701 { | |
1702 result = ( (i >= p_level) ? C_P_LEVEL_SEND : C_P_LEVEL_DO_NOT_SEND ); | |
1703 } | |
1704 | |
1705 return( result ); | |
1706 | |
1707 } /* tc_check_p_level() */ | |
1708 | |
1709 | |
1710 | |
1711 /* | |
1712 +------------------------------------------------------------------------------ | |
1713 | Function : tc_send_assign_req | |
1714 +------------------------------------------------------------------------------ | |
1715 | Description : The function tc_send_assign_req() builds MPHP_ASSIGNMENT_REQ | |
1716 | and send it. | |
1717 | | |
1718 | Parameters : tbf_type_i - type of TBF that is to activate | |
1719 | | |
1720 +------------------------------------------------------------------------------ | |
1721 */ | |
1722 GLOBAL void tc_send_assign_req ( T_TBF_TYPE tbf_type_i ) | |
1723 { | |
1724 | |
1725 TRACE_FUNCTION( "tc_send_assign_req" ); | |
1726 { | |
1727 T_MPHP_ASSIGNMENT_REQ * ptr2prim;//=NULL; | |
1728 | |
1729 ptr2prim=tc_set_freq(); | |
1730 | |
1731 grr_set_tbf_cfg_req_param( ptr2prim ); | |
1732 | |
1733 switch( tbf_type_i ) | |
1734 { | |
1735 case CGRLC_TBF_MODE_DL: | |
1736 ptr2prim->assign_cmd = DL_ASSIGNMENT; | |
1737 tc_set_dl_assignment(ptr2prim); | |
1738 break; | |
1739 case CGRLC_TBF_MODE_UL: | |
1740 ptr2prim->assign_cmd = UL_ASSIGNMENT; | |
1741 if(grr_data->uplink_tbf.mac_mode EQ DA) | |
1742 tc_set_da_assignment(ptr2prim); | |
1743 else | |
1744 tc_set_fa_assignment(ptr2prim); | |
1745 break; | |
1746 case CGRLC_TBF_MODE_DL_UL: | |
1747 ptr2prim->assign_cmd = UL_DL_ASSIGNMENT; | |
1748 if(grr_data->uplink_tbf.mac_mode EQ DA) | |
1749 tc_set_da_assignment(ptr2prim); | |
1750 else | |
1751 tc_set_fa_assignment(ptr2prim); | |
1752 tc_set_dl_assignment(ptr2prim); | |
1753 break; | |
1754 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
1755 case CGRLC_TBF_MODE_2PA: | |
1756 ptr2prim->assign_cmd = UL_TP_ACCESS; | |
1757 tc_set_fa_assignment(ptr2prim); | |
1758 break; | |
1759 #endif | |
1760 default: | |
1761 break; | |
1762 } /* switch (tbf_type_i) */ | |
1763 PSEND(hCommL1,ptr2prim); | |
1764 | |
1765 } | |
1766 } /* tc_send_assign_req() */ | |
1767 | |
1768 | |
1769 | |
1770 /* | |
1771 +------------------------------------------------------------------------------ | |
1772 | Function : tc_send_tbf_rel | |
1773 +------------------------------------------------------------------------------ | |
1774 | Description : The function tc_send_tbf_rel() builds MPHP_TBF_RELEASE_REQ | |
1775 | and send it. | |
1776 | | |
1777 | Parameters : TBP-Type - that have to be deleted | |
1778 | | |
1779 +------------------------------------------------------------------------------ | |
1780 */ | |
1781 GLOBAL void tc_send_tbf_rel ( T_TBF_TYPE tbf_i ) | |
1782 { | |
1783 UBYTE dummy = grr_data->tc.num_of_rels_running; | |
1784 | |
1785 TRACE_FUNCTION( "tc_send_tbf_rel" ); | |
1786 | |
1787 tc_prepare_send_tbf_release_req( tbf_i ); | |
1788 | |
1789 { | |
1790 T_RELEASE_STATE rel_state= REL_PERFORMED; | |
1791 | |
1792 if(dummy NEQ grr_data->tc.num_of_rels_running) | |
1793 { | |
1794 rel_state = REL_RUNNING; | |
1795 } | |
1796 sig_tc_ctrl_rel_state(rel_state); | |
1797 } | |
1798 | |
1799 | |
1800 } /* tc_send_tbf_rel() */ | |
1801 | |
1802 | |
1803 | |
1804 /* | |
1805 +------------------------------------------------------------------------------ | |
1806 | Function : tc_send_pdch_rel | |
1807 +------------------------------------------------------------------------------ | |
1808 | Description : The function tc_send_pdch_rel() builds MPHP_PDCH_RELEASE_REQ | |
1809 | and send it. | |
1810 | | |
1811 | Parameters : void | |
1812 | | |
1813 +------------------------------------------------------------------------------ | |
1814 */ | |
1815 GLOBAL void tc_send_pdch_rel ( UBYTE ts_available ) | |
1816 { | |
1817 PALLOC(mphp_pdch_release_req,MPHP_PDCH_RELEASE_REQ); | |
1818 | |
1819 TRACE_FUNCTION( "tc_send_pdch_rel" ); | |
1820 | |
1821 mphp_pdch_release_req->assign_id = 0; | |
1822 mphp_pdch_release_req->ts_mask = ts_available; | |
1823 PSEND(hCommL1,mphp_pdch_release_req); | |
1824 | |
1825 } /* tc_send_pdch_rel() */ | |
1826 | |
1827 | |
1828 | |
1829 /* | |
1830 +------------------------------------------------------------------------------ | |
1831 | Function : tc_abort_tbf | |
1832 +------------------------------------------------------------------------------ | |
1833 | Description : The function tc_abort_tbf() stops a TBF. | |
1834 | | |
1835 | Parameters : tbf_i - TBF type to abort | |
1836 | | |
1837 +------------------------------------------------------------------------------ | |
1838 */ | |
1839 GLOBAL void tc_abort_tbf ( T_TBF_TYPE tbf_i ) | |
1840 { | |
1841 | |
1842 TRACE_FUNCTION( "tc_abort_tbf" ); | |
1843 | |
1844 switch( tbf_i ) | |
1845 { | |
1846 case CGRLC_TBF_MODE_NULL: | |
1847 TRACE_EVENT("NULL TBF active: check if tbf starting time is running"); | |
1848 tc_cgrlc_ul_tbf_res ( CGRLC_TBF_MODE_ACCESS_FAILED, CGRLC_PRIM_STATUS_NULL ); | |
1849 break; | |
1850 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
1851 case CGRLC_TBF_MODE_2PA: | |
1852 tc_send_tbf_rel(tbf_i); | |
1853 tc_cgrlc_tbf_rel_req(tbf_i,CGRLC_TBF_REL_ABNORMAL,CGRLC_STARTING_TIME_NOT_PRESENT); | |
1854 tc_deactivate_tbf(tbf_i); | |
1855 break; | |
1856 #endif | |
1857 case CGRLC_TBF_MODE_UL: | |
1858 tc_send_tbf_rel(tbf_i); | |
1859 tc_cgrlc_tbf_rel_req(tbf_i,CGRLC_TBF_REL_ABNORMAL,CGRLC_STARTING_TIME_NOT_PRESENT); | |
1860 tc_deactivate_tbf(tbf_i); | |
1861 break; | |
1862 case CGRLC_TBF_MODE_DL: | |
1863 tc_send_tbf_rel(tbf_i); | |
1864 tc_cgrlc_tbf_rel_req(tbf_i,CGRLC_TBF_REL_ABNORMAL,CGRLC_STARTING_TIME_NOT_PRESENT); | |
1865 tc_deactivate_tbf(tbf_i); | |
1866 break; | |
1867 case CGRLC_TBF_MODE_DL_UL: | |
1868 tc_send_tbf_rel(tbf_i); | |
1869 tc_cgrlc_tbf_rel_req(tbf_i,CGRLC_TBF_REL_ABNORMAL,CGRLC_STARTING_TIME_NOT_PRESENT); | |
1870 tc_deactivate_tbf(tbf_i); | |
1871 break; | |
1872 default: | |
1873 TRACE_ERROR ( "tc_abort_tbf: TBF type is invalid" ); | |
1874 break; | |
1875 } | |
1876 } /* tc_abort_tbf() */ | |
1877 | |
1878 | |
1879 | |
1880 | |
1881 | |
1882 /* | |
1883 +------------------------------------------------------------------------------ | |
1884 | Function : tc_build_res_req | |
1885 +------------------------------------------------------------------------------ | |
1886 | Description : The function tc_build_res_req() builds Packet Resource Request. | |
1887 | | |
1888 | Parameters : reason_i - the reason for building that packet resouce | |
1889 | reallocation | |
1890 | src_info_i - indicates where to get the carrier information | |
1891 | regarding the assigned TBF | |
1892 | | |
1893 +------------------------------------------------------------------------------ | |
1894 */ | |
1895 GLOBAL void tc_build_res_req (T_U_RESOURCE_REQ *ptr2res_req, | |
1896 T_REASON_BUILD reason_i, | |
1897 T_SRC_TBF_INFO src_info_i ) | |
1898 { | |
1899 UBYTE change_mark; | |
1900 | |
1901 TRACE_FUNCTION( "tc_build_res_req" ); | |
1902 | |
1903 | |
1904 memset(ptr2res_req,0,sizeof(T_U_RESOURCE_REQ) ); | |
1905 | |
1906 /* processing of messsage type */ | |
1907 ptr2res_req->msg_type = U_RESOURCE_REQ_c; | |
1908 | |
1909 /* processing of change mark */ | |
1910 if( grr_is_pbcch_present( ) ) | |
1911 { | |
1912 change_mark = psc_db->psi2_params.psi2_change_mark; | |
1913 } | |
1914 else | |
1915 { | |
1916 change_mark = psc_db->psi13_params.si13_change_mark; | |
1917 } | |
1918 | |
1919 if( change_mark EQ NOT_SET ) | |
1920 { | |
1921 ptr2res_req->v_ma_ch_mark = 0; | |
1922 } | |
1923 else | |
1924 { | |
1925 ptr2res_req->v_ma_ch_mark = 1; | |
1926 ptr2res_req->ma_ch_mark = change_mark; | |
1927 } | |
1928 | |
1929 | |
1930 if(reason_i EQ R_BUILD_2PHASE_ACCESS) | |
1931 { | |
1932 /* 1 - processing of ACCESS_TYPE */ | |
1933 ptr2res_req->v_access_type = 1; | |
1934 ptr2res_req->access_type = TWO_PHASE; | |
1935 | |
1936 /* 2 - processing of global TFI and TLLI */ | |
1937 ptr2res_req->flag = 1; | |
1938 ptr2res_req->v_glob_tfi = 0; | |
1939 ptr2res_req->v_tlli_value = 1; | |
1940 | |
1941 grr_set_buf_tlli( &ptr2res_req->tlli_value, grr_data->db.ms_id.new_tlli ); | |
1942 | |
1943 /* 3 - processing of radio access capabilities */ | |
1944 if( rr_csf_get_radio_access_capability( &ptr2res_req->ra_cap ) EQ 0 ) | |
1945 { | |
1946 ptr2res_req->v_ra_cap = TRUE; | |
1947 } | |
1948 else | |
1949 { | |
1950 ptr2res_req->v_ra_cap = FALSE; | |
1951 | |
1952 TRACE_ERROR( "tc_build_res_req: radio access capabilities invalid" ); | |
1953 } | |
1954 /* 4 - processing of channel request description */ | |
1955 ptr2res_req->chan_req_des.peak_thr_class = (UBYTE) grr_data->uplink_tbf.peak; | |
1956 ptr2res_req->chan_req_des.radio_prio = grr_data->uplink_tbf.prio; | |
1957 if(grr_data->uplink_tbf.prim_type EQ CGRLC_LLC_PRIM_TYPE_UNITDATA_REQ) | |
1958 { | |
1959 ptr2res_req->chan_req_des.rlc_mode = CGRLC_RLC_MODE_UACK; | |
1960 } | |
1961 else | |
1962 { | |
1963 ptr2res_req->chan_req_des.rlc_mode = CGRLC_RLC_MODE_ACK; | |
1964 } | |
1965 ptr2res_req->chan_req_des.llc_pdu_type = LLC_NOT_ACK; | |
1966 ptr2res_req->chan_req_des.rlc_octet_cnt = grr_data->uplink_tbf.rlc_oct_cnt; | |
1967 | |
1968 /* 5 - processing of signal variance */ | |
1969 ptr2res_req->v_signvar = FALSE; | |
1970 } | |
1971 | |
1972 /* processing of C value */ | |
1973 { | |
1974 ptr2res_req->c_value = meas_c_get_value( ); | |
1975 } | |
1976 | |
1977 /* processing of relative interference levels */ | |
1978 { | |
1979 T_p_frequency_par freq_par; | |
1980 T_MEAS_IM_CARRIER ma; | |
1981 | |
1982 switch( src_info_i ) | |
1983 { | |
1984 case( SRC_TBF_INFO_RE_ASSIGN ): | |
1985 case( SRC_TBF_INFO_IMM_ASSIGN ): | |
1986 case( SRC_TBF_INFO_UL_ASSIGN ): | |
1987 grr_set_freq_par( &freq_par ); | |
1988 meas_im_set_carrier( &ma, &freq_par ); | |
1989 break; | |
1990 | |
1991 default: | |
1992 TRACE_ASSERT( src_info_i EQ SRC_TBF_INFO_RE_ASSIGN OR | |
1993 src_info_i EQ SRC_TBF_INFO_IMM_ASSIGN OR | |
1994 src_info_i EQ SRC_TBF_INFO_UL_ASSIGN ); | |
1995 break; | |
1996 } | |
1997 | |
1998 meas_im_get_rel_i_level( &ma, &ptr2res_req->ilev ); | |
1999 } | |
2000 | |
2001 #ifdef REL99 | |
2002 ptr2res_req->v_release_99_str_prr = FALSE; | |
2003 ptr2res_req->release_99_str_prr.flag = 0; | |
2004 ptr2res_req->release_99_str_prr.flag2 = 0; | |
2005 ptr2res_req->release_99_str_prr.v_pfi = 0; | |
2006 ptr2res_req->release_99_str_prr.add_ms_rac = 0; | |
2007 ptr2res_req->release_99_str_prr.retrans_of_prr = 0; | |
2008 #endif | |
2009 | |
2010 } /* tc_build_res_req() */ | |
2011 | |
2012 | |
2013 /* | |
2014 +------------------------------------------------------------------------------ | |
2015 | Function : tc_eval_pdch_rel | |
2016 +------------------------------------------------------------------------------ | |
2017 | Description : The function tc_eval_pdch_rel() evaluate a | |
2018 | Packet PDCH Release. | |
2019 | | |
2020 | Parameters : slot_i - the slot where the message was received | |
2021 | | |
2022 +------------------------------------------------------------------------------ | |
2023 */ | |
2024 GLOBAL T_EVAL_PDCH_REL tc_eval_pdch_rel ( UBYTE slot_i ) | |
2025 { | |
2026 MCAST(d_pdch_release,D_PDCH_RELEASE); /* T_D_PDCH_RELEASE */ | |
2027 | |
2028 UBYTE mask,help=0xFF, help2=0xFF; | |
2029 T_EVAL_PDCH_REL result=E_PDCH_REL_NULL; | |
2030 | |
2031 TRACE_FUNCTION( "tc_eval_pdch_rel" ); | |
2032 | |
2033 if(!d_pdch_release->v_ts_available) | |
2034 { | |
2035 mask = 0x80; | |
2036 mask >>= slot_i; | |
2037 mask ^= 0xFF; | |
2038 TRACE_EVENT_P7("NO TS PDCH REL: slot=%d ->mask=%x ul=%x st_ul=%x dl=%x st_dl=%x c_fn=%ld" | |
2039 ,slot_i | |
2040 ,mask | |
2041 ,grr_data->uplink_tbf.ts_mask | |
2042 ,grr_data->uplink_tbf.ts_usage | |
2043 ,grr_data->downlink_tbf.ts_mask | |
2044 ,grr_data->downlink_tbf.ts_usage | |
2045 , grr_data->ul_fn); | |
2046 } | |
2047 else | |
2048 { | |
2049 mask = d_pdch_release->ts_available; | |
2050 TRACE_EVENT_P7("ts PDCH REL: mask=%x ul=%x st_ul=%x dl=%x st_dl=%x c_fn=%ld" | |
2051 ,slot_i | |
2052 ,mask | |
2053 ,grr_data->uplink_tbf.ts_mask | |
2054 ,grr_data->uplink_tbf.ts_usage | |
2055 ,grr_data->downlink_tbf.ts_mask | |
2056 ,grr_data->downlink_tbf.ts_usage | |
2057 , grr_data->ul_fn); | |
2058 } | |
2059 grr_data->pdch_rel_ts_mask = mask; | |
2060 | |
2061 switch(grr_data->tbf_type) | |
2062 { | |
2063 case CGRLC_TBF_MODE_UL: | |
2064 help = grr_data->uplink_tbf.ts_mask; | |
2065 grr_data->uplink_tbf.ts_mask &= mask; | |
2066 if(!grr_data->uplink_tbf.ts_mask) | |
2067 { | |
2068 result = E_PDCH_REL_RELEASE_UL; | |
2069 } | |
2070 else if(grr_data->uplink_tbf.ts_mask NEQ help) | |
2071 { | |
2072 grr_data->uplink_tbf.nts = grr_calc_nr_of_set_bits(grr_data->uplink_tbf.ts_mask); | |
2073 result = E_PDCH_REL_RECONF; | |
2074 tc_cgrlc_ul_tbf_res(CGRLC_TBF_MODE_UL,CGRLC_PRIM_STATUS_NULL); | |
2075 } | |
2076 else | |
2077 { | |
2078 TRACE_EVENT("NO change in pdch rel for ul tbf"); | |
2079 result = E_PDCH_REL_NULL; | |
2080 } | |
2081 break; | |
2082 case CGRLC_TBF_MODE_DL: | |
2083 help = grr_data->downlink_tbf.ts_mask; | |
2084 grr_data->downlink_tbf.ts_mask &= mask; | |
2085 if(!grr_data->downlink_tbf.ts_mask) | |
2086 { | |
2087 result = E_PDCH_REL_RELEASE_DL; | |
2088 } | |
2089 else if(grr_data->downlink_tbf.ts_mask NEQ help) | |
2090 { | |
2091 grr_data->downlink_tbf.nts = grr_calc_nr_of_set_bits(grr_data->downlink_tbf.ts_mask); | |
2092 tc_cgrlc_dl_tbf_req(); | |
2093 result = E_PDCH_REL_RECONF; | |
2094 } | |
2095 else | |
2096 { | |
2097 TRACE_EVENT("NO change in pdch rel for dl tbf"); | |
2098 result = E_PDCH_REL_IGNORE; | |
2099 } | |
2100 break; | |
2101 case CGRLC_TBF_MODE_DL_UL: | |
2102 help = grr_data->uplink_tbf.ts_mask; | |
2103 help2 = grr_data->downlink_tbf.ts_mask; | |
2104 grr_data->uplink_tbf.ts_mask &= mask; | |
2105 grr_data->downlink_tbf.ts_mask &= mask; | |
2106 if( !handle_ms_cap(UL_DL_ASSIGNMENT)) | |
2107 { | |
2108 result = E_PDCH_REL_RELEASE_BOTH; | |
2109 TRACE_EVENT_P3("MS CLASS ERROR in PDCH assignment ul_mask=%x, dl_mask=%x, pdch_mask=%x", | |
2110 grr_data->uplink_tbf.ts_mask, | |
2111 grr_data->downlink_tbf.ts_mask, | |
2112 mask); | |
2113 } | |
2114 else if(!grr_data->downlink_tbf.ts_mask AND !grr_data->uplink_tbf.ts_mask) | |
2115 { | |
2116 result = E_PDCH_REL_RELEASE_BOTH; | |
2117 TRACE_EVENT_P3("rel of UL and DL ul_mask=%x, dl_mask=%x, pdch_mask=%x", | |
2118 grr_data->uplink_tbf.ts_mask, | |
2119 grr_data->downlink_tbf.ts_mask, | |
2120 mask); | |
2121 } | |
2122 else if(!grr_data->downlink_tbf.ts_mask) | |
2123 { /*DL release*/ | |
2124 if(grr_data->uplink_tbf.ts_mask EQ help) | |
2125 { /* no change for uplink*/ | |
2126 result = E_PDCH_REL_RELEASE_DL; | |
2127 TRACE_EVENT_P3("rel of DL ul_mask=%x, dl_mask=%x, pdch_mask=%x", | |
2128 grr_data->uplink_tbf.ts_mask, | |
2129 grr_data->downlink_tbf.ts_mask, | |
2130 mask); | |
2131 } | |
2132 else | |
2133 { /*uplink reconfigure*/ | |
2134 result = E_PDCH_REL_RELEASE_DL_RECONF_UL; | |
2135 grr_data->uplink_tbf.nts = grr_calc_nr_of_set_bits(grr_data->uplink_tbf.ts_mask); | |
2136 tc_cgrlc_ul_tbf_res(CGRLC_TBF_MODE_UL,CGRLC_PRIM_STATUS_NULL); | |
2137 TRACE_EVENT_P3("rel of DL, conf UL ul_mask=%x, dl_mask=%x, pdch_mask=%x", | |
2138 grr_data->uplink_tbf.ts_mask, | |
2139 grr_data->downlink_tbf.ts_mask, | |
2140 mask); | |
2141 } | |
2142 } | |
2143 else if(!grr_data->uplink_tbf.ts_mask) | |
2144 { /*UL release*/ | |
2145 if(grr_data->downlink_tbf.ts_mask EQ help2) | |
2146 { /* no change for downlink*/ | |
2147 result = E_PDCH_REL_RELEASE_UL; | |
2148 TRACE_EVENT_P3("rel of UL ul_mask=%x, dl_mask=%x, pdch_mask=%x", | |
2149 grr_data->uplink_tbf.ts_mask, | |
2150 grr_data->downlink_tbf.ts_mask, | |
2151 mask); | |
2152 } | |
2153 else | |
2154 { /*downlink reconfigure*/ | |
2155 result = E_PDCH_REL_RELEASE_UL_RECONF_DL; | |
2156 grr_data->downlink_tbf.nts = grr_calc_nr_of_set_bits(grr_data->downlink_tbf.ts_mask); | |
2157 tc_cgrlc_dl_tbf_req(); | |
2158 TRACE_EVENT_P3("rel of UL, conf DL ul_mask=%x, dl_mask=%x, pdch_mask=%x", | |
2159 grr_data->uplink_tbf.ts_mask, | |
2160 grr_data->downlink_tbf.ts_mask, | |
2161 mask); | |
2162 } | |
2163 } | |
2164 else if(grr_data->downlink_tbf.ts_mask NEQ help2) | |
2165 { /*change in DL*/ | |
2166 result = E_PDCH_REL_RECONF; | |
2167 grr_data->downlink_tbf.nts = grr_calc_nr_of_set_bits(grr_data->downlink_tbf.ts_mask); | |
2168 tc_cgrlc_dl_tbf_req(); | |
2169 if(grr_data->uplink_tbf.ts_mask EQ help) | |
2170 { /* no change for uplink*/ | |
2171 TRACE_EVENT_P3("conf of DL ul_mask=%x, dl_mask=%x, pdch_mask=%x", | |
2172 grr_data->uplink_tbf.ts_mask, | |
2173 grr_data->downlink_tbf.ts_mask, | |
2174 mask); | |
2175 } | |
2176 else | |
2177 { /*uplink reconfigure*/ | |
2178 grr_data->uplink_tbf.nts = grr_calc_nr_of_set_bits(grr_data->uplink_tbf.ts_mask); | |
2179 tc_cgrlc_ul_tbf_res(CGRLC_TBF_MODE_UL,CGRLC_PRIM_STATUS_NULL); | |
2180 TRACE_EVENT_P3("conf ofDL/UL ul_mask=%x, dl_mask=%x, pdch_mask=%x", | |
2181 grr_data->uplink_tbf.ts_mask, | |
2182 grr_data->downlink_tbf.ts_mask, | |
2183 mask); | |
2184 } | |
2185 } | |
2186 else | |
2187 { /* no change in DL*/ | |
2188 if(grr_data->uplink_tbf.ts_mask EQ help) | |
2189 { /* no change for uplink*/ | |
2190 result = E_PDCH_REL_IGNORE; | |
2191 TRACE_EVENT_P3("NO conf UL/DL ul_mask=%x, dl_mask=%x, pdch_mask=%x", | |
2192 grr_data->uplink_tbf.ts_mask, | |
2193 grr_data->downlink_tbf.ts_mask, | |
2194 mask); | |
2195 } | |
2196 else | |
2197 { /*uplink reconfigure*/ | |
2198 result = E_PDCH_REL_RECONF; | |
2199 grr_data->uplink_tbf.nts = grr_calc_nr_of_set_bits(grr_data->uplink_tbf.ts_mask); | |
2200 tc_cgrlc_ul_tbf_res(CGRLC_TBF_MODE_UL,CGRLC_PRIM_STATUS_NULL); | |
2201 TRACE_EVENT_P3("conf of UL ul_mask=%x, dl_mask=%x, pdch_mask=%x", | |
2202 grr_data->uplink_tbf.ts_mask, | |
2203 grr_data->downlink_tbf.ts_mask, | |
2204 mask); | |
2205 } | |
2206 } | |
2207 break; | |
2208 default: | |
2209 TRACE_ERROR("unknown tbf type in tc_eval_pdch_rel"); | |
2210 break; | |
2211 } | |
2212 return(result); | |
2213 | |
2214 } /* tc_eval_pdch_rel() */ | |
2215 | |
2216 | |
2217 | |
2218 /* | |
2219 +------------------------------------------------------------------------------ | |
2220 | Function : tc_eval_ul_assign | |
2221 +------------------------------------------------------------------------------ | |
2222 | Description : The function tc_eval_ul_assign() evaluates a | |
2223 | Packet Uplink Assignment. | |
2224 | | |
2225 | Parameters : void | |
2226 | | |
2227 +------------------------------------------------------------------------------ | |
2228 */ | |
2229 GLOBAL T_EVAL_UL_ASSIGN tc_eval_ul_assign ( void ) | |
2230 { | |
2231 MCAST(d_ul_assign,D_UL_ASSIGN); /* T_D_UL_ASSIGN */ | |
2232 T_EVAL_UL_ASSIGN result = E_UL_ASSIGN_NULL; | |
2233 UBYTE tx_slots = 0; | |
2234 UBYTE i,mask; | |
2235 | |
2236 T_GRR_STORE_TYPE grr_store_type = GRR_STORE_TYPE_NONE; | |
2237 | |
2238 TRACE_FUNCTION( "tc_eval_ul_assign" ); | |
2239 | |
2240 #ifdef REL99 | |
2241 if(d_ul_assign->egprs_flag) | |
2242 { | |
2243 | |
2244 TRACE_ERROR("EGPRS TBF received in UL ASSIGNMENT"); | |
2245 | |
2246 if(grr_data->tbf_type EQ CGRLC_TBF_MODE_NULL) | |
2247 { | |
2248 /* TBF is not active. Handling abnormal case | |
2249 * 7.1.4 If the mobile station has been assigned a TBF in EGPRS mode and | |
2250 * the MS does not support EGPRS, or has been assigned an MCS (e.g. 8-PSK | |
2251 * in the Uplink) that the MS does not support, the MS shall return to packet | |
2252 * idle mode and notify higher layers (TBF establishment failure) | |
2253 */ | |
2254 return E_UL_ASSIGN_ERROR_RA; | |
2255 } | |
2256 else | |
2257 { | |
2258 /* TBF is active. Handling abnormal case | |
2259 * 8.7 While a TBF is in progress, if a mobile station receives a | |
2260 * PACKET UPLINK ASSIGNMENT, PACKET UPLINK ACK/NACK or PACKET TIMESLOT RECONFIGURE | |
2261 * message with message escape bit indicating EGPRS (resp. GPRS) contents whereas | |
2262 * the current TBF mode is GPRS (resp. EGPRS), the mobile station shall ignore the | |
2263 * message. | |
2264 */ | |
2265 return E_UL_ASSIGN_IGNORE; | |
2266 } | |
2267 } | |
2268 #endif | |
2269 | |
2270 /* | |
2271 * Handle mac mode | |
2272 */ | |
2273 switch( grr_data->tbf_type ) | |
2274 { | |
2275 case CGRLC_TBF_MODE_DL: | |
2276 grr_data->uplink_tbf.ti = 0; /* contention resolution NOT required */ | |
2277 | |
2278 /*lint -fallthrough*/ | |
2279 | |
2280 case CGRLC_TBF_MODE_NULL: | |
2281 if(d_ul_assign->v_dyn_alloc_p) | |
2282 { | |
2283 if(!d_ul_assign->dyn_alloc_p.xdyn_alloc) | |
2284 grr_data->uplink_tbf.mac_mode = DA; | |
2285 else | |
2286 { | |
2287 grr_data->uplink_tbf.mac_mode = EDA; | |
2288 } | |
2289 } | |
2290 else if(d_ul_assign->v_f_alloc_ul) | |
2291 grr_data->uplink_tbf.mac_mode = FA; | |
2292 break; | |
2293 case CGRLC_TBF_MODE_UL: | |
2294 if( grr_data->uplink_tbf.mac_mode NEQ DA AND | |
2295 d_ul_assign->v_dyn_alloc_p | |
2296 ) | |
2297 { | |
2298 TRACE_ERROR("dynamic alloc received while fixed is running in uplink"); | |
2299 return E_UL_ASSIGN_ERROR_RA; | |
2300 } | |
2301 else if( grr_data->uplink_tbf.mac_mode NEQ FA AND | |
2302 d_ul_assign->v_f_alloc_ul | |
2303 ) | |
2304 { | |
2305 TRACE_ERROR("fixed alloc received while dynamic is running in uplink"); | |
2306 return E_UL_ASSIGN_ERROR_RA; | |
2307 } | |
2308 break; | |
2309 default: | |
2310 break; | |
2311 } | |
2312 grr_data->uplink_tbf.cs_mode = d_ul_assign->chan_coding_cmd; | |
2313 grr_data->uplink_tbf.tlli_cs_mode = d_ul_assign->tlli_chan_coding; | |
2314 grr_data->uplink_tbf.polling_bit = 0xFF; | |
2315 | |
2316 if(d_ul_assign->v_dyn_alloc_p) | |
2317 { | |
2318 if( grr_data->uplink_tbf.mac_mode NEQ DA) | |
2319 { | |
2320 result = E_UL_ASSIGN_ERROR_RA; | |
2321 TRACE_ERROR("dyn alloc received but diff mac mode"); | |
2322 TRACE_EVENT_P3("MAC_MODE: ms=%d, Ex.DA=%d tbf_mode=%d" | |
2323 ,grr_data->uplink_tbf.mac_mode | |
2324 ,d_ul_assign->dyn_alloc_p.xdyn_alloc | |
2325 ,grr_data->tbf_type); | |
2326 } | |
2327 else | |
2328 { | |
2329 result = E_UL_ASSIGN_DYNAMIC; | |
2330 /* SZML-TC/071*/ | |
2331 | |
2332 if (d_ul_assign->dyn_alloc_p.v_rlc_db_granted)/* close-ended TBF*/ | |
2333 { | |
2334 UBYTE data_size=20; | |
2335 | |
2336 switch( grr_data->uplink_tbf.cs_mode) | |
2337 { | |
2338 case CGRLC_CS_MODE_1: | |
2339 data_size = 20; | |
2340 break; | |
2341 case CGRLC_CS_MODE_2: | |
2342 data_size = 30; | |
2343 break; | |
2344 case CGRLC_CS_MODE_3: | |
2345 data_size = 36; | |
2346 break; | |
2347 case CGRLC_CS_MODE_4: | |
2348 data_size = 50; | |
2349 break; | |
2350 default: | |
2351 TRACE_ERROR("unknown Coding Scheme"); | |
2352 break; | |
2353 } | |
2354 data_size -= grr_data->uplink_tbf.ti*4; /* CR TLLI */ | |
2355 | |
2356 grr_data->uplink_tbf.rlc_db_granted = (d_ul_assign->dyn_alloc_p.rlc_db_granted + 9); | |
2357 | |
2358 if (grr_data->uplink_tbf.rlc_db_granted * data_size < grr_data->uplink_tbf.rlc_oct_cnt) | |
2359 /* granted rlc blocks in bytes are not enough to transmit the first pdu*/ | |
2360 { | |
2361 result = E_UL_ASSIGN_ERROR_RA; | |
2362 TRACE_EVENT_P3("granted rlc blocks are not enough to transmit the first pdu rlc_g=%ld sdu_len =%ld data_size=%d" | |
2363 ,grr_data->uplink_tbf.rlc_db_granted * data_size | |
2364 ,grr_data->uplink_tbf.rlc_oct_cnt | |
2365 ,data_size); | |
2366 return(result); | |
2367 } | |
2368 } | |
2369 else | |
2370 { | |
2371 /* | |
2372 * open ended TBF | |
2373 */ | |
2374 grr_data->uplink_tbf.rlc_db_granted = 0; | |
2375 } | |
2376 | |
2377 grr_data->uplink_tbf.ts_usage = 0; | |
2378 | |
2379 if(d_ul_assign->dyn_alloc_p.v_tn_alloc) | |
2380 { | |
2381 for(i = 0,mask = 0x80;i < 8;i++) | |
2382 { | |
2383 if(d_ul_assign->dyn_alloc_p.tn_alloc[i].v_usf) | |
2384 { | |
2385 grr_data->uplink_tbf.ts_usage |= mask; | |
2386 tx_slots++; | |
2387 } | |
2388 mask >>= 1; | |
2389 } | |
2390 } | |
2391 else if(d_ul_assign->dyn_alloc_p.v_tn_alloc_pwr) | |
2392 { | |
2393 for(i = 0,mask = 0x80;i < 8;i++) | |
2394 { | |
2395 if(d_ul_assign->dyn_alloc_p.tn_alloc_pwr.usf_array[i].v_usf_g) | |
2396 { | |
2397 | |
2398 grr_data->uplink_tbf.ts_usage |= mask; | |
2399 tx_slots++; | |
2400 } | |
2401 mask >>= 1; | |
2402 } | |
2403 | |
2404 grr_store_type = GRR_STORE_TYPE_TN_ALLOC_PWR; | |
2405 } | |
2406 grr_data->uplink_tbf.nts = tx_slots; | |
2407 } | |
2408 } | |
2409 else if(d_ul_assign->v_sin_alloc) | |
2410 { | |
2411 if( grr_data->tc.v_sb_without_tbf ) | |
2412 { | |
2413 result = E_UL_ASSIGN_SB_WITHOUT_TBF; | |
2414 } | |
2415 else | |
2416 { | |
2417 result = E_UL_ASSIGN_SB_2PHASE_ACCESS ; | |
2418 grr_data->uplink_tbf.ti = 0; | |
2419 } | |
2420 | |
2421 /* | |
2422 * estimate timeslot | |
2423 */ | |
2424 grr_data->uplink_tbf.ts_usage = (0x80 >> d_ul_assign->sin_alloc.tn); | |
2425 tx_slots=1; | |
2426 grr_data->uplink_tbf.nts = tx_slots; | |
2427 | |
2428 if(d_ul_assign->sin_alloc.v_alf_gam) | |
2429 { | |
2430 grr_store_type = GRR_STORE_TYPE_ALF_GAM; | |
2431 } | |
2432 | |
2433 /* starting time allready elapsed? */ | |
2434 if(d_ul_assign->sin_alloc.tbf_s_time.v_abs) | |
2435 { | |
2436 ULONG fn_out; | |
2437 fn_out = grr_decode_tbf_start_abs(&d_ul_assign->sin_alloc.tbf_s_time.abs); | |
2438 TRACE_EVENT_P5("eval_ul fn_out:%ld fn_in:%d %d %d data->fn:%ld", | |
2439 fn_out, | |
2440 d_ul_assign->sin_alloc.tbf_s_time.abs.t1, | |
2441 d_ul_assign->sin_alloc.tbf_s_time.abs.t2, | |
2442 d_ul_assign->sin_alloc.tbf_s_time.abs.t3, | |
2443 grr_data->dl_fn); | |
2444 if(grr_check_if_tbf_start_is_elapsed ( fn_out, grr_data->ul_fn)) | |
2445 { | |
2446 TRACE_ERROR("TBF Starting time is ELAPSED in single block allocation!"); | |
2447 TRACE_EVENT_P2("CPAP SBR TBF ST ELAPSED st=%ld c_fn=%ld ", fn_out,grr_data->ul_fn); | |
2448 result = E_UL_ASSIGN_ERROR_RA; | |
2449 } | |
2450 } | |
2451 else if(d_ul_assign->sin_alloc.tbf_s_time.v_rel AND !d_ul_assign->sin_alloc.tbf_s_time.rel) | |
2452 { | |
2453 TRACE_ERROR("rel. TBF Starting time in single block allocation k=0 NOT ALLOWED"); | |
2454 TRACE_EVENT_P1("k=%d ", d_ul_assign->sin_alloc.tbf_s_time.rel); | |
2455 result = E_UL_ASSIGN_ERROR_RA; | |
2456 } | |
2457 else if(!d_ul_assign->sin_alloc.tbf_s_time.v_rel) | |
2458 { | |
2459 TRACE_ERROR("NO TBF Starting time in single block allocation "); | |
2460 TRACE_EVENT_P2("v_abs=%d v_rel=%d ", d_ul_assign->sin_alloc.tbf_s_time.v_abs | |
2461 , d_ul_assign->sin_alloc.tbf_s_time.v_rel); | |
2462 result = E_UL_ASSIGN_ERROR_RA; | |
2463 } | |
2464 } | |
2465 else if(d_ul_assign->v_f_alloc_ul) | |
2466 { | |
2467 if( grr_data->uplink_tbf.mac_mode EQ DA ) | |
2468 { | |
2469 result = E_UL_ASSIGN_ERROR_RA; | |
2470 TRACE_ERROR("fixed alloc received while dynamic is running in uplink"); | |
2471 } | |
2472 else | |
2473 { | |
2474 result = E_UL_ASSIGN_FIXED; | |
2475 grr_data->uplink_tbf.ts_usage = 0; | |
2476 tx_slots=0; | |
2477 if(d_ul_assign->f_alloc_ul.v_ts_alloc) | |
2478 { | |
2479 grr_data->uplink_tbf.ts_usage = d_ul_assign->f_alloc_ul.ts_alloc; | |
2480 /*calculate number of timeslots*/ | |
2481 tx_slots = grr_calc_nr_of_set_bits(grr_data->uplink_tbf.ts_usage); | |
2482 } | |
2483 else if(d_ul_assign->f_alloc_ul.v_pwr_par) | |
2484 { | |
2485 for(i = 0,mask = 0x80;i < 8;i++) | |
2486 { | |
2487 if(d_ul_assign->f_alloc_ul.pwr_par.gamma_tn[i].v_gamma) | |
2488 { | |
2489 grr_data->uplink_tbf.ts_usage |= mask; | |
2490 tx_slots++; | |
2491 } | |
2492 mask >>= 1; | |
2493 } | |
2494 | |
2495 grr_store_type = GRR_STORE_TYPE_PWR_PAR; | |
2496 } | |
2497 grr_data->uplink_tbf.nts = tx_slots; | |
2498 } | |
2499 } | |
2500 else | |
2501 { | |
2502 TRACE_ERROR ("Packet Uplink Assignment without allocation type - corrupt airmessage!"); | |
2503 } | |
2504 | |
2505 if( !handle_ms_cap(UL_ASSIGNMENT) ) | |
2506 { | |
2507 result = E_UL_ASSIGN_ERROR_RA; | |
2508 TRACE_EVENT("tc_eval_.. will return E_UL_ASSIGN_ERROR_RA (tx_slots wrong)"); | |
2509 } | |
2510 | |
2511 if ( !tc_check_and_save_freq ()) | |
2512 { | |
2513 if ((grr_data->tbf_type EQ CGRLC_TBF_MODE_DL) OR (grr_data->tbf_type EQ CGRLC_TBF_MODE_DL_UL) ) | |
2514 { | |
2515 result = E_UL_ASSIGN_IGNORE; | |
2516 TRACE_EVENT("tc_eval_.. will return E_UL_ASSIGN_IGNORE , DL ACTIVE (frequencies wrong)"); | |
2517 } | |
2518 else | |
2519 { | |
2520 result = E_UL_ASSIGN_ERROR_RA; | |
2521 TRACE_EVENT("tc_eval_.. will return E_UL_ASSIGN_ERROR_RA (frequencies wrong)"); | |
2522 } | |
2523 return result; | |
2524 } | |
2525 | |
2526 if( result NEQ E_UL_ASSIGN_ERROR_RA AND | |
2527 result NEQ E_UL_ASSIGN_NULL ) | |
2528 { | |
2529 switch( grr_store_type ) | |
2530 { | |
2531 case GRR_STORE_TYPE_TN_ALLOC_PWR: | |
2532 grr_store_type_tn_alloc_pwr( &d_ul_assign->dyn_alloc_p.tn_alloc_pwr ); | |
2533 break; | |
2534 | |
2535 case GRR_STORE_TYPE_ALF_GAM: | |
2536 grr_store_type_alf_gam( &d_ul_assign->sin_alloc.alf_gam, | |
2537 d_ul_assign->sin_alloc.tn ); | |
2538 break; | |
2539 | |
2540 case GRR_STORE_TYPE_PWR_PAR: | |
2541 grr_store_type_pwr_par( &d_ul_assign->f_alloc_ul.pwr_par, FALSE ); | |
2542 break; | |
2543 | |
2544 default: | |
2545 /* do nothing */ | |
2546 break; | |
2547 } | |
2548 } | |
2549 | |
2550 return(result); | |
2551 } /* tc_eval_ul_assign() */ | |
2552 | |
2553 | |
2554 | |
2555 /* | |
2556 +------------------------------------------------------------------------------ | |
2557 | Function : tc_eval_dl_assign | |
2558 +------------------------------------------------------------------------------ | |
2559 | Description : The function tc_eval_dl_assign() evaluates a | |
2560 | Packet Downlink Assignment. | |
2561 | | |
2562 | Parameters : void | |
2563 | | |
2564 +------------------------------------------------------------------------------ | |
2565 */ | |
2566 GLOBAL T_EVAL_DL_ASSIGN tc_eval_dl_assign () | |
2567 { | |
2568 MCAST(d_dl_assign,D_DL_ASSIGN); /* T_D_DL_ASSIGN */ | |
2569 T_EVAL_DL_ASSIGN result = E_DL_ASSIGN_IGNORE; | |
2570 | |
2571 TRACE_FUNCTION( "tc_eval_dl_assign" ); | |
2572 | |
2573 /* SZML-TC/072: check for things that results in E_DL_ASSIGN_ERROR_RA */ | |
2574 | |
2575 | |
2576 | |
2577 grr_data->downlink_tbf.ctrl_ack_bit= 0; | |
2578 | |
2579 /* | |
2580 * compare uplink and new assigned downlink mac mode | |
2581 * and set downlink mac mode | |
2582 */ | |
2583 switch( grr_data->tbf_type ) | |
2584 { | |
2585 case CGRLC_TBF_MODE_NULL: | |
2586 grr_data->downlink_tbf.mac_mode = d_dl_assign->mac_mode; | |
2587 grr_data->downlink_tbf.t3192 = FALSE; /* indicates if t3192 is running*/ | |
2588 grr_data->downlink_tbf.rlc_mode = d_dl_assign->rlc_mode; | |
2589 | |
2590 result = E_DL_ASSIGN; | |
2591 break; | |
2592 case CGRLC_TBF_MODE_UL: | |
2593 grr_data->downlink_tbf.mac_mode = d_dl_assign->mac_mode; | |
2594 grr_data->downlink_tbf.t3192 = FALSE; /* indicates if t3192 is running*/ | |
2595 grr_data->downlink_tbf.rlc_mode = d_dl_assign->rlc_mode; | |
2596 | |
2597 /*lint -fallthrough*/ | |
2598 case CGRLC_TBF_MODE_DL_UL: | |
2599 if(d_dl_assign->mac_mode NEQ grr_data->uplink_tbf.mac_mode) | |
2600 { | |
2601 result = E_DL_ASSIGN_IGNORE; | |
2602 TRACE_EVENT_P2("Ignore DL_ASS, Diff MAC Mode UL=%d DL=%d ",grr_data->uplink_tbf.mac_mode,d_dl_assign->mac_mode); | |
2603 return result; | |
2604 } | |
2605 if ((grr_data->downlink_tbf.rlc_mode NEQ d_dl_assign->rlc_mode) AND !d_dl_assign->ctrl_ack) | |
2606 { | |
2607 TRACE_ERROR("Diff rlc mode in downlink ass..aborting tbf"); | |
2608 result = E_DL_ASSIGN_ABORT_DL; | |
2609 return result; | |
2610 } | |
2611 grr_data->downlink_tbf.rlc_mode = d_dl_assign->rlc_mode; | |
2612 result = E_DL_ASSIGN; | |
2613 break; | |
2614 case CGRLC_TBF_MODE_DL: | |
2615 if ((grr_data->downlink_tbf.rlc_mode NEQ d_dl_assign->rlc_mode) AND !d_dl_assign->ctrl_ack) | |
2616 { | |
2617 TRACE_ERROR("Diff rlc mode in downlink ass..aborting tbf"); | |
2618 result = E_DL_ASSIGN_ABORT_DL; | |
2619 return result; | |
2620 } | |
2621 grr_data->downlink_tbf.rlc_mode = d_dl_assign->rlc_mode; | |
2622 result = E_DL_ASSIGN; | |
2623 break; | |
2624 default: | |
2625 result = E_DL_ASSIGN; | |
2626 break; | |
2627 } | |
2628 | |
2629 /* | |
2630 * compare old and new mac mode for downlink | |
2631 */ | |
2632 if ( d_dl_assign->mac_mode EQ FA_HALF_DUPLEX) | |
2633 { | |
2634 result = E_DL_ASSIGN_IGNORE; | |
2635 TRACE_EVENT( "DL ASS: Half duplex not supported" ); | |
2636 return result; | |
2637 } | |
2638 else if(d_dl_assign->mac_mode NEQ grr_data->downlink_tbf.mac_mode) | |
2639 { | |
2640 result = E_DL_ASSIGN_IGNORE; | |
2641 TRACE_EVENT_P3( "DL ASS: current mac mode= %d differs from commanded =%d tbf_type=%d" | |
2642 ,grr_data->downlink_tbf.mac_mode | |
2643 ,d_dl_assign->mac_mode | |
2644 ,grr_data->tbf_type ); | |
2645 return result; | |
2646 } | |
2647 | |
2648 | |
2649 /* | |
2650 * ckeck if tfi is present while no downlink tbf is active | |
2651 */ | |
2652 switch( grr_data->tbf_type ) | |
2653 { | |
2654 case CGRLC_TBF_MODE_UL: | |
2655 case CGRLC_TBF_MODE_NULL: | |
2656 if(!d_dl_assign->pda_trnc_grp.v_dl_tfi_assign) | |
2657 { | |
2658 result = E_DL_ASSIGN_IGNORE; | |
2659 TRACE_EVENT("Ignore DL_ASS, no dl_tfi in P DL Ass(no dl tbf active) "); | |
2660 return result; | |
2661 } | |
2662 result = E_DL_ASSIGN; | |
2663 break; | |
2664 default: | |
2665 result = E_DL_ASSIGN; | |
2666 break; | |
2667 } | |
2668 | |
2669 | |
2670 if(d_dl_assign->ctrl_ack) | |
2671 { | |
2672 if(grr_data->downlink_tbf.t3192) | |
2673 { | |
2674 grr_data->downlink_tbf.ctrl_ack_bit= 1; | |
2675 grr_data->downlink_tbf.t3192 = FALSE; /* indicates if t3192 is running*/ | |
2676 | |
2677 } | |
2678 else | |
2679 { | |
2680 result = E_DL_ASSIGN_IGNORE; | |
2681 TRACE_EVENT("DL ASS IGNORED, ctrl ack bit set but t3192 is not running"); | |
2682 return result; | |
2683 } | |
2684 } | |
2685 else if(grr_data->downlink_tbf.t3192) | |
2686 { | |
2687 TRACE_EVENT("DL assignment:ctrl ack bit is not set but t3192 is running"); | |
2688 } | |
2689 | |
2690 grr_data->downlink_tbf.ts_usage = d_dl_assign->ts_alloc; | |
2691 grr_data->downlink_tbf.nts = grr_calc_nr_of_set_bits(grr_data->downlink_tbf.ts_usage); | |
2692 if( !handle_ms_cap(DL_ASSIGNMENT)) | |
2693 { | |
2694 result = E_DL_ASSIGN_ERROR_RA; | |
2695 TRACE_EVENT("tc_eval_.. will return E_DL_ASSIGN_ERROR_RA (ms class error)"); | |
2696 return result; | |
2697 } | |
2698 | |
2699 if( tc_check_and_save_freq( ) EQ FALSE ) | |
2700 { | |
2701 if ((grr_data->tbf_type EQ CGRLC_TBF_MODE_UL) OR (grr_data->tbf_type EQ CGRLC_TBF_MODE_DL_UL)) | |
2702 { | |
2703 result = E_DL_ASSIGN_IGNORE; | |
2704 TRACE_EVENT("tc_eval_.. will return E_DL_ASSIGN_IGNORE , UL ACTIVE (frequencies wrong)"); | |
2705 } | |
2706 else | |
2707 { | |
2708 result = E_DL_ASSIGN_ERROR_RA; | |
2709 TRACE_EVENT("tc_eval_.. will return E_DL_ASSIGN_ERROR_RA (frequencies wrong)"); | |
2710 } | |
2711 return result; | |
2712 } | |
2713 | |
2714 if( d_dl_assign->pda_trnc_grp.v_pwr_par EQ TRUE ) | |
2715 { | |
2716 grr_store_type_pwr_par( &d_dl_assign->pda_trnc_grp.pwr_par, FALSE ); | |
2717 } | |
2718 | |
2719 return(result); | |
2720 } /* tc_eval_dl_assign() */ | |
2721 | |
2722 | |
2723 | |
2724 /* | |
2725 +------------------------------------------------------------------------------ | |
2726 | Function : tc_eval_access_rej | |
2727 +------------------------------------------------------------------------------ | |
2728 | Description : The function tc_eval_access_rej() evaluates a | |
2729 | Packet Access Reject. | |
2730 | | |
2731 | Parameters : void | |
2732 | | |
2733 +------------------------------------------------------------------------------ | |
2734 */ | |
2735 GLOBAL T_EVAL_ACCESS_REJ tc_eval_access_rej ( ULONG * t3172_value_i) | |
2736 { | |
2737 MCAST(d_access_rej,D_ACCESS_REJ); | |
2738 T_EVAL_ACCESS_REJ result = E_ACCESS_REJ_NULL; | |
2739 | |
2740 TRACE_FUNCTION( "tc_eval_access_rej" ); | |
2741 /*SZML-TC/122*/ | |
2742 | |
2743 if(d_access_rej->reject.v_wait) | |
2744 { | |
2745 result = E_ACCESS_REJ_WAIT; | |
2746 | |
2747 *t3172_value_i = d_access_rej->reject.wait.wait_ind; | |
2748 if( d_access_rej->reject.wait.waitsize ) | |
2749 { | |
2750 *t3172_value_i *= 20; | |
2751 } | |
2752 else | |
2753 { | |
2754 *t3172_value_i *= 1000; | |
2755 } | |
2756 } | |
2757 else | |
2758 { | |
2759 result = E_ACCESS_REJ_NO_WAIT; | |
2760 } | |
2761 | |
2762 return(result); | |
2763 | |
2764 } /* tc_eval_access_rej() */ | |
2765 | |
2766 | |
2767 | |
2768 /* | |
2769 +------------------------------------------------------------------------------ | |
2770 | Function : tc_send_ra_req | |
2771 +------------------------------------------------------------------------------ | |
2772 | Description : The function tc_send_ra_req() starts the build-process for a | |
2773 | Packet Access Request and send a MPHP_RA_REQ. | |
2774 | | |
2775 | Parameters : void | |
2776 | | |
2777 +------------------------------------------------------------------------------ | |
2778 */ | |
2779 GLOBAL void tc_send_ra_req ( void ) | |
2780 { | |
2781 TRACE_FUNCTION( "tc_send_ra_req" ); | |
2782 | |
2783 | |
2784 while( (grr_data->tc.n_acc_req < | |
2785 max_retrans_table[psc_db->prach.max_retrans[grr_data->uplink_tbf.prio]]+1) | |
2786 AND (tc_check_p_level() EQ C_P_LEVEL_DO_NOT_SEND) ) | |
2787 { | |
2788 TRACE_EVENT("C_P_LEVEL_DO_NOT_SEND"); | |
2789 grr_data->tc.n_acc_req++; | |
2790 } | |
2791 | |
2792 | |
2793 if (grr_data->tc.n_acc_req < | |
2794 max_retrans_table[psc_db->prach.max_retrans[grr_data->uplink_tbf.prio]]+1) | |
2795 { | |
2796 PALLOC(mphp_ra_req,MPHP_RA_REQ); | |
2797 memset(mphp_ra_req,0x00,sizeof(T_MPHP_RA_REQ)); | |
2798 /* | |
2799 * The powervalue txpwr_max_cch in DB is always a useful value. | |
2800 * The value is set by PSI. First a useful initial value. | |
2801 * After that a value from RR and after reception of PSI3 txpwr_max_cch | |
2802 * is set to a value from the scell-structure. | |
2803 */ | |
2804 | |
2805 mphp_ra_req->txpwr = | |
2806 grr_get_ms_txpwr_max_cch | |
2807 ( psc_db->pbcch.bcch.arfcn, | |
2808 grr_data->meas.pwr_offset, | |
2809 psc_db->scell_par.cr_par_1.cr_pow_par.gprs_ms_txpwr_max_cch ); | |
2810 | |
2811 if(grr_data->tc.sending_req EQ TRUE) | |
2812 { | |
2813 mphp_ra_req->rand = (USHORT)tc_gen_rand(); | |
2814 } | |
2815 else | |
2816 { | |
2817 /* The first PCR may be sent immediately when ready. Only the second PCR */ | |
2818 /* needs a random value which has to have uniform probability distribution */ | |
2819 mphp_ra_req->rand = 1; | |
2820 } | |
2821 mphp_ra_req->channel_request_data = tc_calc_req(); | |
2822 mphp_ra_req->bs_prach_blks = psc_db->pccch.bs_prach_blks; | |
2823 mphp_ra_req->burst_type = psc_db->gprs_cell_opt.ab_type; | |
2824 | |
2825 { | |
2826 UBYTE channel_request_data[RLC_MAC_MAX_LEN_CHANNEL_REQ]; | |
2827 | |
2828 channel_request_data[0] = ( mphp_ra_req->channel_request_data >> 8 ); | |
2829 channel_request_data[1] = ( UBYTE )mphp_ra_req->channel_request_data; | |
2830 | |
2831 TRACE_BINDUMP | |
2832 ( hCommGRR, TC_USER4, | |
2833 cl_rlcmac_get_msg_name( U_MSG_TYPE_CHANNEL_REQ_c, RLC_MAC_ROUTE_UL ), | |
2834 channel_request_data, RLC_MAC_MAX_LEN_CHANNEL_REQ ); /*lint !e569*/ | |
2835 } | |
2836 | |
2837 PSEND(hCommL1,mphp_ra_req); | |
2838 grr_data->tc.sending_req = TRUE; | |
2839 } | |
2840 else | |
2841 { | |
2842 vsi_t_start(GRR_handle,T3170,tc_get_t3170_value()); | |
2843 vsi_t_stop(GRR_handle,T3186); | |
2844 tc_send_ra_stop_req(); | |
2845 | |
2846 } | |
2847 | |
2848 | |
2849 } /* tc_send_ra_req() */ | |
2850 | |
2851 | |
2852 | |
2853 /* | |
2854 +------------------------------------------------------------------------------ | |
2855 | Function : tc_send_ra_stop_req | |
2856 +------------------------------------------------------------------------------ | |
2857 | Description : The function tc_send_ra_stop_req() stops the | |
2858 | sending of packet access requests. | |
2859 | | |
2860 | Parameters : void | |
2861 | | |
2862 +------------------------------------------------------------------------------ | |
2863 */ | |
2864 GLOBAL void tc_send_ra_stop_req ( void ) | |
2865 { | |
2866 TRACE_FUNCTION( "tc_send_ra_stop_req" ); | |
2867 | |
2868 /* | |
2869 * This timer might be run - in case of MPHP_RA_CON has not been received by GRR. | |
2870 * If it does not run the stop-command will be ignored by vsi. | |
2871 */ | |
2872 vsi_t_stop(GRR_handle,T3186); | |
2873 | |
2874 if(grr_data->tc.sending_req) | |
2875 { | |
2876 PALLOC(mphp_ra_stop_req,MPHP_RA_STOP_REQ); | |
2877 PSEND(hCommL1,mphp_ra_stop_req); | |
2878 /* | |
2879 * reset number of access in this procedure | |
2880 */ | |
2881 grr_data->tc.n_acc_req =0; | |
2882 | |
2883 /* | |
2884 * to make sure that TC only stops | |
2885 * the sending procedure if it | |
2886 * is running | |
2887 */ | |
2888 grr_data->tc.sending_req = FALSE; | |
2889 } | |
2890 | |
2891 } /* tc_send_ra_stop_req() */ | |
2892 | |
2893 | |
2894 | |
2895 /* | |
2896 +------------------------------------------------------------------------------ | |
2897 | Function : tc_send_polling_res | |
2898 +------------------------------------------------------------------------------ | |
2899 | Description : The function tc_send_polling_res() sends the primitive | |
2900 | MPHP_POLLING_RESPONSE_REQ. | |
2901 | | |
2902 | Parameters : ctrl_ack_type_i - indicates if normal or access burst shall sent | |
2903 | rrbp_i - depending on this variable the send frame number is computed | |
2904 | fn_i - frame number where Packet Polling Request was received | |
2905 | ctrl_ack_i - this value is sent within the pca, depends frim mac header | |
2906 | | |
2907 +------------------------------------------------------------------------------ | |
2908 */ | |
2909 GLOBAL void tc_send_polling_res (UBYTE poll_type_i, ULONG fn_i, UBYTE rrbp_i,UBYTE ctrl_ack_i ) | |
2910 { | |
2911 PALLOC( mphp_polling_response_req, MPHP_POLLING_RESPONSE_REQ ); | |
2912 | |
2913 TRACE_FUNCTION( "tc_send_polling_res" ); | |
2914 | |
2915 mphp_polling_response_req->fn = grr_calc_new_poll_pos( fn_i, rrbp_i ); | |
2916 | |
2917 mphp_polling_response_req->txpwr = | |
2918 grr_get_ms_txpwr_max_cch | |
2919 ( psc_db->pbcch.bcch.arfcn, | |
2920 grr_data->meas.pwr_offset, | |
2921 psc_db->scell_par.cr_par_1.cr_pow_par.gprs_ms_txpwr_max_cch ); | |
2922 | |
2923 if(poll_type_i EQ CGRLC_POLL_RES_NB) | |
2924 { | |
2925 mphp_polling_response_req->poll_resp_type = POLL_RESP_NB_CS1; | |
2926 memset( mphp_polling_response_req->poll_data, | |
2927 0x2b, | |
2928 sizeof(mphp_polling_response_req->poll_data) ); | |
2929 mphp_polling_response_req->poll_data[23] = 0 ; /* Byte is not used, set to 0 for test purposes */ | |
2930 | |
2931 /* code without CCD, air message buffer is used by other service*/ | |
2932 mphp_polling_response_req->poll_data[0] = 0x40 | grr_data->r_bit; | |
2933 mphp_polling_response_req->poll_data[1] = 0x04 |((UBYTE)(grr_data->db.ms_id.new_tlli>>30)); | |
2934 mphp_polling_response_req->poll_data[2] = ((UBYTE)(grr_data->db.ms_id.new_tlli>>22)); | |
2935 mphp_polling_response_req->poll_data[3] = ((UBYTE)(grr_data->db.ms_id.new_tlli>>14)); | |
2936 mphp_polling_response_req->poll_data[4] = ((UBYTE)(grr_data->db.ms_id.new_tlli>>06)); | |
2937 mphp_polling_response_req->poll_data[5] = ((UBYTE)(grr_data->db.ms_id.new_tlli<<2)) + ctrl_ack_i; | |
2938 | |
2939 /* | |
2940 * get TA from paxket uplink/downlink assignment | |
2941 */ | |
2942 if(grr_data->ta_params.ta_value EQ 0xFF) | |
2943 { | |
2944 MCAST( d_ul_assign, D_UL_ASSIGN ); | |
2945 MCAST( d_dl_assign, D_DL_ASSIGN); | |
2946 | |
2947 if(( d_dl_assign->msg_type EQ D_DL_ASSIGN_c) AND | |
2948 d_dl_assign->pta.v_ta_value) | |
2949 | |
2950 { | |
2951 mphp_polling_response_req->ta_index = d_dl_assign->pta.ta_value; | |
2952 } | |
2953 else if(( d_ul_assign->msg_type EQ D_UL_ASSIGN_c) AND | |
2954 d_ul_assign->pta.v_ta_value) | |
2955 { | |
2956 mphp_polling_response_req->ta_index = d_ul_assign->pta.ta_value; | |
2957 } | |
2958 else | |
2959 { | |
2960 TRACE_ERROR("NO TA IN MPHP_POLLING_REQ"); | |
2961 TRACE_EVENT_P5("msg_typ=%d, v_pta_dl=%d v_pta_ul=%d v_ptai_dl=%d v_ptai_ul=%d" | |
2962 ,d_ul_assign->msg_type | |
2963 ,d_dl_assign->pta.v_ta_value | |
2964 ,d_ul_assign->pta.v_ta_value | |
2965 ,d_dl_assign->pta.v_ta_index_tn | |
2966 ,d_ul_assign->pta.v_ta_index_tn); | |
2967 } | |
2968 | |
2969 } | |
2970 else | |
2971 { | |
2972 mphp_polling_response_req->ta_index = grr_data->ta_params.ta_value; | |
2973 TRACE_EVENT_P1("valid ta in database at sending MPHP_POLLING_RES_REQ ta=%d",grr_data->ta_params.ta_value); | |
2974 } | |
2975 | |
2976 TRACE_BINDUMP | |
2977 ( hCommGRR, TC_USER4, | |
2978 cl_rlcmac_get_msg_name | |
2979 ( ( UBYTE )( mphp_polling_response_req->poll_data[1] >> 2 ), RLC_MAC_ROUTE_UL ), | |
2980 mphp_polling_response_req->poll_data, MAX_L2_FRAME_SIZE ); /*lint !e569*/ | |
2981 } | |
2982 else | |
2983 { | |
2984 USHORT data; | |
2985 | |
2986 /* | |
2987 * initalize channel request data array | |
2988 */ | |
2989 memset( mphp_polling_response_req->poll_data, | |
2990 0, | |
2991 sizeof(mphp_polling_response_req->poll_data) ); | |
2992 | |
2993 /* | |
2994 * format is four access bursts | |
2995 */ | |
2996 if(psc_db->gprs_cell_opt.ab_type EQ AB_8_BIT) | |
2997 { | |
2998 /* | |
2999 * 8 Bit access burst | |
3000 */ | |
3001 mphp_polling_response_req->poll_resp_type = POLL_RESP_AB_8_BIT; | |
3002 data =0x0000; | |
3003 data|=0x7f; | |
3004 /*TRACE_EVENT_P1("POLL_RESP_8BIT_AB: FN %Ld", mphp_polling_response_req->fn);*/ | |
3005 } | |
3006 else | |
3007 { | |
3008 /* | |
3009 * 11 Bit access burst | |
3010 */ | |
3011 | |
3012 mphp_polling_response_req->poll_resp_type = POLL_RESP_AB_11_BIT; | |
3013 data = (0x07<<8); | |
3014 data|=0xe7; | |
3015 | |
3016 data = grr_convert_11bit_2_etsi(data); | |
3017 /*TRACE_EVENT_P1("POLL_RESP_11BIT_AB: FN %Ld", mphp_polling_response_req->fn);*/ | |
3018 } | |
3019 | |
3020 mphp_polling_response_req->poll_data[0]= (UBYTE)(data & 0x00ff); | |
3021 mphp_polling_response_req->poll_data[1]= (UBYTE)((data & 0xff00) >> 8); | |
3022 | |
3023 TRACE_BINDUMP | |
3024 ( hCommGRR, TC_USER4, | |
3025 cl_rlcmac_get_msg_name( U_MSG_TYPE_CHANNEL_REQ_c, RLC_MAC_ROUTE_UL ), | |
3026 mphp_polling_response_req->poll_data, | |
3027 RLC_MAC_MAX_LEN_CHANNEL_REQ ); /*lint !e569*/ | |
3028 } | |
3029 | |
3030 PSEND( hCommL1, mphp_polling_response_req ); | |
3031 | |
3032 } /* tc_send_polling_res() */ | |
3033 | |
3034 | |
3035 | |
3036 /* | |
3037 +------------------------------------------------------------------------------ | |
3038 | Function : tc_send_single_block | |
3039 +------------------------------------------------------------------------------ | |
3040 | Description : The function tc_send_single_block() sends the primitive | |
3041 | MPHP_SINGLE_BLOCK_REQ with measurement report. | |
3042 | | |
3043 | Parameters : void | |
3044 | | |
3045 +------------------------------------------------------------------------------ | |
3046 */ | |
3047 GLOBAL void tc_send_single_block ( void ) | |
3048 { | |
3049 MCAST(d_ul_assign,D_UL_ASSIGN); | |
3050 T_MPHP_SINGLE_BLOCK_REQ * ptr2prim; | |
3051 | |
3052 TRACE_FUNCTION( "tc_send_single_block" ); | |
3053 | |
3054 ptr2prim = tc_get_send_nb_prim_and_set_freq( ); | |
3055 | |
3056 ptr2prim->assign_id = 0; | |
3057 ptr2prim->purpose = SINGLE_BLOCK_TRANSFER_UL; | |
3058 ptr2prim->pc_meas_chan = psc_db->g_pwr_par.pc_meas_chan; | |
3059 ptr2prim->burst_type = ( psc_db->gprs_cell_opt.ab_type EQ AB_8_BIT ) | |
3060 ? AB_8_BIT : AB_11_BIT; | |
3061 /* timing advance */ | |
3062 if (d_ul_assign->pta.v_ta_value) | |
3063 { | |
3064 ptr2prim->p_timing_advance.ta_value = d_ul_assign->pta.ta_value; | |
3065 } | |
3066 else | |
3067 { | |
3068 ptr2prim->p_timing_advance.ta_value = 0xff; | |
3069 } | |
3070 | |
3071 if(d_ul_assign->pta.v_ta_index_tn) | |
3072 { | |
3073 ptr2prim->p_timing_advance.ta_index = d_ul_assign->pta.ta_index_tn.ta_index; | |
3074 } | |
3075 else | |
3076 { | |
3077 ptr2prim->p_timing_advance.ta_index = 0xff; | |
3078 } | |
3079 | |
3080 /* trainings sequence */ | |
3081 ptr2prim->tsc = d_ul_assign->freq_par.tsc; | |
3082 | |
3083 /* handle TBF starting time (is always present in single block allocation) */ | |
3084 if(d_ul_assign->sin_alloc.tbf_s_time.v_abs) | |
3085 { | |
3086 ptr2prim->p_tbf_start.tbf_start_present = 1; | |
3087 ptr2prim->p_tbf_start.fn = grr_decode_tbf_start_abs(&d_ul_assign->sin_alloc.tbf_s_time.abs); | |
3088 if(grr_check_if_tbf_start_is_elapsed ( ptr2prim->p_tbf_start.fn, grr_data->ul_fn)) | |
3089 { /* SZML-TC/077: drop message, enter pim */ | |
3090 TRACE_ERROR("TBF Starting time is ELAPSED in single block allocation!"); | |
3091 TRACE_EVENT_P2("CPAP SBR TBF ST ELAPSED st=%ld c_fn=%ld ", ptr2prim->p_tbf_start.fn,grr_data->ul_fn); | |
3092 } | |
3093 } | |
3094 else if (d_ul_assign->sin_alloc.tbf_s_time.v_rel) | |
3095 { | |
3096 ptr2prim->p_tbf_start.tbf_start_present = 1; | |
3097 /* | |
3098 * For the relative position set d_ul_assign->sin_alloc.tbf_s_time.rel-1, because grr_data->fn is | |
3099 * received from mphp_data_ind. This fn is the current fn, and not the received fn. | |
3100 */ | |
3101 ptr2prim->p_tbf_start.fn = grr_decode_tbf_start_rel(grr_data->dl_fn, | |
3102 (USHORT)(d_ul_assign->sin_alloc.tbf_s_time.rel)); | |
3103 } | |
3104 else | |
3105 { | |
3106 TRACE_ERROR("TBF Starting time is missing in single block allocation!"); | |
3107 /* SZML-TC/078: drop message, enter pim ! */ | |
3108 } | |
3109 | |
3110 /* timeslot number */ | |
3111 ptr2prim->tn=d_ul_assign->sin_alloc.tn; | |
3112 | |
3113 /* put measurement report into buffer */ | |
3114 tc_cpy_ctrl_blk_to_buffer( ptr2prim->l2_frame ); | |
3115 | |
3116 sig_tc_meas_update_pch( ); | |
3117 | |
3118 TRACE_BINDUMP | |
3119 ( hCommGRR, TC_USER4, | |
3120 cl_rlcmac_get_msg_name | |
3121 ( ( UBYTE )( ptr2prim->l2_frame[1] >> 2 ), RLC_MAC_ROUTE_UL ), | |
3122 ptr2prim->l2_frame, MAX_L2_FRAME_SIZE ); /*lint !e569*/ | |
3123 | |
3124 PSEND(hCommL1,ptr2prim); | |
3125 } /* tc_send_single_block() */ | |
3126 | |
3127 | |
3128 | |
3129 /* | |
3130 +------------------------------------------------------------------------------ | |
3131 | Function : tc_send_resource_request_p | |
3132 +------------------------------------------------------------------------------ | |
3133 | Description : The function tc_send_resource_request_p() sends the primitive | |
3134 | MPHP_SINGLE_BLOCK_REQ with Packet Resource Request for | |
3135 | two phase access due to reception of airmessage packet uplink | |
3136 | assignment. | |
3137 | | |
3138 | Parameters : void | |
3139 | | |
3140 +------------------------------------------------------------------------------ | |
3141 */ | |
3142 GLOBAL void tc_send_resource_request_p ( void ) | |
3143 { | |
3144 MCAST(d_ul_assign,D_UL_ASSIGN); | |
3145 | |
3146 T_MPHP_SINGLE_BLOCK_REQ * ptr2prim; | |
3147 | |
3148 TRACE_FUNCTION( "tc_send_resource_request_p" ); | |
3149 | |
3150 | |
3151 ptr2prim = tc_get_send_nb_prim_and_set_freq( ); | |
3152 | |
3153 /* | |
3154 * mark that single block is because of two phase access procedure | |
3155 */ | |
3156 ptr2prim->assign_id = 0; | |
3157 ptr2prim->purpose = TWO_PHASE_ACESS; | |
3158 ptr2prim->pc_meas_chan = psc_db->g_pwr_par.pc_meas_chan; | |
3159 ptr2prim->burst_type = (psc_db->gprs_cell_opt.ab_type EQ AB_8_BIT) | |
3160 ?AB_8_BIT | |
3161 :AB_11_BIT; | |
3162 | |
3163 if (d_ul_assign->pta.v_ta_value) | |
3164 { | |
3165 ptr2prim->p_timing_advance.ta_value = d_ul_assign->pta.ta_value; | |
3166 } | |
3167 else | |
3168 { | |
3169 ptr2prim->p_timing_advance.ta_value = 0xff; | |
3170 } | |
3171 | |
3172 if(d_ul_assign->pta.v_ta_index_tn) | |
3173 { | |
3174 ptr2prim->p_timing_advance.ta_index =d_ul_assign->pta.ta_index_tn.ta_index; | |
3175 } | |
3176 else | |
3177 { | |
3178 ptr2prim->p_timing_advance.ta_index =0xff; | |
3179 } | |
3180 | |
3181 /* | |
3182 * trainings sequence | |
3183 */ | |
3184 ptr2prim->tsc = d_ul_assign->freq_par.tsc; | |
3185 | |
3186 | |
3187 /* | |
3188 * handle TBF starting time | |
3189 * is always present in single block allocation | |
3190 */ | |
3191 if(d_ul_assign->sin_alloc.tbf_s_time.v_abs) | |
3192 { | |
3193 ptr2prim->p_tbf_start.tbf_start_present = 1; | |
3194 ptr2prim->p_tbf_start.fn = grr_decode_tbf_start_abs(&d_ul_assign->sin_alloc.tbf_s_time.abs); | |
3195 if(grr_check_if_tbf_start_is_elapsed ( ptr2prim->p_tbf_start.fn, grr_data->ul_fn)) | |
3196 { /* SZML-TC/079 */ | |
3197 TRACE_ERROR("TBF Starting time is ELAPSED in single block allocation!"); | |
3198 TRACE_EVENT_P2("CPAP SBR TBF ST ELAPSED st=%ld c_fn=%ld ", ptr2prim->p_tbf_start.fn,grr_data->ul_fn); | |
3199 } | |
3200 TRACE_EVENT_P5("res_req fn_out:%ld fn_in:%d %d %d data->fn:%ld", | |
3201 ptr2prim->p_tbf_start.fn, | |
3202 d_ul_assign->sin_alloc.tbf_s_time.abs.t1, | |
3203 d_ul_assign->sin_alloc.tbf_s_time.abs.t2, | |
3204 d_ul_assign->sin_alloc.tbf_s_time.abs.t3, | |
3205 grr_data->dl_fn); | |
3206 } | |
3207 else if (d_ul_assign->sin_alloc.tbf_s_time.v_rel) | |
3208 { | |
3209 ptr2prim->p_tbf_start.tbf_start_present = 1; | |
3210 /* | |
3211 * For the relative position set d_ul_assign->sin_alloc.tbf_s_time.rel-1, because grr_data->fn is | |
3212 * received from mphp_data_ind. This fn is the current fn, and not the received fn. | |
3213 */ | |
3214 ptr2prim->p_tbf_start.fn = grr_decode_tbf_start_rel(grr_data->dl_fn, | |
3215 (USHORT)(d_ul_assign->sin_alloc.tbf_s_time.rel)); | |
3216 TRACE_EVENT_P3("REL: ST_TIME for PRR: fn_i=%ld rel=%ld fn_out=%ld" | |
3217 ,grr_data->dl_fn | |
3218 ,d_ul_assign->sin_alloc.tbf_s_time.rel | |
3219 ,ptr2prim->p_tbf_start.fn); | |
3220 } | |
3221 else | |
3222 { | |
3223 TRACE_ERROR("TBF Starting time is missing in single block allocation!"); | |
3224 } | |
3225 | |
3226 ptr2prim->tn = d_ul_assign->sin_alloc.tn; | |
3227 | |
3228 { | |
3229 T_U_RESOURCE_REQ resource_req; | |
3230 | |
3231 tc_build_res_req( &resource_req, | |
3232 R_BUILD_2PHASE_ACCESS, | |
3233 SRC_TBF_INFO_UL_ASSIGN ); | |
3234 | |
3235 grr_encode_ul_ctrl_block( ptr2prim->l2_frame, ( UBYTE* )&resource_req ); | |
3236 } | |
3237 | |
3238 sig_tc_meas_update_pch( ); | |
3239 | |
3240 TRACE_BINDUMP | |
3241 ( hCommGRR, TC_USER4, | |
3242 cl_rlcmac_get_msg_name | |
3243 ( ( UBYTE )( ptr2prim->l2_frame[1] >> 2 ), RLC_MAC_ROUTE_UL ), | |
3244 ptr2prim->l2_frame, MAX_L2_FRAME_SIZE ); /*lint !e569*/ | |
3245 | |
3246 PSEND(hCommL1,ptr2prim); | |
3247 | |
3248 return; | |
3249 | |
3250 } /* tc_send_resource_request_p() */ | |
3251 | |
3252 | |
3253 /* | |
3254 +------------------------------------------------------------------------------ | |
3255 | Function : tc_handle_ra_con | |
3256 +------------------------------------------------------------------------------ | |
3257 | Description : The function tc_handle_ra_con() checks wheather there is to send | |
3258 | another Packet Access Request or not. | |
3259 | | |
3260 | Parameters : void | |
3261 +------------------------------------------------------------------------------ | |
3262 */ | |
3263 GLOBAL T_HANDLE_RA_CON tc_handle_ra_con ( void ) | |
3264 { | |
3265 T_HANDLE_RA_CON result; | |
3266 UBYTE max_retrans; | |
3267 TRACE_FUNCTION( "tc_handle_ra_con" ); | |
3268 | |
3269 | |
3270 /* | |
3271 * stop T3186 becauce packet access request was sent | |
3272 */ | |
3273 | |
3274 | |
3275 /* | |
3276 * get current max. retransmissson value | |
3277 */ | |
3278 max_retrans | |
3279 = max_retrans_table[psc_db->prach.max_retrans[grr_data->uplink_tbf.prio]]; | |
3280 | |
3281 if(grr_data->tc.n_acc_req >= max_retrans + 1) | |
3282 { | |
3283 result = H_RA_CON_STOP_REQ; | |
3284 vsi_t_start(GRR_handle,T3170,tc_get_t3170_value()); | |
3285 vsi_t_stop(GRR_handle,T3186); | |
3286 } | |
3287 else | |
3288 { | |
3289 result = H_RA_CON_CONTINUE; | |
3290 } | |
3291 | |
3292 | |
3293 return(result); | |
3294 | |
3295 } /* tc_handle_ra_con() */ | |
3296 | |
3297 | |
3298 | |
3299 | |
3300 | |
3301 | |
3302 | |
3303 /* | |
3304 +------------------------------------------------------------------------------ | |
3305 | Function : tc_init | |
3306 +------------------------------------------------------------------------------ | |
3307 | Description : The function tc_init() initialize the TC data structure. | |
3308 | | |
3309 | Parameters : void | |
3310 | | |
3311 +------------------------------------------------------------------------------ | |
3312 */ | |
3313 GLOBAL void tc_init ( void ) | |
3314 { | |
3315 UBYTE i; | |
3316 | |
3317 TRACE_FUNCTION( "tc_init" ); | |
3318 | |
3319 /* | |
3320 * set some values | |
3321 */ | |
3322 grr_data->tc.disable_callback_func = NULL; | |
3323 grr_data->tc.disable_class = CGRLC_DISABLE_CLASS_CR; | |
3324 grr_data->tbf_type = CGRLC_TBF_MODE_NULL; | |
3325 grr_data->tc.dcch_present = FALSE; | |
3326 grr_data->tc.v_freq_set = FALSE; | |
3327 | |
3328 /* | |
3329 * values for fixed alloc | |
3330 */ | |
3331 grr_data->tc.fa_ctrl.fa_type = FA_NO_CURRENT; | |
3332 grr_data->tc.fa_ctrl.repeat_alloc = FALSE; | |
3333 grr_data->tc.fa_ctrl.ts_overr = 0; | |
3334 | |
3335 grr_data->tc.num_of_rels_running = 0; | |
3336 | |
3337 /* initialize the relevant data for uplink control block */ | |
3338 grr_data->tc.v_sb_without_tbf = FALSE; | |
3339 | |
3340 grr_data->tc.ul_ctrl_blk.seq[0] = MAX_CTRL_BLK_NUM; | |
3341 | |
3342 for( i = 0; i < MAX_CTRL_BLK_NUM; i++ ) | |
3343 { | |
3344 grr_data->tc.ul_ctrl_blk.blk[i].state = BLK_STATE_NONE; | |
3345 grr_data->tc.ul_ctrl_blk.blk[i].owner = CGRLC_BLK_OWNER_NONE; | |
3346 } | |
3347 | |
3348 grr_data->tc.two_2p_w_4_tbf_con = TRUE; | |
3349 | |
3350 | |
3351 grr_data->tc.two_2p_w_4_tbf_con = TRUE; | |
3352 | |
3353 /* | |
3354 * Initialise service name (uses define SERVICE_NAME_* in GRR.H); | |
3355 */ | |
3356 | |
3357 INIT_STATE(TC,TC_ACCESS_DISABLED); | |
3358 /* | |
3359 * initialize primitive queue | |
3360 */ | |
3361 | |
3362 grr_data->tc.p_assign = NULL; | |
3363 | |
3364 grr_data->uplink_tbf.ts_mask = 0; | |
3365 grr_data->uplink_tbf.ts_usage = 0; | |
3366 grr_data->downlink_tbf.ts_mask = 0; | |
3367 grr_data->downlink_tbf.ts_usage = 0; | |
3368 grr_data->tc.n_acc_req = 0; | |
3369 | |
3370 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
3371 grr_data->tc.tbf_est_pacch = FALSE; | |
3372 #endif | |
3373 | |
3374 } /* tc_init() */ | |
3375 | |
3376 | |
3377 | |
3378 | |
3379 | |
3380 /* | |
3381 +------------------------------------------------------------------------------ | |
3382 | Function : tc_handle_error_pim | |
3383 +------------------------------------------------------------------------------ | |
3384 | Description : The function tc_handle_error_pim() ... | |
3385 | | |
3386 | Parameters : void | |
3387 | | |
3388 +------------------------------------------------------------------------------ | |
3389 */ | |
3390 GLOBAL void tc_handle_error_pim ( void ) | |
3391 { | |
3392 TRACE_FUNCTION( "tc_handle_error_pim" ); | |
3393 TRACE_EVENT( "tc_handle_error_pim" ); | |
3394 | |
3395 if( grr_data->tc.v_sb_without_tbf ) | |
3396 { | |
3397 tc_set_stop_ctrl_blk( FALSE, CGRLC_BLK_OWNER_NONE, 0 ); | |
3398 | |
3399 tc_cgrlc_access_status_req(); | |
3400 } | |
3401 else | |
3402 { | |
3403 tc_cgrlc_ul_tbf_res ( CGRLC_TBF_MODE_ESTABLISHMENT_FAILURE, CGRLC_PRIM_STATUS_ONE ); | |
3404 } | |
3405 | |
3406 } /* tc_handle_error_pim() */ | |
3407 | |
3408 /* | |
3409 +------------------------------------------------------------------------------ | |
3410 | Function : tc_handle_error_ra | |
3411 +------------------------------------------------------------------------------ | |
3412 | Description : The function tc_handle_error_ra() handles actions related | |
3413 | to errors that leads to randam access procedure | |
3414 | | |
3415 | Parameters : void | |
3416 | | |
3417 +------------------------------------------------------------------------------ | |
3418 */ | |
3419 GLOBAL void tc_handle_error_ra ( void ) | |
3420 { | |
3421 TRACE_FUNCTION( "tc_handle_error_ra" ); | |
3422 | |
3423 | |
3424 /* | |
3425 * - called in case of contention resulution failed in RU | |
3426 * - t3168 expires contention resulution failed in 2P-Access | |
3427 * - If the mobile station has been assigned more PDCHs than it supports according | |
3428 * to its MS multislot class, the mobile station shall reinitiate the packet access | |
3429 * procedure unless it has already been repeated 4 times. In that | |
3430 * case, TBF failure has occurred. | |
3431 */ | |
3432 | |
3433 /* | |
3434 * cancel access procedure if running | |
3435 */ | |
3436 if(grr_is_pbcch_present() | |
3437 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
3438 AND !grr_data->tc.tbf_est_pacch | |
3439 #endif | |
3440 ) | |
3441 { | |
3442 tc_send_ra_stop_req(); | |
3443 } | |
3444 | |
3445 /* | |
3446 * Kill TBF if running | |
3447 */ | |
3448 tc_abort_tbf(grr_data->tbf_type); | |
3449 | |
3450 SET_STATE(TC,TC_PIM); | |
3451 | |
3452 | |
3453 | |
3454 } /* tc_handle_error_ra() */ | |
3455 | |
3456 /* | |
3457 +------------------------------------------------------------------------------ | |
3458 | Function : tc_activate_tbf | |
3459 +------------------------------------------------------------------------------ | |
3460 | Description : The function tc_activate_tbf() set the assigned TBF | |
3461 | into the data structures | |
3462 | | |
3463 | Parameters : tbf_type_i - type of TBF to deactivate | |
3464 | | |
3465 +------------------------------------------------------------------------------ | |
3466 */ | |
3467 GLOBAL void tc_activate_tbf ( T_TBF_TYPE tbf_type_i ) | |
3468 { | |
3469 TRACE_FUNCTION( "tc_activate_tbf" ); | |
3470 | |
3471 /* | |
3472 * Reset of n_acc_req_procedures because of the fact that number of | |
3473 * access procedures during pacet access procedures must not considered in | |
3474 * a error with random access occured during running TBF. | |
3475 */ | |
3476 /* grr_data->tc.n_acc_req_procedures = 0;*/ | |
3477 | |
3478 switch( tbf_type_i ) | |
3479 { | |
3480 | |
3481 case CGRLC_TBF_MODE_UL: | |
3482 switch( grr_data->tbf_type ) | |
3483 { | |
3484 case CGRLC_TBF_MODE_DL: | |
3485 grr_data->tbf_type = CGRLC_TBF_MODE_DL_UL; | |
3486 break; | |
3487 case CGRLC_TBF_MODE_NULL: | |
3488 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
3489 case CGRLC_TBF_MODE_2PA: | |
3490 #endif | |
3491 grr_data->tbf_type = CGRLC_TBF_MODE_UL; | |
3492 break; | |
3493 default: | |
3494 break; | |
3495 } | |
3496 break; | |
3497 | |
3498 case CGRLC_TBF_MODE_DL: | |
3499 switch( grr_data->tbf_type ) | |
3500 { | |
3501 case CGRLC_TBF_MODE_UL: | |
3502 grr_data->tbf_type = CGRLC_TBF_MODE_DL_UL; | |
3503 break; | |
3504 case CGRLC_TBF_MODE_NULL: | |
3505 grr_data->tbf_type = CGRLC_TBF_MODE_DL; | |
3506 break; | |
3507 default: | |
3508 break; | |
3509 } | |
3510 break; | |
3511 case CGRLC_TBF_MODE_DL_UL: | |
3512 switch( grr_data->tbf_type ) | |
3513 { | |
3514 case CGRLC_TBF_MODE_UL: | |
3515 case CGRLC_TBF_MODE_DL: | |
3516 case CGRLC_TBF_MODE_DL_UL: | |
3517 grr_data->tbf_type = CGRLC_TBF_MODE_DL_UL; | |
3518 break; | |
3519 default: | |
3520 { | |
3521 TRACE_ERROR("FATAL ERROR: tc_activate_tbf called with wrong tbf_type"); | |
3522 } | |
3523 break; | |
3524 } | |
3525 break; | |
3526 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
3527 case CGRLC_TBF_MODE_2PA: | |
3528 switch( grr_data->tbf_type ) | |
3529 { | |
3530 case CGRLC_TBF_MODE_UL: | |
3531 if (grr_data->tc.tbf_est_pacch) | |
3532 { | |
3533 grr_data->tbf_type = CGRLC_TBF_MODE_2PA; | |
3534 } | |
3535 else | |
3536 { | |
3537 TRACE_ERROR("FATAL ERROR: tc_activate_tbf called with wrong tbf_type"); | |
3538 } | |
3539 break; | |
3540 | |
3541 default: | |
3542 TRACE_ERROR("FATAL ERROR: tc_activate_tbf called with wrong tbf_type:CGRLC_TBF_MODE_2PA"); | |
3543 break; | |
3544 } | |
3545 break; | |
3546 #endif | |
3547 default: | |
3548 { | |
3549 TRACE_ERROR("FATAL ERROR: tc_activate_tbf called with wrong tbf_type"); | |
3550 } | |
3551 break; | |
3552 } /* switch (tbf_type_i) */ | |
3553 | |
3554 | |
3555 } /* tc_activate_tbf() */ | |
3556 | |
3557 | |
3558 /* | |
3559 +------------------------------------------------------------------------------ | |
3560 | Function : tc_deactivate_tbf | |
3561 +------------------------------------------------------------------------------ | |
3562 | Description : The function tc_deactivate_tbf() removes a TBF logical from TC | |
3563 | end estimates how to continue. | |
3564 | | |
3565 | Parameters : void | |
3566 | | |
3567 +------------------------------------------------------------------------------ | |
3568 */ | |
3569 GLOBAL void tc_deactivate_tbf ( T_TBF_TYPE tbf_i ) | |
3570 { | |
3571 TRACE_FUNCTION( "tc_deactivate_tbf" ); | |
3572 | |
3573 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
3574 if((tbf_i EQ CGRLC_TBF_MODE_UL) OR | |
3575 (tbf_i EQ CGRLC_TBF_MODE_2PA )) | |
3576 { | |
3577 grr_data->tc.tbf_est_pacch = FALSE; | |
3578 } | |
3579 #endif | |
3580 | |
3581 switch( grr_data->tbf_type ) | |
3582 { | |
3583 | |
3584 case CGRLC_TBF_MODE_DL_UL: | |
3585 switch( tbf_i ) | |
3586 { | |
3587 case CGRLC_TBF_MODE_UL: | |
3588 grr_data->tbf_type = CGRLC_TBF_MODE_DL; | |
3589 break; | |
3590 case CGRLC_TBF_MODE_DL: | |
3591 grr_data->tbf_type = CGRLC_TBF_MODE_UL; | |
3592 break; | |
3593 case CGRLC_TBF_MODE_DL_UL: | |
3594 grr_data->tbf_type = CGRLC_TBF_MODE_NULL; | |
3595 break; | |
3596 } | |
3597 break; | |
3598 | |
3599 case CGRLC_TBF_MODE_DL: | |
3600 case CGRLC_TBF_MODE_UL: | |
3601 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
3602 case CGRLC_TBF_MODE_2PA: | |
3603 #endif | |
3604 grr_data->tbf_type = CGRLC_TBF_MODE_NULL; | |
3605 break; | |
3606 | |
3607 default: | |
3608 break; | |
3609 } | |
3610 | |
3611 switch( grr_data->tbf_type ) | |
3612 { | |
3613 case CGRLC_TBF_MODE_DL: | |
3614 SET_STATE(TC,TC_TBF_ACTIVE); | |
3615 /* | |
3616 * downlink tbf is running --> TC_TBF_ACTIVE | |
3617 */ | |
3618 break; | |
3619 | |
3620 case CGRLC_TBF_MODE_UL: | |
3621 /* | |
3622 * uplink tbf is running, no state change required | |
3623 */ | |
3624 break; | |
3625 | |
3626 case CGRLC_TBF_MODE_NULL: | |
3627 SET_STATE(TC,TC_PIM); | |
3628 /* | |
3629 * no tbf is running, enter TC_PIM | |
3630 */ | |
3631 break; | |
3632 | |
3633 default: | |
3634 break; | |
3635 } | |
3636 | |
3637 | |
3638 } /* tc_deactivate_tbf() */ | |
3639 | |
3640 | |
3641 /* | |
3642 +------------------------------------------------------------------------------ | |
3643 | Function : tc_start_timer_t3172 | |
3644 +------------------------------------------------------------------------------ | |
3645 | Description : The function tc_start_timer_t3172() | |
3646 | SZML-TC/085 this timer start | |
3647 | caused p access reject will be done | |
3648 | with cell reselection procedures | |
3649 | | |
3650 | Parameters : none | |
3651 | | |
3652 +------------------------------------------------------------------------------ | |
3653 */ | |
3654 GLOBAL void tc_start_timer_t3172 ( ULONG t3172_value_i ) | |
3655 { | |
3656 | |
3657 if(t3172_value_i > 10000) | |
3658 { | |
3659 TRACE_EVENT_P1( "T3172 start %d s", (t3172_value_i/1000)); | |
3660 } | |
3661 else | |
3662 { | |
3663 TRACE_EVENT_P1( "T3172 start %d ms", t3172_value_i); | |
3664 } | |
3665 vsi_t_start(GRR_handle,T3172_1,t3172_value_i); | |
3666 | |
3667 } /* tc_start_timer_t3172() */ | |
3668 | |
3669 | |
3670 | |
3671 /* | |
3672 +------------------------------------------------------------------------------ | |
3673 | Function : tc_handle_tbf_start | |
3674 |------------------------------------------------------------------------------ | |
3675 | Description : The function tc_handle_tbf_start() handles the TBF-Starting- | |
3676 | Time in a Packet Uplink Assignment. | |
3677 | | |
3678 | Parameters : tbf_type - type of tbf to be handled, | |
3679 | tbf_wait - pointer to variable to store the calculated timmer | |
3680 | value | |
3681 +------------------------------------------------------------------------------ | |
3682 */ | |
3683 GLOBAL void tc_handle_tbf_start( T_TBF_TYPE tbf_type ) | |
3684 { | |
3685 TRACE_FUNCTION( "tc_handle_tbf_start" ); | |
3686 | |
3687 | |
3688 tc_send_assign_req(tbf_type); | |
3689 tc_activate_tbf(tbf_type); | |
3690 | |
3691 if((tbf_type EQ CGRLC_TBF_MODE_UL)) | |
3692 { | |
3693 vsi_t_stop(GRR_handle,T3162); | |
3694 vsi_t_stop(GRR_handle,T3168); | |
3695 vsi_t_stop(GRR_handle,T3170); | |
3696 vsi_t_stop(GRR_handle,T3186); | |
3697 | |
3698 tc_cgrlc_ul_tbf_res(CGRLC_TBF_MODE_UL,CGRLC_PRIM_STATUS_NULL); | |
3699 } | |
3700 else if(tbf_type EQ CGRLC_TBF_MODE_DL) | |
3701 { | |
3702 tc_cgrlc_dl_tbf_req(); | |
3703 if(grr_data->tc.v_sb_without_tbf EQ TRUE) | |
3704 { | |
3705 /*When Single Block is request for Measurement Report | |
3706 but network has sent the DL assignment, then this measurement report | |
3707 is sent to GRLC to be sent as normal control block*/ | |
3708 tc_send_control_msg_to_grlc(); | |
3709 grr_data->tc.v_sb_without_tbf = FALSE; | |
3710 } | |
3711 } | |
3712 else if(tbf_type EQ CGRLC_TBF_MODE_DL_UL) | |
3713 { | |
3714 vsi_t_stop(GRR_handle,T3168); | |
3715 tc_cgrlc_ul_tbf_res(CGRLC_TBF_MODE_UL,CGRLC_PRIM_STATUS_NULL); | |
3716 tc_cgrlc_dl_tbf_req(); | |
3717 } | |
3718 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
3719 else if(tbf_type EQ CGRLC_TBF_MODE_2PA) | |
3720 { | |
3721 tc_cgrlc_ul_tbf_res(CGRLC_TBF_MODE_2PA,CGRLC_PRIM_STATUS_NULL); | |
3722 } | |
3723 #endif | |
3724 } /* tc_handle_tbf_start() */ | |
3725 | |
3726 /* | |
3727 +------------------------------------------------------------------------------ | |
3728 | Function : tc_prepare_handle_tbf_start | |
3729 |------------------------------------------------------------------------------ | |
3730 | Description : | |
3731 | | |
3732 | Parameters : | |
3733 +------------------------------------------------------------------------------ | |
3734 */ | |
3735 GLOBAL void tc_prepare_handle_tbf_start ( T_TBF_TYPE tbf_type, | |
3736 UBYTE new_state, | |
3737 UBYTE old_state ) | |
3738 { | |
3739 MCAST( p_d_dl_assign, D_DL_ASSIGN ); | |
3740 | |
3741 TRACE_FUNCTION( "tc_prepare_handle_tbf_start" ); | |
3742 | |
3743 if( grr_is_pbcch_present( ) AND | |
3744 ( | |
3745 old_state EQ TC_PIM OR | |
3746 old_state EQ TC_WAIT_ASSIGN OR | |
3747 old_state EQ TC_WAIT_2P_ASSIGN OR | |
3748 old_state EQ TC_POLLING OR | |
3749 old_state EQ TC_WAIT_STOP_TASK_CNF | |
3750 ) | |
3751 ) | |
3752 { | |
3753 UBYTE ccch_read; | |
3754 | |
3755 if( p_d_dl_assign->msg_type EQ D_DL_ASSIGN ) | |
3756 { | |
3757 ccch_read = ( p_d_dl_assign->pda_trnc_grp.v_tbf_s_time ? DONT_STOP_CCCH : STOP_CCCH ); | |
3758 } | |
3759 else | |
3760 { | |
3761 MCAST( p_d_ul_assign, D_UL_ASSIGN ); | |
3762 | |
3763 if( ( p_d_ul_assign->v_dyn_alloc_p AND | |
3764 p_d_ul_assign->dyn_alloc_p.v_tbf_s_time ) OR | |
3765 p_d_ul_assign->v_sin_alloc OR | |
3766 p_d_ul_assign->v_f_alloc_ul ) | |
3767 { | |
3768 ccch_read = DONT_STOP_CCCH; | |
3769 } | |
3770 else | |
3771 { | |
3772 ccch_read = STOP_CCCH; | |
3773 } | |
3774 } | |
3775 | |
3776 grr_data->tc.last_eval_assign.ccch_read = ccch_read; | |
3777 grr_data->tc.last_eval_assign.tbf_type = tbf_type; | |
3778 grr_data->tc.last_eval_assign.state = new_state; | |
3779 | |
3780 SET_STATE( TC, TC_WAIT_STOP_TASK_CNF ); | |
3781 | |
3782 tc_malloc_assign( ); | |
3783 if(old_state NEQ TC_WAIT_STOP_TASK_CNF) | |
3784 { | |
3785 sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_ASSIGNED, ccch_read ); | |
3786 } | |
3787 } | |
3788 else | |
3789 { | |
3790 tc_handle_tbf_start( tbf_type ); | |
3791 | |
3792 #ifdef _TARGET_ | |
3793 | |
3794 if( p_d_dl_assign->msg_type EQ D_DL_ASSIGN AND | |
3795 grr_data->downlink_tbf.tbf_start_fn NEQ 0xFFFFFFFF ) | |
3796 { | |
3797 sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_ACCESS, TASK_STOP_DUMMY_VALUE ); | |
3798 } | |
3799 | |
3800 #endif | |
3801 | |
3802 } | |
3803 } /* tc_prepare_handle_tbf_start() */ | |
3804 /* | |
3805 +------------------------------------------------------------------------------ | |
3806 | Function : tc_set_fa_bitmap | |
3807 +------------------------------------------------------------------------------ | |
3808 | Description : sets fixed allocation bitmap for requested allocation after | |
3809 | receiving a repeat allocation with ts_override | |
3810 | | |
3811 | Parameters : void | |
3812 | | |
3813 +------------------------------------------------------------------------------ | |
3814 */ | |
3815 GLOBAL USHORT tc_set_fa_bitmap( UBYTE ts_mask, T_FIX_ALLOC* ptr_alloc) | |
3816 { | |
3817 UBYTE i; | |
3818 USHORT tx_slots=0; | |
3819 TRACE_FUNCTION( "tc_set_fa_bitmap" ); | |
3820 | |
3821 if (ts_mask) | |
3822 { | |
3823 /* | |
3824 * add new time slots to current allocation | |
3825 */ | |
3826 for(i=0;i<grr_data->tc.fa_ctrl.current_alloc.alloc.size_bitmap;i++) | |
3827 { | |
3828 ptr_alloc->alloc.bitmap[i] = grr_data->tc.fa_ctrl.current_alloc.alloc.bitmap[i] | ts_mask; | |
3829 } | |
3830 } | |
3831 | |
3832 return (tx_slots); | |
3833 | |
3834 } /* tc_set_fa_bitmap() */ | |
3835 | |
3836 | |
3837 /* | |
3838 +------------------------------------------------------------------------------ | |
3839 | Function : tc_send_ul_repeat_alloc_req | |
3840 +------------------------------------------------------------------------------ | |
3841 | Description : send the primitive MPHP_REPEAT_UL_FIXED_ALLOC_REQ | |
3842 | | |
3843 | Parameters : void | |
3844 | | |
3845 +------------------------------------------------------------------------------ | |
3846 */ | |
3847 GLOBAL void tc_send_ul_repeat_alloc_req( void) | |
3848 { | |
3849 PALLOC(ptr_2prim,MPHP_REPEAT_UL_FIXED_ALLOC_REQ); | |
3850 | |
3851 TRACE_FUNCTION( "tc_send_ul_repeat_alloc_req" ); | |
3852 | |
3853 ptr_2prim->repeat_alloc = grr_data->tc.fa_ctrl.repeat_alloc; | |
3854 ptr_2prim->ts_override = grr_data->tc.fa_ctrl.ts_overr; | |
3855 | |
3856 if(grr_data->tc.fa_ctrl.repeat_alloc) | |
3857 { | |
3858 ptr_2prim->p_tbf_start.tbf_start_present = 1; | |
3859 ptr_2prim->p_tbf_start.fn = grr_data->tc.fa_ctrl.current_alloc.alloc_start_fn; | |
3860 } | |
3861 else | |
3862 { | |
3863 ptr_2prim->p_tbf_start.tbf_start_present = 0; | |
3864 ptr_2prim->p_tbf_start.fn = 0xffffffff; | |
3865 } | |
3866 PSEND(hCommL1,ptr_2prim); | |
3867 | |
3868 } /* tc_send_ul_repeat_alloc_req() */ | |
3869 | |
3870 | |
3871 | |
3872 | |
3873 /* | |
3874 +------------------------------------------------------------------------------ | |
3875 | Function : tc_eval_ts_reconf | |
3876 +------------------------------------------------------------------------------ | |
3877 | Description : The function tc_eval_ts_reconf() evaluates a | |
3878 | Packet Timeslot reconfigure. | |
3879 | | |
3880 | Parameters : void | |
3881 | | |
3882 +------------------------------------------------------------------------------ | |
3883 */ | |
3884 GLOBAL T_EVAL_TS_RECONFIG tc_eval_ts_reconf ( void ) | |
3885 { | |
3886 MCAST(d_ts_reconfig,D_TS_RECONFIG); /* T_D_TS_RECONFIG */ | |
3887 T_EVAL_TS_RECONFIG result = E_TS_IGNORE; | |
3888 UBYTE tx_slots; | |
3889 UBYTE i,mask; | |
3890 | |
3891 T_GRR_STORE_TYPE grr_store_type = GRR_STORE_TYPE_NONE; | |
3892 | |
3893 TRACE_FUNCTION( "tc_eval_ts_reconf" ); | |
3894 | |
3895 grr_data->downlink_tbf.ctrl_ack_bit = 0; | |
3896 | |
3897 #ifdef REL99 | |
3898 /* This function is called only when TBF is active. Handling abnormal case | |
3899 * 8.7 While a TBF is in progress, if a mobile station receives a | |
3900 * PACKET UPLINK ASSIGNMENT, PACKET UPLINK ACK/NACK or PACKET TIMESLOT RECONFIGURE | |
3901 * message with message escape bit indicating EGPRS (resp. GPRS) contents whereas | |
3902 * the current TBF mode is GPRS (resp. EGPRS), the mobile station shall ignore the | |
3903 * message. | |
3904 */ | |
3905 if(d_ts_reconfig->egprs_flag) | |
3906 { | |
3907 TRACE_ERROR( " EGPRS TBF received in TS_RECONFIGURE " ); | |
3908 return E_TS_IGNORE; | |
3909 } | |
3910 #endif | |
3911 | |
3912 switch(grr_data->tbf_type) | |
3913 { | |
3914 case CGRLC_TBF_MODE_UL: | |
3915 /* | |
3916 * reassignment of uplink and downlink assignment | |
3917 */ | |
3918 grr_data->downlink_tbf.mac_mode = grr_data->uplink_tbf.mac_mode; | |
3919 grr_data->downlink_tbf.t3192 = FALSE; /* indicates if t3192 is running*/ | |
3920 grr_data->downlink_tbf.rlc_mode = d_ts_reconfig->dl_rlc_mode; | |
3921 | |
3922 if(d_ts_reconfig->v_dl_tfi EQ 0) | |
3923 { | |
3924 TRACE_ERROR( "No downlnik assignment in TS_RECONFIGURE " ); | |
3925 result = E_TS_RECONFIG_ERROR_RA; | |
3926 return result; | |
3927 } | |
3928 if((d_ts_reconfig->v_dyn_alloc_ts EQ 1) AND | |
3929 grr_data->uplink_tbf.mac_mode EQ FIXED_ALLOCATION) | |
3930 { | |
3931 TRACE_ERROR( "fixed alloc expected but dynamic alloc received" ); | |
3932 result = E_TS_RECONFIG_ERROR_RA; | |
3933 return result; | |
3934 } | |
3935 if(d_ts_reconfig->v_f_alloc_re EQ 1 AND | |
3936 grr_data->uplink_tbf.mac_mode EQ DYNAMIC_ALLOCATION) | |
3937 { | |
3938 TRACE_ERROR( "dynamic alloc expected but fixed alloc received" ); | |
3939 result = E_TS_RECONFIG_ERROR_RA; | |
3940 return result; | |
3941 } | |
3942 result = E_TS_UL_REASSIG_NEW_DL; | |
3943 break; | |
3944 case CGRLC_TBF_MODE_DL: | |
3945 grr_data->uplink_tbf.ti = 0; /* contention resolution NOT required */ | |
3946 if(d_ts_reconfig->v_dyn_alloc_ts) | |
3947 { | |
3948 if(d_ts_reconfig->dyn_alloc_ts.xdyn_alloc) | |
3949 grr_data->uplink_tbf.mac_mode =EDA; | |
3950 else | |
3951 grr_data->uplink_tbf.mac_mode =DA; | |
3952 } | |
3953 else if(d_ts_reconfig->v_f_alloc_re) | |
3954 { | |
3955 grr_data->uplink_tbf.mac_mode = FA; | |
3956 } | |
3957 /* | |
3958 * downlink tbf active, | |
3959 * assignment of uplink and downlink reassignment | |
3960 */ | |
3961 if(d_ts_reconfig->v_ul_tfi EQ 0) | |
3962 { | |
3963 TRACE_ERROR( "No uplnik tfi in TS_RECONFIGURE" ); | |
3964 result = E_TS_RECONFIG_ERROR_RA; | |
3965 return result; | |
3966 } | |
3967 if ((grr_data->downlink_tbf.rlc_mode NEQ d_ts_reconfig->dl_rlc_mode) AND !d_ts_reconfig->ctrl_ack) | |
3968 { | |
3969 TRACE_ERROR("Diff rlc mode in TS_RECONFIGURE..msg rejected..aborting"); | |
3970 result = E_TS_RECONFIG_ERROR_RA; | |
3971 return result; | |
3972 } | |
3973 grr_data->downlink_tbf.rlc_mode = d_ts_reconfig->dl_rlc_mode; | |
3974 result = E_TS_NEW_UL_DL_REASSIG; | |
3975 break; | |
3976 case CGRLC_TBF_MODE_DL_UL: | |
3977 | |
3978 if((d_ts_reconfig->v_dyn_alloc_ts EQ 1) AND | |
3979 grr_data->uplink_tbf.mac_mode EQ FIXED_ALLOCATION) | |
3980 { | |
3981 TRACE_ERROR( "fixed alloc expected but dynamic alloc received" ); | |
3982 result = E_TS_RECONFIG_ERROR_RA; | |
3983 return result; | |
3984 } | |
3985 if(d_ts_reconfig->v_f_alloc_re EQ 1 AND | |
3986 grr_data->uplink_tbf.mac_mode EQ DYNAMIC_ALLOCATION) | |
3987 { | |
3988 TRACE_ERROR( "dynamic alloc expected but fixed alloc received" ); | |
3989 result = E_TS_RECONFIG_ERROR_RA; | |
3990 return result; | |
3991 } | |
3992 if ((grr_data->downlink_tbf.rlc_mode NEQ d_ts_reconfig->dl_rlc_mode) AND !d_ts_reconfig->ctrl_ack) | |
3993 { | |
3994 TRACE_ERROR("Diff rlc mode in TS_RECONFIGURE..msg rejected..aborting"); | |
3995 result = E_TS_RECONFIG_ERROR_RA; | |
3996 return result; | |
3997 } | |
3998 grr_data->downlink_tbf.rlc_mode = d_ts_reconfig->dl_rlc_mode; | |
3999 result = E_TS_UL_REASSIG_DL_REASSIG; | |
4000 break; | |
4001 default: | |
4002 { | |
4003 TRACE_ERROR( " tc_eval_ts_reconf unexpected" ); | |
4004 return E_TS_IGNORE; | |
4005 } | |
4006 } | |
4007 | |
4008 /* | |
4009 * set DOWNLINK data base | |
4010 */ | |
4011 | |
4012 grr_data->downlink_tbf.ts_usage = d_ts_reconfig->dl_tn_alloc; | |
4013 grr_data->downlink_tbf.nts = grr_calc_nr_of_set_bits(grr_data->downlink_tbf.ts_usage); | |
4014 | |
4015 if(d_ts_reconfig->ctrl_ack) | |
4016 { | |
4017 if(grr_data->downlink_tbf.t3192) | |
4018 { | |
4019 grr_data->downlink_tbf.ctrl_ack_bit= 1; | |
4020 grr_data->downlink_tbf.t3192 = FALSE; | |
4021 } | |
4022 else | |
4023 { | |
4024 result = E_TS_RECONFIG_ERROR_RA; | |
4025 TRACE_EVENT("TS_RECONF INVALID->error_ra, ctrl ack bit set but t3192 is not running"); | |
4026 return result; | |
4027 } | |
4028 } | |
4029 | |
4030 /* | |
4031 * set UPLINK data base | |
4032 */ | |
4033 grr_data->uplink_tbf.cs_mode = d_ts_reconfig->chan_coding_cmd; | |
4034 grr_data->uplink_tbf.tlli_cs_mode = 1; | |
4035 grr_data->uplink_tbf.polling_bit = 0xFF; | |
4036 grr_data->uplink_tbf.ti = 0; | |
4037 | |
4038 /* | |
4039 * set glob parameters | |
4040 */ | |
4041 | |
4042 if(d_ts_reconfig->v_freq_par) | |
4043 { | |
4044 /* SZML-TC/091 */ | |
4045 /* | |
4046 * here is also to consider a possiblely existing dl_tbf slot ussage:SZML-TC/092 | |
4047 */ | |
4048 } | |
4049 if(d_ts_reconfig->v_dyn_alloc_ts) | |
4050 { | |
4051 tx_slots = 0; | |
4052 grr_data->uplink_tbf.ts_usage = 0; | |
4053 if(d_ts_reconfig->dyn_alloc_ts.v_tn_alloc) | |
4054 { | |
4055 for(i = 0,mask = 0x80;i < 8;i++) | |
4056 { | |
4057 if(d_ts_reconfig->dyn_alloc_ts.tn_alloc[i].v_usf) | |
4058 { | |
4059 grr_data->uplink_tbf.ts_usage |= mask; | |
4060 tx_slots++; | |
4061 } | |
4062 mask >>= 1; | |
4063 } | |
4064 } | |
4065 else if(d_ts_reconfig->dyn_alloc_ts.v_tn_alloc_pwr) | |
4066 { | |
4067 for(i = 0,mask = 0x80;i < 8;i++) | |
4068 { | |
4069 if(d_ts_reconfig->dyn_alloc_ts.tn_alloc_pwr.usf_array[i].v_usf_g) | |
4070 { | |
4071 grr_data->uplink_tbf.ts_usage |= mask; | |
4072 tx_slots++; | |
4073 } | |
4074 mask >>= 1; | |
4075 } | |
4076 | |
4077 grr_store_type = GRR_STORE_TYPE_TN_ALLOC_PWR; | |
4078 } | |
4079 grr_data->uplink_tbf.nts = tx_slots; | |
4080 } | |
4081 else if(d_ts_reconfig->v_f_alloc_re) | |
4082 { | |
4083 grr_data->uplink_tbf.ts_usage = 0; | |
4084 tx_slots=0; | |
4085 if(d_ts_reconfig->f_alloc_re.v_ul_ts_alloc) | |
4086 { | |
4087 grr_data->uplink_tbf.ts_usage = d_ts_reconfig->f_alloc_re.ul_ts_alloc; | |
4088 /*calculate number of timeslots*/ | |
4089 tx_slots = grr_calc_nr_of_set_bits(grr_data->uplink_tbf.ts_usage); | |
4090 } | |
4091 else if(d_ts_reconfig->f_alloc_re.v_pwr_par) | |
4092 { | |
4093 for(i = 0,mask = 0x80;i < 8;i++) | |
4094 { | |
4095 if(d_ts_reconfig->f_alloc_re.pwr_par.gamma_tn[i].v_gamma) | |
4096 { | |
4097 grr_data->uplink_tbf.ts_usage |= mask; | |
4098 tx_slots++; | |
4099 } | |
4100 mask >>= 1; | |
4101 } | |
4102 | |
4103 grr_store_type = GRR_STORE_TYPE_PWR_PAR; | |
4104 } | |
4105 grr_data->uplink_tbf.nts = tx_slots; | |
4106 } | |
4107 else | |
4108 { | |
4109 TRACE_ERROR ("Packet Timeslot Reconfigure without allocation type - corrupt airmessage!"); | |
4110 } | |
4111 | |
4112 if( !handle_ms_cap(UL_DL_ASSIGNMENT) ) | |
4113 { | |
4114 result = E_TS_RECONFIG_ERROR_RA; | |
4115 TRACE_EVENT("tc_eval_.. will return E_TS_RECONFIG_ERROR_RA (ms class error)"); | |
4116 } | |
4117 | |
4118 if( tc_check_and_save_freq( ) EQ FALSE ) | |
4119 { | |
4120 result = E_TS_RECONFIG_ERROR_RA; | |
4121 TRACE_EVENT("tc_eval_.. will return E_TS_RECONFIG_ERROR_RA (frequencies wrong)"); | |
4122 } | |
4123 | |
4124 if( result NEQ E_TS_RECONFIG_ERROR_RA AND | |
4125 result NEQ E_TS_IGNORE ) | |
4126 { | |
4127 switch( grr_store_type ) | |
4128 { | |
4129 case GRR_STORE_TYPE_TN_ALLOC_PWR: | |
4130 grr_store_type_tn_alloc_pwr( &d_ts_reconfig->dyn_alloc_ts.tn_alloc_pwr ); | |
4131 break; | |
4132 | |
4133 case GRR_STORE_TYPE_PWR_PAR: | |
4134 grr_store_type_pwr_par( &d_ts_reconfig->f_alloc_re.pwr_par, FALSE ); | |
4135 break; | |
4136 | |
4137 default: | |
4138 /* do nothing */ | |
4139 break; | |
4140 } | |
4141 } | |
4142 | |
4143 return result; | |
4144 } /* tc_eval_ts_reconf() */ | |
4145 | |
4146 | |
4147 | |
4148 | |
4149 | |
4150 | |
4151 | |
4152 | |
4153 /* | |
4154 +------------------------------------------------------------------------------ | |
4155 | Function : tc_stop_timer_t3172 | |
4156 +------------------------------------------------------------------------------ | |
4157 | Description : The function tc_stop_timer_t3172() | |
4158 | SZML-TC/094 this timer start | |
4159 | caused p access reject will be done | |
4160 | with cell reselection procedures | |
4161 | | |
4162 | Parameters : none | |
4163 | | |
4164 +------------------------------------------------------------------------------ | |
4165 */ | |
4166 GLOBAL void tc_stop_timer_t3172 ( void ) | |
4167 { | |
4168 TRACE_FUNCTION( "tc_stop_timer_t3172" ); | |
4169 | |
4170 vsi_t_stop(GRR_handle,T3172_1); | |
4171 | |
4172 } /* tc_stop_timer_t3172() */ | |
4173 | |
4174 /* | |
4175 +------------------------------------------------------------------------------ | |
4176 | Function : tc_close_gaps_in_ctrl_blk_seq | |
4177 +------------------------------------------------------------------------------ | |
4178 | Description : The function tc_close_gaps_in_ctrl_blk_seq reorders the queue | |
4179 | holding the order which is used to identify the next control | |
4180 | block to sent. | |
4181 | | |
4182 | Parameters : index - at this index the reordering starts | |
4183 | | |
4184 +------------------------------------------------------------------------------ | |
4185 */ | |
4186 LOCAL void tc_close_gaps_in_ctrl_blk_seq ( UBYTE index ) | |
4187 { | |
4188 TRACE_FUNCTION( "tc_close_gaps_in_ctrl_blk_seq" ); | |
4189 | |
4190 while( index < MAX_CTRL_BLK_NUM AND | |
4191 grr_data->tc.ul_ctrl_blk.seq[index] NEQ MAX_CTRL_BLK_NUM ) | |
4192 { | |
4193 grr_data->tc.ul_ctrl_blk.seq[index-1] = grr_data->tc.ul_ctrl_blk.seq[index]; | |
4194 | |
4195 index++; | |
4196 } | |
4197 | |
4198 grr_data->tc.ul_ctrl_blk.seq[index-1] = MAX_CTRL_BLK_NUM; | |
4199 | |
4200 } /* tc_close_gaps_in_ctrl_blk_seq() */ | |
4201 | |
4202 /* | |
4203 +------------------------------------------------------------------------------ | |
4204 | Function : tc_store_ctrl_blk | |
4205 +------------------------------------------------------------------------------ | |
4206 | Description : | |
4207 | | |
4208 | Parameters : | |
4209 | | |
4210 +------------------------------------------------------------------------------ | |
4211 */ | |
4212 GLOBAL BOOL tc_store_ctrl_blk ( T_BLK_OWNER blk_owner, void *blk_struct ) | |
4213 { | |
4214 UBYTE i; /* used for counting */ | |
4215 BOOL result = FALSE; /* indicates whether control block is */ | |
4216 /* stored successfully or not */ | |
4217 T_BLK_INDEX blk_index; /* index to the control block buffer */ | |
4218 | |
4219 TRACE_FUNCTION( "tc_store_ctrl_msg" ); | |
4220 | |
4221 /* | |
4222 * we have to find a free buffer for the control block which is | |
4223 * indicated by the index to the control block buffer | |
4224 */ | |
4225 blk_index = MAX_CTRL_BLK_NUM; | |
4226 | |
4227 switch( blk_owner ) | |
4228 { | |
4229 case( CGRLC_BLK_OWNER_CTRL ): | |
4230 if( grr_data->tc.ul_ctrl_blk.blk[BLK_INDEX_CTRL].state EQ BLK_STATE_NONE ) | |
4231 { | |
4232 blk_index = BLK_INDEX_CTRL; | |
4233 } | |
4234 break; | |
4235 | |
4236 case( CGRLC_BLK_OWNER_CS ): | |
4237 if( grr_data->tc.ul_ctrl_blk.blk[BLK_INDEX_CS].state EQ BLK_STATE_NONE ) | |
4238 { | |
4239 blk_index = BLK_INDEX_CS; | |
4240 } | |
4241 break; | |
4242 | |
4243 case( CGRLC_BLK_OWNER_TM ): | |
4244 if( grr_data->tc.ul_ctrl_blk.blk[BLK_INDEX_TC].state EQ BLK_STATE_NONE ) | |
4245 { | |
4246 blk_index = BLK_INDEX_TC; | |
4247 } | |
4248 break; | |
4249 | |
4250 case( CGRLC_BLK_OWNER_MEAS ): | |
4251 | |
4252 blk_index = BLK_INDEX_MEAS; | |
4253 | |
4254 while( blk_index < MAX_CTRL_BLK_NUM AND | |
4255 grr_data->tc.ul_ctrl_blk.blk[blk_index].state NEQ BLK_STATE_NONE ) | |
4256 { | |
4257 blk_index++; | |
4258 } | |
4259 break; | |
4260 | |
4261 default: | |
4262 /* do nothing */ | |
4263 break; | |
4264 } | |
4265 | |
4266 /* | |
4267 * check whether the control block buffer is free, | |
4268 */ | |
4269 if( blk_index < MAX_CTRL_BLK_NUM ) | |
4270 { | |
4271 /* | |
4272 * check the queue holding the order which is used to identify the next | |
4273 * control block to send | |
4274 */ | |
4275 i = 0; | |
4276 | |
4277 while( i < MAX_CTRL_BLK_NUM AND | |
4278 grr_data->tc.ul_ctrl_blk.seq[i] NEQ MAX_CTRL_BLK_NUM ) | |
4279 { | |
4280 i++; | |
4281 } | |
4282 | |
4283 /* | |
4284 * check whether there is a free entry in the order queue, | |
4285 * in case the check fails, there is something wrong with the concept | |
4286 */ | |
4287 if( i < MAX_CTRL_BLK_NUM ) | |
4288 { | |
4289 /* | |
4290 * store the control block data and state in the queues | |
4291 */ | |
4292 grr_encode_ul_ctrl_block | |
4293 ( ( UBYTE* )&grr_data->tc.ul_ctrl_blk.blk[blk_index].data[0], | |
4294 ( UBYTE* )blk_struct ); | |
4295 | |
4296 grr_data->tc.ul_ctrl_blk.blk[blk_index].state = BLK_STATE_ALLOCATED; | |
4297 grr_data->tc.ul_ctrl_blk.blk[blk_index].owner = blk_owner; | |
4298 grr_data->tc.ul_ctrl_blk.seq[i] = blk_index; | |
4299 | |
4300 if( i < MAX_CTRL_BLK_NUM - 1 ) | |
4301 { | |
4302 grr_data->tc.ul_ctrl_blk.seq[i+1] = MAX_CTRL_BLK_NUM; | |
4303 } | |
4304 | |
4305 result = TRUE; | |
4306 } | |
4307 else | |
4308 { | |
4309 TRACE_ERROR( "tc_store_ctrl_blk: no free entry in queue found" ); | |
4310 } | |
4311 } | |
4312 | |
4313 if( result EQ FALSE ) | |
4314 { | |
4315 if( blk_owner EQ CGRLC_BLK_OWNER_MEAS ) | |
4316 { | |
4317 TRACE_EVENT( "tc_store_ctrl_blk: no table entry allocated" ); | |
4318 } | |
4319 else | |
4320 { | |
4321 TRACE_ERROR( "tc_store_ctrl_blk: no table entry allocated" ); | |
4322 } | |
4323 } | |
4324 | |
4325 return( result ); | |
4326 | |
4327 } /* tc_store_ctrl_blk() */ | |
4328 | |
4329 /* | |
4330 +------------------------------------------------------------------------------ | |
4331 | Function : tc_cancel_ctrl_blk | |
4332 +------------------------------------------------------------------------------ | |
4333 | Description : | |
4334 | | |
4335 | Parameters : | |
4336 | | |
4337 +------------------------------------------------------------------------------ | |
4338 */ | |
4339 GLOBAL BOOL tc_cancel_ctrl_blk ( T_BLK_OWNER blk_owner ) | |
4340 { | |
4341 BOOL result = FALSE; | |
4342 UBYTE i = 0; | |
4343 UBYTE blk_index = grr_data->tc.ul_ctrl_blk.seq[i]; | |
4344 | |
4345 TRACE_FUNCTION( "tc_cancel_ctrl_blk" ); | |
4346 | |
4347 | |
4348 while( blk_index NEQ MAX_CTRL_BLK_NUM AND | |
4349 result EQ FALSE ) | |
4350 { | |
4351 if( grr_data->tc.ul_ctrl_blk.blk[blk_index].owner EQ blk_owner AND | |
4352 grr_data->tc.ul_ctrl_blk.blk[blk_index].state EQ BLK_STATE_ALLOCATED ) | |
4353 { | |
4354 /* | |
4355 * mark the entry in the queue as free | |
4356 */ | |
4357 grr_data->tc.ul_ctrl_blk.blk[blk_index].state = BLK_STATE_NONE; | |
4358 grr_data->tc.ul_ctrl_blk.blk[blk_index].owner = CGRLC_BLK_OWNER_NONE; | |
4359 | |
4360 tc_close_gaps_in_ctrl_blk_seq( (UBYTE)( i + 1 ) ); | |
4361 | |
4362 /* | |
4363 * notify owner of the control block, TC always runs in unacknowledged mode | |
4364 */ | |
4365 if( blk_owner NEQ CGRLC_BLK_OWNER_TM ) | |
4366 { | |
4367 sig_tc_ctrl_control_block_result( blk_owner, FALSE ); | |
4368 } | |
4369 | |
4370 result = TRUE; | |
4371 } | |
4372 | |
4373 i++; | |
4374 if( i < MAX_CTRL_BLK_NUM ) | |
4375 { | |
4376 blk_index = grr_data->tc.ul_ctrl_blk.seq[i]; | |
4377 } | |
4378 else | |
4379 { | |
4380 blk_index = MAX_CTRL_BLK_NUM; | |
4381 } | |
4382 } | |
4383 | |
4384 if( result EQ FALSE ) | |
4385 { | |
4386 TRACE_EVENT( "tc_cancel_ctrl_blk: no block found" ); | |
4387 } | |
4388 | |
4389 return( result ); | |
4390 | |
4391 } /* tc_cancel_ctrl_blk() */ | |
4392 | |
4393 /* | |
4394 +------------------------------------------------------------------------------ | |
4395 | Function : tc_set_start_ctrl_blk | |
4396 +------------------------------------------------------------------------------ | |
4397 | Description : | |
4398 | | |
4399 | Parameters : | |
4400 | | |
4401 +------------------------------------------------------------------------------ | |
4402 */ | |
4403 GLOBAL UBYTE* tc_set_start_ctrl_blk ( UBYTE *index ) | |
4404 { | |
4405 UBYTE i = 0; | |
4406 T_BLK_INDEX blk_index = MAX_CTRL_BLK_NUM; | |
4407 | |
4408 TRACE_FUNCTION( "tc_set_start_ctrl_blk" ); | |
4409 | |
4410 while( i < MAX_CTRL_BLK_NUM AND | |
4411 grr_data->tc.ul_ctrl_blk.seq[i] NEQ MAX_CTRL_BLK_NUM AND | |
4412 blk_index EQ MAX_CTRL_BLK_NUM ) | |
4413 { | |
4414 blk_index = grr_data->tc.ul_ctrl_blk.seq[i]; | |
4415 | |
4416 if( grr_data->tc.ul_ctrl_blk.blk[blk_index].state EQ BLK_STATE_ALLOCATED ) | |
4417 { | |
4418 grr_data->tc.ul_ctrl_blk.blk[blk_index].state = BLK_STATE_SENT_REQ; | |
4419 | |
4420 /* | |
4421 * the control block was encoded without having correct information | |
4422 * about the value of the R bit. So we have to set the correct value now. | |
4423 */ | |
4424 grr_data->tc.ul_ctrl_blk.blk[blk_index].data[0] = | |
4425 grr_get_ul_ctrl_block_header( grr_data->r_bit ); | |
4426 } | |
4427 else | |
4428 { | |
4429 blk_index = MAX_CTRL_BLK_NUM; | |
4430 } | |
4431 | |
4432 i++; | |
4433 } | |
4434 | |
4435 *index = blk_index; | |
4436 | |
4437 return( blk_index EQ MAX_CTRL_BLK_NUM ? | |
4438 NULL : grr_data->tc.ul_ctrl_blk.blk[blk_index].data ); | |
4439 | |
4440 } /* tc_set_start_ctrl_blk() */ | |
4441 | |
4442 /* | |
4443 +------------------------------------------------------------------------------ | |
4444 | Function : tc_set_stop_ctrl_blk | |
4445 +------------------------------------------------------------------------------ | |
4446 | Description : | |
4447 | | |
4448 | Parameters : | |
4449 | | |
4450 +------------------------------------------------------------------------------ | |
4451 */ | |
4452 GLOBAL T_BLK_INDEX tc_set_stop_ctrl_blk | |
4453 ( BOOL is_tx_success, T_BLK_OWNER srch_owner, T_BLK_INDEX start_index ) | |
4454 { | |
4455 T_BLK_INDEX blk_index = grr_data->tc.ul_ctrl_blk.seq[start_index]; | |
4456 T_BLK_INDEX nxt_index; | |
4457 | |
4458 TRACE_FUNCTION( "tc_set_stop_ctrl_blk" ); | |
4459 | |
4460 if( blk_index < MAX_CTRL_BLK_NUM ) | |
4461 { | |
4462 T_BLK_OWNER blk_owner = grr_data->tc.ul_ctrl_blk.blk[blk_index].owner; | |
4463 | |
4464 if( srch_owner EQ CGRLC_BLK_OWNER_NONE OR | |
4465 srch_owner EQ blk_owner ) | |
4466 { | |
4467 /* | |
4468 * mark the entry in the queue as free | |
4469 */ | |
4470 grr_data->tc.ul_ctrl_blk.blk[blk_index].state = BLK_STATE_NONE; | |
4471 grr_data->tc.ul_ctrl_blk.blk[blk_index].owner = CGRLC_BLK_OWNER_NONE; | |
4472 | |
4473 tc_close_gaps_in_ctrl_blk_seq( 1 ); | |
4474 | |
4475 /* | |
4476 * notify owner of the control block, TC always runs in unacknowledged mode | |
4477 */ | |
4478 if( blk_owner NEQ CGRLC_BLK_OWNER_TM ) | |
4479 { | |
4480 sig_tc_ctrl_control_block_result( blk_owner, is_tx_success ); | |
4481 } | |
4482 | |
4483 nxt_index = start_index; | |
4484 } | |
4485 else | |
4486 { | |
4487 nxt_index = start_index + 1; | |
4488 } | |
4489 } | |
4490 else | |
4491 { | |
4492 nxt_index = MAX_CTRL_BLK_NUM; | |
4493 } | |
4494 | |
4495 return( nxt_index ); | |
4496 | |
4497 } /* tc_set_stop_ctrl_blk() */ | |
4498 | |
4499 /* | |
4500 +------------------------------------------------------------------------------ | |
4501 | Function : tc_set_stop_tc_ctrl_blk | |
4502 +------------------------------------------------------------------------------ | |
4503 | Description : | |
4504 | | |
4505 | Parameters : | |
4506 | | |
4507 +------------------------------------------------------------------------------ | |
4508 */ | |
4509 GLOBAL void tc_set_stop_tc_ctrl_blk ( void ) | |
4510 { | |
4511 T_BLK_INDEX start_index = 0; | |
4512 | |
4513 TRACE_FUNCTION( "tc_set_stop_tc_ctrl_blk" ); | |
4514 | |
4515 while | |
4516 ( | |
4517 ( start_index = tc_set_stop_ctrl_blk( FALSE, CGRLC_BLK_OWNER_TM, start_index ) ) | |
4518 NEQ MAX_CTRL_BLK_NUM | |
4519 ){}; | |
4520 } /* tc_set_stop_tc_ctrl_blk() */ | |
4521 | |
4522 /* | |
4523 +------------------------------------------------------------------------------ | |
4524 | Function : tc_set_stop_all_ctrl_blk | |
4525 +------------------------------------------------------------------------------ | |
4526 | Description : | |
4527 | | |
4528 | Parameters : | |
4529 | | |
4530 +------------------------------------------------------------------------------ | |
4531 */ | |
4532 GLOBAL void tc_set_stop_all_ctrl_blk ( void ) | |
4533 { | |
4534 T_BLK_INDEX start_index = 0; | |
4535 | |
4536 TRACE_FUNCTION( "tc_set_stop_all_ctrl_blk" ); | |
4537 | |
4538 while | |
4539 ( | |
4540 ( start_index = tc_set_stop_ctrl_blk( FALSE, | |
4541 CGRLC_BLK_OWNER_NONE, | |
4542 start_index ) ) NEQ MAX_CTRL_BLK_NUM | |
4543 ){}; | |
4544 } /* tc_set_stop_all_ctrl_blk() */ | |
4545 | |
4546 | |
4547 /* | |
4548 +------------------------------------------------------------------------------ | |
4549 | Function : tc_check_access_is_needed | |
4550 +------------------------------------------------------------------------------ | |
4551 | Description : The function tc_check_access_is_needed () .... | |
4552 | | |
4553 | Parameters : void | |
4554 | | |
4555 +------------------------------------------------------------------------------ | |
4556 */ | |
4557 GLOBAL void tc_check_access_is_needed ( T_CHECK_ACCESS_CAUSE cause ) | |
4558 { | |
4559 TRACE_FUNCTION( "tc_check_access_is_needed " ); | |
4560 | |
4561 if( ((grr_t_status( T3172_1 ) > 0) OR (grr_t_status( T3170 ) > 0) ) AND | |
4562 (grr_t_status( T3176 ) EQ 0)) | |
4563 { | |
4564 if( cause EQ CAC_T3170_EXPIRED ) | |
4565 { | |
4566 sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_IDLE, TASK_STOP_DUMMY_VALUE ); | |
4567 } | |
4568 | |
4569 TRACE_EVENT_P3("ACCESS_REJ RUNNING t3170=%d t3172=%d t3176=%d",grr_t_status( T3170 ) | |
4570 ,grr_t_status( T3172_1 ) | |
4571 ,grr_t_status( T3176 )); | |
4572 return; | |
4573 } | |
4574 | |
4575 switch(grr_data->tbf_type) | |
4576 { | |
4577 case CGRLC_TBF_MODE_NULL: | |
4578 if(grr_data->tc.num_of_rels_running) | |
4579 { | |
4580 TRACE_EVENT_P1("WAIT FOR %d REL CON ", grr_data->tc.num_of_rels_running); | |
4581 return; | |
4582 } | |
4583 SET_STATE( TC, TC_WAIT_STOP_TASK_CNF ); | |
4584 sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_ACCESS, TASK_STOP_DUMMY_VALUE ); | |
4585 | |
4586 | |
4587 break; | |
4588 case CGRLC_TBF_MODE_DL: | |
4589 case CGRLC_TBF_MODE_UL: | |
4590 case CGRLC_TBF_MODE_DL_UL: | |
4591 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
4592 case CGRLC_TBF_MODE_2PA: | |
4593 #endif | |
4594 break; | |
4595 default: | |
4596 TRACE_ERROR("unknown tbf type during uplink access"); | |
4597 break; | |
4598 } | |
4599 } /* tc_check_access_is_needed */ | |
4600 | |
4601 /* | |
4602 +------------------------------------------------------------------------------ | |
4603 | Function : tc_stop_normal_burst_req | |
4604 +------------------------------------------------------------------------------ | |
4605 | Description : this function sends the primitive MPHP_STOP_SINGLE_BLOCK_REQ | |
4606 | | |
4607 | Parameters : | |
4608 | | |
4609 +------------------------------------------------------------------------------ | |
4610 */ | |
4611 GLOBAL void tc_stop_normal_burst_req ( void ) | |
4612 { | |
4613 TRACE_FUNCTION( "tc_stop_normal_burst_req" ); | |
4614 | |
4615 { | |
4616 PALLOC(mphp_stop_single_block_req,MPHP_STOP_SINGLE_BLOCK_REQ); | |
4617 PSEND(hCommL1,mphp_stop_single_block_req); | |
4618 } | |
4619 } /* tc_stop_normal_burst_req() */ | |
4620 | |
4621 | |
4622 | |
4623 /* | |
4624 +------------------------------------------------------------------------------ | |
4625 | Function : tc_malloc_assign | |
4626 +------------------------------------------------------------------------------ | |
4627 | Description : The function tc_malloc_assign() .... | |
4628 | | |
4629 | Parameters : | |
4630 | | |
4631 +------------------------------------------------------------------------------ | |
4632 */ | |
4633 GLOBAL void tc_malloc_assign ( void ) | |
4634 { | |
4635 MCAST( p_d_dl_assign, D_DL_ASSIGN ); | |
4636 | |
4637 TRACE_FUNCTION( "tc_malloc_assign" ); | |
4638 | |
4639 if( grr_data->tc.p_assign EQ NULL ) | |
4640 { | |
4641 if( p_d_dl_assign->msg_type EQ D_DL_ASSIGN ) | |
4642 { | |
4643 MALLOC( grr_data->tc.p_assign, sizeof( T_D_DL_ASSIGN ) ); | |
4644 } | |
4645 else | |
4646 { | |
4647 MALLOC( grr_data->tc.p_assign, sizeof( T_D_UL_ASSIGN ) ); | |
4648 } | |
4649 } | |
4650 else | |
4651 { | |
4652 TRACE_ERROR( "tc_malloc_assign: fatal error, memory reallocation not implemented" ); | |
4653 } | |
4654 | |
4655 if( p_d_dl_assign->msg_type EQ D_DL_ASSIGN ) | |
4656 { | |
4657 *grr_data->tc.p_assign = *( ( T_D_DL_ASSIGN * )_decodedMsg ); | |
4658 } | |
4659 else | |
4660 { | |
4661 *( ( T_D_UL_ASSIGN * )grr_data->tc.p_assign ) = *( ( T_D_UL_ASSIGN * )_decodedMsg ); | |
4662 } | |
4663 } /* tc_malloc_assign() */ | |
4664 | |
4665 /* | |
4666 +------------------------------------------------------------------------------ | |
4667 | Function : tc_mfree_assign | |
4668 +------------------------------------------------------------------------------ | |
4669 | Description : The function tc_mfree_assign() .... | |
4670 | | |
4671 | Parameters : | |
4672 | | |
4673 +------------------------------------------------------------------------------ | |
4674 */ | |
4675 GLOBAL void tc_mfree_assign ( BOOL restore_data ) | |
4676 { | |
4677 TRACE_FUNCTION( "tc_mfree_assign" ); | |
4678 | |
4679 if( grr_data->tc.p_assign NEQ NULL ) | |
4680 { | |
4681 if( restore_data ) | |
4682 { | |
4683 if( grr_data->tc.p_assign->msg_type EQ D_DL_ASSIGN ) | |
4684 { | |
4685 *( ( T_D_DL_ASSIGN * )_decodedMsg ) = *grr_data->tc.p_assign; | |
4686 } | |
4687 else | |
4688 { | |
4689 *( ( T_D_UL_ASSIGN * )_decodedMsg ) = *( ( T_D_UL_ASSIGN * )grr_data->tc.p_assign ); | |
4690 } | |
4691 } | |
4692 | |
4693 MFREE( grr_data->tc.p_assign ); | |
4694 grr_data->tc.p_assign = NULL; | |
4695 } | |
4696 else | |
4697 { | |
4698 TRACE_ERROR( "tc_mfree_assign: fatal error, no memory allocated" ); | |
4699 } | |
4700 } /* tc_mfree_assign() */ | |
4701 | |
4702 /* | |
4703 +------------------------------------------------------------------------------ | |
4704 | Function : tc_prepare_send_tbf_release_req | |
4705 +------------------------------------------------------------------------------ | |
4706 | Description : The function tc_prepare_send_tbf_release_req() .... | |
4707 | | |
4708 | Parameters : | |
4709 | | |
4710 +------------------------------------------------------------------------------ | |
4711 */ | |
4712 LOCAL void tc_prepare_send_tbf_release_req( T_TBF_TYPE tbf_type ) | |
4713 { | |
4714 TRACE_FUNCTION( "tc_prepare_send_tbf_release_req" ); | |
4715 | |
4716 if( grr_is_pbcch_present( ) AND tbf_type EQ grr_data->tbf_type ) | |
4717 { | |
4718 grr_data->tc.last_tbf_type = tbf_type; | |
4719 | |
4720 grr_data->tc.num_of_rels_running++; | |
4721 | |
4722 sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_RELEASED, TASK_STOP_DUMMY_VALUE ); | |
4723 } | |
4724 else | |
4725 { | |
4726 tc_send_tbf_release_req( tbf_type, TRUE ); | |
4727 } | |
4728 } /* tc_prepare_send_tbf_release_req() */ | |
4729 | |
4730 /* | |
4731 +------------------------------------------------------------------------------ | |
4732 | Function : tc_send_tbf_release_req | |
4733 +------------------------------------------------------------------------------ | |
4734 | Description : The function tc_send_tbf_release_req() .... | |
4735 | | |
4736 | Parameters : | |
4737 | | |
4738 +------------------------------------------------------------------------------ | |
4739 */ | |
4740 GLOBAL void tc_send_tbf_release_req( T_TBF_TYPE tbf_type, BOOL is_synchron ) | |
4741 { | |
4742 UBYTE rel_req_tbf_type; | |
4743 UBYTE transid; | |
4744 | |
4745 TRACE_FUNCTION( "tc_send_tbf_release_req" ); | |
4746 | |
4747 switch( tbf_type ) | |
4748 { | |
4749 case CGRLC_TBF_MODE_UL: rel_req_tbf_type = UL_ASSIGNMENT; break; | |
4750 case CGRLC_TBF_MODE_DL: rel_req_tbf_type = DL_ASSIGNMENT; break; | |
4751 case CGRLC_TBF_MODE_DL_UL: rel_req_tbf_type = UL_DL_ASSIGNMENT; break; | |
4752 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
4753 case CGRLC_TBF_MODE_2PA: rel_req_tbf_type = UL_TP_ACCESS; break; | |
4754 #endif | |
4755 | |
4756 default: | |
4757 TRACE_ERROR( "tc_send_tbf_release_req: unknown tbf type" ); | |
4758 return; | |
4759 } | |
4760 | |
4761 { | |
4762 PALLOC(mphp_tbf_release_req,MPHP_TBF_RELEASE_REQ); | |
4763 mphp_tbf_release_req->tbf_type = rel_req_tbf_type; | |
4764 PSEND(hCommL1,mphp_tbf_release_req); | |
4765 | |
4766 if( is_synchron ) | |
4767 { | |
4768 grr_data->tc.num_of_rels_running++; | |
4769 } | |
4770 } | |
4771 | |
4772 switch(rel_req_tbf_type) | |
4773 { | |
4774 case UL_ASSIGNMENT: | |
4775 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
4776 case UL_TP_ACCESS: | |
4777 #endif | |
4778 memset(&grr_data->uplink_tbf,0xEE,sizeof(T_UL_TBF)); | |
4779 grr_data->test_mode = CGRLC_NO_TEST_MODE; | |
4780 break; | |
4781 case DL_ASSIGNMENT: | |
4782 transid = grr_data->downlink_tbf.trans_id; | |
4783 memset(&grr_data->downlink_tbf,0xEE,sizeof(T_DL_TBF)); | |
4784 grr_data->downlink_tbf.trans_id = transid; | |
4785 break; | |
4786 case UL_DL_ASSIGNMENT: | |
4787 transid = grr_data->downlink_tbf.trans_id; | |
4788 memset(&grr_data->uplink_tbf,0xEE,sizeof(T_UL_TBF)); | |
4789 memset(&grr_data->downlink_tbf,0xEE,sizeof(T_DL_TBF)); | |
4790 grr_data->test_mode = CGRLC_NO_TEST_MODE; | |
4791 grr_data->downlink_tbf.trans_id = transid; | |
4792 break; | |
4793 } | |
4794 | |
4795 | |
4796 | |
4797 } /* tc_send_tbf_release_req() */ | |
4798 | |
4799 | |
4800 | |
4801 /* | |
4802 +------------------------------------------------------------------------------ | |
4803 | Function : tc_get_t3170_value | |
4804 +------------------------------------------------------------------------------ | |
4805 | Description : The function tc_get_t3170_value() calculates T3170 and returns it | |
4806 | | |
4807 | Parameters : return T_TIME | |
4808 | | |
4809 +------------------------------------------------------------------------------ | |
4810 */ | |
4811 GLOBAL T_TIME tc_get_t3170_value(void) | |
4812 { | |
4813 T_TIME t3170_value; | |
4814 | |
4815 t3170_value = s_table[psc_db->prach.s_prach]; | |
4816 | |
4817 if(S_VALUE_RESERVED EQ t3170_value) | |
4818 t3170_value = 0; | |
4819 | |
4820 t3170_value *= 2; | |
4821 t3170_value += tx_int_table[psc_db->prach.tx_int]; | |
4822 /* T3170 value = TX_INT + 2 * S from prach control parameters */ | |
4823 /* see gsm 04.60 13.1 */ | |
4824 t3170_value *= 5; /* 1 tdma frame ~ 5ms */ | |
4825 TRACE_EVENT_P1("T3170: %ld", t3170_value); | |
4826 return t3170_value; | |
4827 } | |
4828 | |
4829 | |
4830 | |
4831 | |
4832 /* | |
4833 +------------------------------------------------------------------------------ | |
4834 | Function : tc_call_disable_callback_func | |
4835 +------------------------------------------------------------------------------ | |
4836 | Description : | |
4837 | | |
4838 | Parameters : | |
4839 | | |
4840 +------------------------------------------------------------------------------ | |
4841 */ | |
4842 GLOBAL void tc_call_disable_callback_func ( void ) | |
4843 { | |
4844 if( grr_data->tc.disable_callback_func NEQ NULL ) | |
4845 { | |
4846 T_TC_DISABLE_CALLBACK_FUNC disable_callback_func; | |
4847 | |
4848 TRACE_EVENT( "Call disable_callback_func after TBF release" ); | |
4849 | |
4850 disable_callback_func = grr_data->tc.disable_callback_func; | |
4851 grr_data->tc.disable_callback_func = NULL; | |
4852 | |
4853 disable_callback_func( ); | |
4854 } | |
4855 } /* tc_call_disable_callback_func */ | |
4856 | |
4857 /* | |
4858 +------------------------------------------------------------------------------ | |
4859 | Function : tc_set_freq | |
4860 +------------------------------------------------------------------------------ | |
4861 | Description : This function allocates a primitve depending on the hopping status | |
4862 | and sets the frequency parameter of T_MPHP_ASSIGNMENT_REQ | |
4863 | | |
4864 | Parameters : void | |
4865 | | |
4866 +------------------------------------------------------------------------------ | |
4867 */ | |
4868 GLOBAL T_MPHP_ASSIGNMENT_REQ * tc_set_freq ( void ) | |
4869 { | |
4870 PALLOC( ptr2prim, MPHP_ASSIGNMENT_REQ ); | |
4871 | |
4872 TRACE_FUNCTION( "tc_set_freq" ); | |
4873 | |
4874 memset( ptr2prim, 0, sizeof( T_MPHP_ASSIGNMENT_REQ ) ); | |
4875 | |
4876 ptr2prim->tsc = grr_data->tc.freq_set.tsc; | |
4877 | |
4878 grr_set_freq_par( &ptr2prim->p_frequency_par ); | |
4879 | |
4880 return( ptr2prim ); | |
4881 }/* tc_set_freq */ | |
4882 | |
4883 /* | |
4884 +------------------------------------------------------------------------------ | |
4885 | Function : tc_cgrlc_disable_req | |
4886 +------------------------------------------------------------------------------ | |
4887 | Description : This function allocates sends the the primtive CGRLC_DISABLE_REQ | |
4888 | to GRLC | |
4889 | | |
4890 | Parameters : prim_st - indicates if a primitive shall be deleted or not | |
4891 | | |
4892 +------------------------------------------------------------------------------ | |
4893 */ | |
4894 GLOBAL void tc_cgrlc_disable_req ( UBYTE prim_st ) | |
4895 { | |
4896 PALLOC(cgrlc_disable_req,CGRLC_DISABLE_REQ); /*T_CGRLC_DISABLE_REQ*/ | |
4897 | |
4898 TRACE_FUNCTION( "tc_cgrlc_disable_req" ); | |
4899 | |
4900 cgrlc_disable_req->disable_class = grr_data->tc.disable_class; | |
4901 cgrlc_disable_req->prim_status = prim_st; | |
4902 | |
4903 PSEND(hCommGRLC,cgrlc_disable_req); | |
4904 | |
4905 }/* tc_cgrlc_disable_req */ | |
4906 | |
4907 | |
4908 /* | |
4909 +------------------------------------------------------------------------------ | |
4910 | Function : tc_cgrlc_ul_tbf_res | |
4911 +------------------------------------------------------------------------------ | |
4912 | Description : This function | |
4913 | | |
4914 | Parameters : | |
4915 | | |
4916 +------------------------------------------------------------------------------ | |
4917 */ | |
4918 | |
4919 GLOBAL void tc_cgrlc_ul_tbf_res ( UBYTE tbf_mode, UBYTE prim_status ) | |
4920 { | |
4921 PALLOC(cgrlc_ul_tbf_res,CGRLC_UL_TBF_RES); /*T_CGRLC_UL_TBF_RES*/ | |
4922 | |
4923 TRACE_FUNCTION( "tc_cgrlc_ul_tbf_res" ); | |
4924 | |
4925 cgrlc_ul_tbf_res->starting_time = grr_data->uplink_tbf.tbf_start_fn; | |
4926 cgrlc_ul_tbf_res->tbf_mode = tbf_mode; | |
4927 cgrlc_ul_tbf_res->prim_status = prim_status; | |
4928 cgrlc_ul_tbf_res->polling_bit = grr_data->uplink_tbf.polling_bit; | |
4929 cgrlc_ul_tbf_res->cs_mode = grr_data->uplink_tbf.cs_mode; | |
4930 cgrlc_ul_tbf_res->mac_mode = grr_data->uplink_tbf.mac_mode; | |
4931 cgrlc_ul_tbf_res->nts_max = grr_data->uplink_tbf.nts; | |
4932 cgrlc_ul_tbf_res->rlc_db_granted= grr_data->uplink_tbf.rlc_db_granted; | |
4933 | |
4934 if(grr_data->uplink_tbf.ts_usage) | |
4935 { | |
4936 cgrlc_ul_tbf_res->tn_mask = grr_data->uplink_tbf.ts_usage; | |
4937 } | |
4938 else | |
4939 { | |
4940 cgrlc_ul_tbf_res->tn_mask = grr_data->uplink_tbf.ts_mask; | |
4941 TRACE_EVENT("UL tn mask passed to grlc instead of ts_usage"); | |
4942 } | |
4943 | |
4944 if(grr_data->uplink_tbf.st_tfi EQ 0xFF) | |
4945 cgrlc_ul_tbf_res->tfi = grr_data->uplink_tbf.tfi; | |
4946 else | |
4947 cgrlc_ul_tbf_res->tfi = grr_data->uplink_tbf.st_tfi; | |
4948 | |
4949 cgrlc_ul_tbf_res->ti = grr_data->uplink_tbf.ti; | |
4950 cgrlc_ul_tbf_res->bs_cv_max = psc_db->gprs_cell_opt.bs_cv_max; | |
4951 cgrlc_ul_tbf_res->tlli_cs_mode = grr_data->uplink_tbf.tlli_cs_mode; | |
4952 cgrlc_ul_tbf_res->r_bit = grr_data->r_bit; | |
4953 | |
4954 if(cgrlc_ul_tbf_res->mac_mode EQ FA) | |
4955 { | |
4956 cgrlc_ul_tbf_res->fix_alloc_struct.bitmap_len = grr_data->tc.fa_ctrl.current_alloc.alloc.size_bitmap; | |
4957 cgrlc_ul_tbf_res->fix_alloc_struct.end_fn = grr_data->tc.fa_ctrl.current_alloc.alloc_end_fn; | |
4958 cgrlc_ul_tbf_res->fix_alloc_struct.final_alloc = grr_data->tc.fa_ctrl.current_alloc.final_alloc; | |
4959 memcpy (cgrlc_ul_tbf_res->fix_alloc_struct.bitmap_array, | |
4960 grr_data->tc.fa_ctrl.current_alloc.alloc.bitmap, | |
4961 MAX_ALLOC_BITMAP); | |
4962 } | |
4963 | |
4964 grr_prcs_pwr_ctrl ( &cgrlc_ul_tbf_res->pwr_ctrl, FALSE ); | |
4965 | |
4966 /*Reset the GRR database for parameters which are used only once*/ | |
4967 grr_data->uplink_tbf.polling_bit=0xFF; | |
4968 | |
4969 PSEND(hCommGRLC,cgrlc_ul_tbf_res); | |
4970 | |
4971 }/* tc_cgrlc_ul_tbf_res */ | |
4972 | |
4973 | |
4974 | |
4975 /* | |
4976 +------------------------------------------------------------------------------ | |
4977 | Function : tc_cgrlc_access_status_req | |
4978 +------------------------------------------------------------------------------ | |
4979 | Description : This function | |
4980 | | |
4981 | Parameters : | |
4982 | | |
4983 +------------------------------------------------------------------------------ | |
4984 */ | |
4985 | |
4986 GLOBAL void tc_cgrlc_access_status_req ( void ) | |
4987 { | |
4988 PALLOC(cgrlc_access_status_req,CGRLC_ACCESS_STATUS_REQ); /*T_CGRLC_ACCESS_STATUS_REQ*/ | |
4989 | |
4990 TRACE_FUNCTION( "tc_cgrlc_access_status_req" ); | |
4991 | |
4992 PSEND(hCommGRLC,cgrlc_access_status_req); | |
4993 | |
4994 }/* tc_cgrlc_access_status_req*/ | |
4995 | |
4996 | |
4997 /* | |
4998 +------------------------------------------------------------------------------ | |
4999 | Function : tc_send_control_msg_to_grlc | |
5000 +------------------------------------------------------------------------------ | |
5001 | Description : This function | |
5002 | | |
5003 | Parameters : | |
5004 | | |
5005 +------------------------------------------------------------------------------ | |
5006 */ | |
5007 | |
5008 GLOBAL void tc_send_control_msg_to_grlc ( void ) | |
5009 { | |
5010 UBYTE i= 0; | |
5011 | |
5012 TRACE_FUNCTION( "tc_send_control_msg_to_grlc" ); | |
5013 | |
5014 | |
5015 while( i < MAX_CTRL_BLK_NUM AND | |
5016 grr_data->tc.ul_ctrl_blk.seq[i] NEQ MAX_CTRL_BLK_NUM ) | |
5017 { | |
5018 if( grr_data->tc.ul_ctrl_blk.blk[grr_data->tc.ul_ctrl_blk.seq[i]].state | |
5019 EQ BLK_STATE_ALLOCATED ) | |
5020 { | |
5021 PALLOC(cgrlc_data_req,CGRLC_DATA_REQ); /* T_CGRLC_DATA_REQ */ | |
5022 | |
5023 | |
5024 cgrlc_data_req->blk_owner = grr_data->tc.ul_ctrl_blk.blk[grr_data->tc.ul_ctrl_blk.seq[i]].owner; | |
5025 | |
5026 memcpy(cgrlc_data_req->data_array,grr_data->tc.ul_ctrl_blk.blk[grr_data->tc.ul_ctrl_blk.seq[i]].data,23); | |
5027 | |
5028 PSEND(hCommGRLC,cgrlc_data_req); | |
5029 | |
5030 /* remove control block */ | |
5031 | |
5032 tc_cancel_ctrl_blk(grr_data->tc.ul_ctrl_blk.blk[grr_data->tc.ul_ctrl_blk.seq[i]].owner); | |
5033 } | |
5034 } | |
5035 | |
5036 | |
5037 }/* tc_send_control_msg_to_grlc*/ | |
5038 | |
5039 /* | |
5040 +------------------------------------------------------------------------------ | |
5041 | Function : tc_cgrlc_dl_tbf_req | |
5042 +------------------------------------------------------------------------------ | |
5043 | Description : This function | |
5044 | | |
5045 | Parameters : | |
5046 | | |
5047 +------------------------------------------------------------------------------ | |
5048 */ | |
5049 | |
5050 GLOBAL void tc_cgrlc_dl_tbf_req ( void ) | |
5051 { | |
5052 PALLOC(cgrlc_dl_tbf_req,CGRLC_DL_TBF_REQ); /*T_CGRLC_DL_TBF_REQ*/ | |
5053 | |
5054 | |
5055 TRACE_FUNCTION( "tc_cgrlc_dl_tbf_req" ); | |
5056 | |
5057 grr_data->downlink_tbf.trans_id++; | |
5058 | |
5059 cgrlc_dl_tbf_req->starting_time = grr_data->downlink_tbf.tbf_start_fn; | |
5060 cgrlc_dl_tbf_req->rlc_mode = grr_data->downlink_tbf.rlc_mode; | |
5061 cgrlc_dl_tbf_req->mac_mode = grr_data->downlink_tbf.mac_mode; | |
5062 cgrlc_dl_tbf_req->polling_bit = grr_data->downlink_tbf.polling_bit; | |
5063 cgrlc_dl_tbf_req->nts_max = grr_data->downlink_tbf.nts; | |
5064 | |
5065 if(grr_data->downlink_tbf.ts_usage) | |
5066 { | |
5067 cgrlc_dl_tbf_req->tn_mask = grr_data->downlink_tbf.ts_usage; | |
5068 grr_data->downlink_tbf.ts_mask = grr_data->downlink_tbf.ts_usage; /* set before starting time is elapsed */ | |
5069 } | |
5070 else | |
5071 { | |
5072 cgrlc_dl_tbf_req->tn_mask = grr_data->downlink_tbf.ts_mask; | |
5073 TRACE_EVENT("DL tn mask passed to grlc instead of ts_usage"); | |
5074 } | |
5075 | |
5076 | |
5077 if(grr_data->downlink_tbf.st_tfi EQ 0xFF) | |
5078 cgrlc_dl_tbf_req->tfi = grr_data->downlink_tbf.tfi; | |
5079 else | |
5080 cgrlc_dl_tbf_req->tfi = grr_data->downlink_tbf.st_tfi; | |
5081 | |
5082 cgrlc_dl_tbf_req->t3192_val = psc_db->gprs_cell_opt.t3192; | |
5083 cgrlc_dl_tbf_req->ctrl_ack_bit = grr_data->downlink_tbf.ctrl_ack_bit; | |
5084 | |
5085 grr_prcs_pwr_ctrl ( &cgrlc_dl_tbf_req->pwr_ctrl, FALSE ); | |
5086 | |
5087 /*Reset the GRR database for parameters which are used only once*/ | |
5088 grr_data->downlink_tbf.ctrl_ack_bit=0; | |
5089 grr_data->downlink_tbf.polling_bit=0xFF; | |
5090 | |
5091 PSEND(hCommGRLC,cgrlc_dl_tbf_req); | |
5092 | |
5093 | |
5094 }/* tc_cgrlc_dl_tbf_req*/ | |
5095 | |
5096 | |
5097 /* | |
5098 +------------------------------------------------------------------------------ | |
5099 | Function : tc_cgrlc_tbf_rel_res | |
5100 +------------------------------------------------------------------------------ | |
5101 | Description : This function | |
5102 | | |
5103 | Parameters : | |
5104 | | |
5105 +------------------------------------------------------------------------------ | |
5106 */ | |
5107 | |
5108 GLOBAL void tc_cgrlc_tbf_rel_res ( UBYTE tbf_type ) | |
5109 { | |
5110 PALLOC(cgrlc_tbf_rel_res,CGRLC_TBF_REL_RES); | |
5111 | |
5112 TRACE_FUNCTION( "tc_cgrlc_tbf_rel_res" ); | |
5113 | |
5114 switch( tbf_type ) | |
5115 { | |
5116 case DL_ASSIGNMENT: cgrlc_tbf_rel_res->tbf_mode = CGRLC_TBF_MODE_DL; break; | |
5117 case UL_ASSIGNMENT: cgrlc_tbf_rel_res->tbf_mode = CGRLC_TBF_MODE_UL; break; | |
5118 case UL_DL_ASSIGNMENT: cgrlc_tbf_rel_res->tbf_mode = CGRLC_TBF_MODE_DL_UL; break; | |
5119 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
5120 case UL_TP_ACCESS: cgrlc_tbf_rel_res->tbf_mode = CGRLC_TBF_MODE_2PA; break; | |
5121 #endif | |
5122 } | |
5123 | |
5124 PSEND(hCommGRLC,cgrlc_tbf_rel_res); | |
5125 | |
5126 }/* tc_cgrlc_tbf_rel_res*/ | |
5127 | |
5128 | |
5129 | |
5130 | |
5131 /* | |
5132 +------------------------------------------------------------------------------ | |
5133 | Function : tc_cgrlc_tbf_rel_req | |
5134 +------------------------------------------------------------------------------ | |
5135 | Description : This function | |
5136 | | |
5137 | Parameters : | |
5138 | | |
5139 +------------------------------------------------------------------------------ | |
5140 */ | |
5141 | |
5142 GLOBAL void tc_cgrlc_tbf_rel_req ( UBYTE tbf_type, UBYTE rel_cause, ULONG rel_fn ) | |
5143 { | |
5144 PALLOC(cgrlc_tbf_rel_req,CGRLC_TBF_REL_REQ); /*T_CGRLC_TBF_REL_REQ*/ | |
5145 | |
5146 TRACE_FUNCTION( "tc_cgrlc_tbf_rel_req" ); | |
5147 | |
5148 cgrlc_tbf_rel_req->tbf_mode = tbf_type; | |
5149 cgrlc_tbf_rel_req->tbf_rel_cause = rel_cause; | |
5150 cgrlc_tbf_rel_req->rel_fn = rel_fn; | |
5151 | |
5152 PSEND(hCommGRLC,cgrlc_tbf_rel_req); | |
5153 | |
5154 }/* tc_cgrlc_tbf_rel_req*/ | |
5155 | |
5156 | |
5157 | |
5158 /* | |
5159 +------------------------------------------------------------------------------ | |
5160 | Function : tc_cgrlc_enable_req | |
5161 +------------------------------------------------------------------------------ | |
5162 | Description : This function sends the primitive cgrlc_enable_req to GRLC | |
5163 | | |
5164 | Parameters : queue_mode - indicates the queue mode | |
5165 | cu_cause - indicates if cell update is required or not | |
5166 | | |
5167 +------------------------------------------------------------------------------ | |
5168 */ | |
5169 | |
5170 GLOBAL void tc_cgrlc_enable_req ( UBYTE queue_mode, | |
5171 UBYTE cu_cause, | |
5172 BOOL cell_has_changed, | |
5173 UBYTE enable_cause ) | |
5174 { | |
5175 | |
5176 PALLOC(cgrlc_enable_req,CGRLC_ENABLE_REQ); /*T_CGRLC_ENABLE_REQ*/ | |
5177 | |
5178 TRACE_FUNCTION( "tc_cgrlc_enable_req" ); | |
5179 | |
5180 cgrlc_enable_req->enable_cause = enable_cause; | |
5181 cgrlc_enable_req->queue_mode = queue_mode; | |
5182 cgrlc_enable_req->cu_cause = cu_cause; /* cell update request will be handled sig_ctrl_tc_enable_grlc */ | |
5183 /*************Burst type handling********************************/ | |
5184 cgrlc_enable_req->burst_type = psc_db->gprs_cell_opt.ctrl_ack_type; | |
5185 cgrlc_enable_req->ab_type = psc_db->gprs_cell_opt.ab_type; | |
5186 | |
5187 /*************Counter N3102 handling*****************************/ | |
5188 cgrlc_enable_req->v_pan_struct = psc_db->gprs_cell_opt.v_pan_struct; | |
5189 cgrlc_enable_req->pan_struct.inc = psc_db->gprs_cell_opt.pan_struct.inc; | |
5190 cgrlc_enable_req->pan_struct.dec = psc_db->gprs_cell_opt.pan_struct.dec; | |
5191 if(cell_has_changed) | |
5192 cgrlc_enable_req->pan_struct.pmax = (psc_db->gprs_cell_opt.pan_struct.pmax + 1 ) *4; | |
5193 else | |
5194 cgrlc_enable_req->pan_struct.pmax = CGRLC_NO_UPDATE_N3102; | |
5195 | |
5196 cgrlc_enable_req->ul_tlli = grr_data->db.ms_id.new_tlli; | |
5197 cgrlc_enable_req->dl_tlli = grr_data->db.ms_id.received_tlli; | |
5198 | |
5199 cgrlc_enable_req->t3168_val = psc_db->gprs_cell_opt.t3168; | |
5200 | |
5201 if(grr_is_pbcch_present()) | |
5202 | |
5203 { | |
5204 cgrlc_enable_req->change_mark = psc_db->psi2_params.psi2_change_mark; | |
5205 if(grr_data->ms.access_ctrl_class & ~psc_db->prach.ac_class) | |
5206 { | |
5207 cgrlc_enable_req->ac_class = CGRLC_PCCCH_AC_ALLOWED; | |
5208 } | |
5209 else | |
5210 { | |
5211 cgrlc_enable_req->ac_class = CGRLC_PCCCH_AC_NOT_ALLOWED; | |
5212 TRACE_EVENT_P3("ACCESS NOT ALLOWED PBCCH: ms_acc=%d prach_ac=%d tc_state=%d" | |
5213 ,grr_data->ms.access_ctrl_class | |
5214 ,psc_db->prach.ac_class | |
5215 ,grr_data->tc.state); | |
5216 } | |
5217 } | |
5218 else | |
5219 { | |
5220 cgrlc_enable_req->change_mark = psc_db->psi13_params.si13_change_mark; | |
5221 if(grr_data->ms.access_ctrl_class & ~psc_db->prach.ac_class) | |
5222 { | |
5223 cgrlc_enable_req->ac_class = psc_db->net_ctrl.priority_access_thr; | |
5224 } | |
5225 else | |
5226 { | |
5227 cgrlc_enable_req->ac_class = CGRLC_PCCCH_AC_NOT_ALLOWED; | |
5228 TRACE_EVENT_P3("ACCESS NOT ALLOWED CCCH: ms_acc=%d prach_ac=%d tc_state=%d" | |
5229 ,grr_data->ms.access_ctrl_class | |
5230 ,psc_db->prach.ac_class | |
5231 ,grr_data->tc.state); | |
5232 } | |
5233 } | |
5234 | |
5235 #ifdef REL99 | |
5236 cgrlc_enable_req->pfi_support = psc_db->gprs_cell_opt.gprs_ext_bits.gprs_ext_info.pfc_feature_mode; | |
5237 cgrlc_enable_req->nw_rel = psc_db->network_rel; /*Network Release Order*/ | |
5238 #endif | |
5239 | |
5240 PSEND(hCommGRLC,cgrlc_enable_req); | |
5241 | |
5242 }/* tc_cgrlc_enable_req*/ | |
5243 | |
5244 /* | |
5245 +------------------------------------------------------------------------------ | |
5246 | Function : grr_convert_11bit_2_etsi | |
5247 +------------------------------------------------------------------------------ | |
5248 | Description : Converts the 11 bit access burst value into ETSI format | |
5249 | | |
5250 | Parameters : In: eleven bit value | |
5251 | Out: converted eleven bit | |
5252 | | |
5253 +------------------------------------------------------------------------------ | |
5254 */ | |
5255 LOCAL USHORT grr_convert_11bit_2_etsi ( USHORT eleven_bit ) | |
5256 { | |
5257 USHORT etsi11bit; | |
5258 USHORT dummy1 = 0, dummy2 = 0; | |
5259 | |
5260 TRACE_FUNCTION( "grr_convert_11bit_2_etsi" ); | |
5261 | |
5262 /* | |
5263 * 11 Bit access burst | |
5264 * b: bit | |
5265 * b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 | |
5266 * should be sent to the network -according 04.60 and 0404- in the | |
5267 * following 16-bit format: | |
5268 * 0 0 0 0 0 b2 b1 b0 b10 b9 b8 b7 b6 b5 b4 b3 | |
5269 */ | |
5270 | |
5271 /* | |
5272 * get b2 b1 b0 | |
5273 */ | |
5274 dummy1 = 0x0007 & eleven_bit; | |
5275 | |
5276 /* | |
5277 * shift it 8 bits to left | |
5278 */ | |
5279 dummy1 = ( dummy1 << 8 ); | |
5280 | |
5281 /* | |
5282 * get b10 b9 b8 b7 b6 b5 b4 b3 | |
5283 */ | |
5284 dummy2 = 0xFFF8 & eleven_bit; | |
5285 | |
5286 /* | |
5287 * shift it 3 bits to right | |
5288 */ | |
5289 dummy2 = ( dummy2 >> 3 ); | |
5290 | |
5291 /* | |
5292 * compose dummy1 and dummy2 to the target 16-bit format | |
5293 */ | |
5294 etsi11bit = dummy1 | dummy2; | |
5295 | |
5296 return etsi11bit; | |
5297 | |
5298 } /* grr_convert_11bit_2_etsi() */ |