FreeCalypso > hg > fc-magnetite
comparison src/g23m-gprs/grlc/grlc_gffp.c @ 183:219afcfc6250
src/g23m-gprs: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Oct 2016 04:24:13 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
182:f02d0a0e1849 | 183:219afcfc6250 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : GPRS (8441) | |
4 | Modul : GRLC | |
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 primitive handler functions for service | |
18 | GFF of entity GRLC. | |
19 +----------------------------------------------------------------------------- | |
20 */ | |
21 | |
22 #ifndef GRLC_GFFP_C | |
23 #define GRLC_GFFP_C | |
24 #endif | |
25 | |
26 #define ENTITY_GRLC | |
27 | |
28 /*==== INCLUDES =============================================================*/ | |
29 | |
30 #include <stdio.h> | |
31 #include "typedefs.h" /* to get Condat data types */ | |
32 #include "vsi.h" /* to get a lot of macros */ | |
33 #include "macdef.h" | |
34 #include "gprs.h" | |
35 #include "gsm.h" /* to get a lot of macros */ | |
36 #include "ccdapi.h" /* to get CCD API */ | |
37 #include "prim.h" /* to get the definitions of used SAP and directions */ | |
38 #include "message.h" | |
39 #include "grlc.h" /* to get the global entity definitions */ | |
40 #include "grlc_gfff.h" | |
41 #include "grlc_f.h" | |
42 #include <string.h> | |
43 #include "grlc_rus.h" | |
44 #include "grlc_rds.h" | |
45 #include "grlc_func.h" | |
46 #include "grlc_tpcs.h" | |
47 #include "grlc_meass.h" | |
48 #include "cl_rlcmac.h" | |
49 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
50 #include "grlc_tms.h" | |
51 #endif | |
52 | |
53 /*==== CONST ================================================================*/ | |
54 | |
55 #define BITS_PER_RADIO_BLOCK 456 | |
56 | |
57 /*==== LOCAL VARS ===========================================================*/ | |
58 | |
59 /*==== PRIVATE FUNCTIONS ====================================================*/ | |
60 | |
61 /*==== PUBLIC FUNCTIONS =====================================================*/ | |
62 /* | |
63 +------------------------------------------------------------------------------ | |
64 | Function : gff_mac_pwr_ctrl_ind | |
65 +------------------------------------------------------------------------------ | |
66 | Description : Handles the primitive MAC_PWR_CTRL_IND | |
67 | | |
68 | Parameters : *mac_pwr_ctrl_ind - Ptr to primitive payload | |
69 | | |
70 +------------------------------------------------------------------------------ | |
71 */ | |
72 GLOBAL void gff_mac_pwr_ctrl_ind ( T_MAC_PWR_CTRL_IND * mac_pwr_ctrl_ind ) | |
73 { | |
74 TRACE_FUNCTION( "gff_mac_pwr_ctrl_ind" ); | |
75 | |
76 #if defined _TARGET_ && !defined (NTRACE) | |
77 | |
78 if( grlc_data->tpc.n_tpc_trace & M_TPC_TRACE_FUNCTION ) | |
79 { | |
80 T_L1TEST_CALL_MPHP_POWER_CONTROL l1test_call; | |
81 | |
82 UBYTE i; | |
83 | |
84 l1test_call.assignment_id = ( U8 )mac_pwr_ctrl_ind->assignment_id; | |
85 l1test_call.crc_error = mac_pwr_ctrl_ind->crc_error; | |
86 l1test_call.bcch_level = ( S8 )mac_pwr_ctrl_ind->bcch_level; | |
87 | |
88 for( i = 0; i < L1TEST_BURST_PER_BLOCK; i++ ) | |
89 { | |
90 l1test_call.burst_level[i] = ( S8 )mac_pwr_ctrl_ind->burst_level[i]; | |
91 l1test_call.radio_freq [i] = mac_pwr_ctrl_ind->radio_freq[i]; | |
92 } | |
93 | |
94 TRACE_MEMORY_PRIM ( hCommL1, hCommGRLC, L1TEST_CALL_MPHP_POWER_CONTROL, | |
95 &l1test_call, sizeof( T_L1TEST_CALL_MPHP_POWER_CONTROL ) ); | |
96 } | |
97 | |
98 #endif /* #if defined _TARGET_ && !defined (NTRACE) */ | |
99 | |
100 gff_clip_rxlev( &mac_pwr_ctrl_ind->bcch_level, | |
101 &mac_pwr_ctrl_ind->bcch_level, 1 ); | |
102 | |
103 gff_clip_rxlev( mac_pwr_ctrl_ind->burst_level, | |
104 mac_pwr_ctrl_ind->burst_level, | |
105 MAC_BURST_PER_BLOCK ); | |
106 | |
107 sig_gff_tpc_pwr_ctrl_ind( mac_pwr_ctrl_ind ); | |
108 | |
109 #if defined _TARGET_ && !defined (NTRACE) | |
110 | |
111 if( grlc_data->tpc.n_tpc_trace & M_TPC_TRACE_FUNCTION ) | |
112 { | |
113 T_L1TEST_RETURN_MPHP_POWER_CONTROL l1test_return; | |
114 | |
115 tpc_get_pch( &l1test_return.pch[0] ); | |
116 | |
117 TRACE_MEMORY_PRIM ( hCommGRLC, hCommL1, L1TEST_RETURN_MPHP_POWER_CONTROL, | |
118 &l1test_return, sizeof( T_L1TEST_RETURN_MPHP_POWER_CONTROL ) ); | |
119 } | |
120 | |
121 #endif /* #if defined _TARGET_ && !defined (NTRACE) */ | |
122 | |
123 } /* gff_mac_pwr_ctrl_ind() */ | |
124 | |
125 /* | |
126 +------------------------------------------------------------------------------ | |
127 | Function : gff_mac_data_ind | |
128 +------------------------------------------------------------------------------ | |
129 | Description : Handles the primitive MAC_DATA_IND | |
130 | | |
131 | Parameters : *mac_data_ind - Ptr to primitive payload | |
132 | | |
133 +------------------------------------------------------------------------------ | |
134 */ | |
135 GLOBAL void gff_mac_data_ind ( T_MAC_DATA_IND * mac_data_ind ) | |
136 { | |
137 UBYTE i; | |
138 USHORT rx_no; | |
139 | |
140 TRACE_FUNCTION( "mac_data_ind" ); | |
141 | |
142 rx_no = grlc_data->func.dl_blocks.data_ptr.rx_no; | |
143 | |
144 #ifdef _SIMULATION_ | |
145 { | |
146 /* | |
147 * copy received primitive to grlc_data->func.mac_data_ind | |
148 */ | |
149 | |
150 TRACE_EVENT_P5("mac_data_ind fn=%ld tn= %d -> mask=%x UL_MASK=%x DL_MASK=%x" | |
151 ,mac_data_ind->fn | |
152 ,mac_data_ind->dl_data.tn | |
153 ,0x80>>mac_data_ind->dl_data.tn | |
154 ,grlc_data->ul_tn_mask | |
155 ,grlc_data->dl_tn_mask); | |
156 | |
157 grlc_data->dl_fn = mac_data_ind->fn; | |
158 grlc_data->ul_fn = mac_data_ind->fn; | |
159 memcpy ( | |
160 &(grlc_data->func.mac_data_ind), | |
161 mac_data_ind, | |
162 sizeof(T_MAC_DATA_IND)); | |
163 PFREE(mac_data_ind); | |
164 mac_data_ind = &(grlc_data->func.mac_data_ind); | |
165 rx_no = 1; | |
166 } | |
167 #endif | |
168 | |
169 switch( GET_STATE( GFF ) ) | |
170 { | |
171 case GFF_ACTIVE: | |
172 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
173 case GFF_TWO_PHASE: | |
174 #endif | |
175 { | |
176 T_BER_IND ber_ind; | |
177 | |
178 ber_ind.num_dl_blck = 0; | |
179 | |
180 for(i=0; i< rx_no; i++) | |
181 { | |
182 | |
183 | |
184 #ifdef _TARGET_ | |
185 { | |
186 /* | |
187 * copy next primitive to grlc_data->func.mac_data_ind | |
188 */ | |
189 grlc_data->func.mac_data_ind.fn = grlc_data->func.dl_blocks.fn; | |
190 grlc_data->func.mac_data_ind.rx_no = grlc_data->func.dl_blocks.data_ptr.rx_no; | |
191 grlc_data->func.mac_data_ind.dl_data = grlc_data->func.dl_blocks.data_ptr.dl_data[i]; | |
192 mac_data_ind = &(grlc_data->func.mac_data_ind); | |
193 } | |
194 | |
195 TRACE_MEMORY_PRIM ( hCommL1, hCommGRLC, MAC_DATA_IND, | |
196 mac_data_ind, sizeof( T_MAC_DATA_IND ) ); | |
197 | |
198 #endif /* #ifdef _TARGET_ */ | |
199 | |
200 /* | |
201 * In Test mode B,if there is CRC error on the payload data the MS will, | |
202 * where required by the USF, transmit the decoded payload data. The block | |
203 * transmitted will be a valid uplink block format. | |
204 */ | |
205 | |
206 if( ( (mac_data_ind->dl_data.block_status & 0x0100) EQ 0x0000) OR ( (grlc_data->testmode.mode EQ CGRLC_LOOP) ) ) | |
207 { | |
208 /* | |
209 * Only successfully decoded blocks shall be considered | |
210 */ | |
211 | |
212 if( gff_analyse_dl_data( mac_data_ind->fn, &( mac_data_ind->dl_data ) ) ) | |
213 { | |
214 /* | |
215 * Only blocks intended for that MS shall be considered | |
216 */ | |
217 | |
218 if( ber_ind.num_dl_blck < MAC_MAX_DL_DATA_BLCKS ) | |
219 { | |
220 ber_ind.be_info[ber_ind.num_dl_blck].total = BITS_PER_RADIO_BLOCK; | |
221 | |
222 if( ( mac_data_ind->dl_data.block_status & 0x000F ) EQ 0x0006 ) | |
223 { | |
224 /* | |
225 * If CS4 is used, the MS is allowed to report RXQUAL = 7, | |
226 * so just set the BER to 100% | |
227 */ | |
228 ber_ind.be_info[ber_ind.num_dl_blck].fault = | |
229 BITS_PER_RADIO_BLOCK; | |
230 } | |
231 else | |
232 { | |
233 ber_ind.be_info[ber_ind.num_dl_blck].fault = | |
234 grlc_data->func.mac_data_ind.dl_data.d_nerr; | |
235 } | |
236 | |
237 ber_ind.num_dl_blck++; | |
238 } | |
239 else | |
240 { | |
241 TRACE_ERROR( "be_info overflow in gff_mac_data_ind" ); | |
242 } | |
243 } | |
244 } | |
245 else | |
246 { | |
247 TRACE_ERROR( "MAC_DATA_IND with bad CRC" ); | |
248 | |
249 TRACE_BINDUMP | |
250 ( hCommGRLC, TC_USER5, | |
251 cl_rlcmac_get_msg_name( D_MSG_TYPE_CRC_ERROR_c, RLC_MAC_ROUTE_DL ), | |
252 mac_data_ind->dl_data.dl_block, MAX_L2_FRAME_SIZE ); /*lint !e569*/ | |
253 | |
254 /* grlc_data->nr_of_crc_errors++; */ | |
255 } | |
256 } | |
257 | |
258 if( ber_ind.num_dl_blck NEQ 0 ) | |
259 { | |
260 meas_sq_update( &ber_ind ); | |
261 } | |
262 } | |
263 break; | |
264 default: | |
265 /*TRACE_ERROR( "MAC_DATA_IND unexpected" );*/ | |
266 break; | |
267 } | |
268 | |
269 /*call control of asyn part TARGET DEBUGGING*/ | |
270 #if defined (_TARGET_) | |
271 grlc_data->dl_cnt_asyn = grlc_data->dl_cnt_syn; | |
272 #endif /* defined (_TARGET_) */ | |
273 | |
274 } /* gff_mac_data_ind() */ | |
275 | |
276 | |
277 | |
278 /* | |
279 +------------------------------------------------------------------------------ | |
280 | Function : gff_mac_ready_ind | |
281 +------------------------------------------------------------------------------ | |
282 | Description : Handles the primitive MAC_READY_IND | |
283 | | |
284 | Parameters : *mac_ready_ind - Ptr to primitive payload | |
285 | | |
286 +------------------------------------------------------------------------------ | |
287 */ | |
288 GLOBAL void gff_mac_ready_ind ( T_MAC_READY_IND * mac_ready_ind ) | |
289 { | |
290 TRACE_FUNCTION( "mac_ready_ind" ); | |
291 | |
292 /* | |
293 * calculate the frame number from downlink call | |
294 */ | |
295 #ifdef _TARGET_ | |
296 { | |
297 ULONG current_dl_fn; | |
298 ULONG last_dl_fn; | |
299 ULONG last_ul_fn; | |
300 ULONG current_ul_fn; | |
301 BOOL trace_dl_gap = TRUE; | |
302 | |
303 current_dl_fn = grlc_data->func.mac_ready_ind.fn; | |
304 last_dl_fn = grlc_data->last_dl_fn; | |
305 last_ul_fn = grlc_data->last_ul_fn; | |
306 | |
307 grlc_data->func.mac_ready_ind.fn = grlc_data->ul_fn ; | |
308 current_ul_fn = grlc_data->ul_fn; | |
309 | |
310 if(grlc_data->func.mac_ready_ind.last_poll_resp) | |
311 { | |
312 TRACE_EVENT_P5("POLL NOT SENT BY LAYER 1 fn=%ld last_poll_resp=0x%x np_fn=%ld,bs=%d,ind=%d" | |
313 ,grlc_data->func.mac_ready_ind.fn | |
314 ,grlc_data->func.mac_ready_ind.last_poll_resp | |
315 ,grlc_data->next_poll_fn | |
316 ,grlc_data->ul_poll_resp[0].block_status | |
317 ,grlc_data->ul_poll_pos_index); | |
318 } | |
319 | |
320 /* handle gaps*/ | |
321 if ((grlc_data->next_poll_fn EQ 2) OR (grlc_data->next_poll_fn EQ 1)) | |
322 { /* last poll is sent*/ | |
323 grlc_data->func.mac_ready_ind.last_poll_resp = 0; /* no ul gap for poll */ | |
324 } | |
325 else if( grlc_data->ul_call_errors AND | |
326 (grlc_data->ul_fn_errors[grlc_data->ul_call_errors-1] EQ grlc_data->next_poll_fn )) | |
327 { | |
328 trace_dl_gap = FALSE; | |
329 TRACE_EVENT_P7("CALL ERR:c_dl_fn=%ld l_dl_fn=%ld c_ul_fn=%ld l_ul_fn=%ld callerr=%d err_fn=%ld lp_fn=%ld", | |
330 current_dl_fn, | |
331 last_dl_fn, | |
332 current_ul_fn, | |
333 last_ul_fn, | |
334 grlc_data->ul_call_errors, | |
335 grlc_data->ul_fn_errors[grlc_data->ul_call_errors-1], | |
336 grlc_data->next_poll_fn); | |
337 | |
338 grlc_data->func.mac_ready_ind.last_poll_resp = 0xFF; | |
339 grlc_data->next_poll_fn =2 ; | |
340 } | |
341 else if(current_ul_fn >= grlc_data->next_poll_fn) | |
342 { | |
343 trace_dl_gap = FALSE; | |
344 TRACE_EVENT_P6("2UL GAP NO POLL:c_dl_fn=%ld l_dl_fn=%ld c_ul_fn=%ld l_ul_fn=%ld lpr=%d lp_fn=%ld", | |
345 current_dl_fn, | |
346 last_dl_fn, | |
347 current_ul_fn, | |
348 last_ul_fn, | |
349 grlc_data->func.mac_ready_ind.last_poll_resp, | |
350 grlc_data->next_poll_fn); | |
351 | |
352 grlc_data->func.mac_ready_ind.last_poll_resp = 0xFF; | |
353 grlc_data->next_poll_fn =2 ; | |
354 } | |
355 else if((grlc_data->next_poll_fn > current_ul_fn) AND (current_ul_fn < 52)) /*fn overflow*/ | |
356 { | |
357 trace_dl_gap = FALSE; | |
358 TRACE_EVENT_P6("3UL GAP NO POLL:c_dl_fn=%ld l_dl_fn=%ld c_ul_fn=%ld l_ul_fn=%ld lpr=%d lp_fn=%ld", | |
359 current_dl_fn, | |
360 last_dl_fn, | |
361 current_ul_fn, | |
362 last_ul_fn, | |
363 grlc_data->func.mac_ready_ind.last_poll_resp, | |
364 grlc_data->next_poll_fn); | |
365 grlc_data->func.mac_ready_ind.last_poll_resp = 0xFF; | |
366 grlc_data->next_poll_fn =2 ; | |
367 } | |
368 | |
369 if( trace_dl_gap AND | |
370 ( ( current_dl_fn - last_dl_fn ) > 5 ) AND | |
371 ( grlc_data->dl_cnt_syn OR grlc_data->dl_fn_store[0] OR grlc_data->dl_fn_store[1] ) ) | |
372 { | |
373 TRACE_EVENT_P2( "DL GAP: c_dl_fn=%ld l_dl_fn=%ld", current_dl_fn, last_dl_fn ); | |
374 } | |
375 } | |
376 #endif /* _TARGET_ */ | |
377 | |
378 #ifdef _SIMULATION_ | |
379 { | |
380 /* | |
381 * copy received primitive to grlc_data->func.mac_ready_ind | |
382 */ | |
383 grlc_data->ul_fn = mac_ready_ind->fn; | |
384 memcpy ( | |
385 &(grlc_data->func.mac_ready_ind), | |
386 mac_ready_ind, | |
387 sizeof(T_MAC_READY_IND)); | |
388 PFREE(mac_ready_ind); | |
389 } | |
390 #endif | |
391 | |
392 | |
393 mac_ready_ind = &(grlc_data->func.mac_ready_ind); | |
394 | |
395 #ifdef _TARGET_ | |
396 | |
397 TRACE_MEMORY_PRIM ( hCommL1, hCommGRLC, MAC_READY_IND, | |
398 mac_ready_ind, sizeof( T_MAC_READY_IND ) ); | |
399 | |
400 #endif /* #ifdef _TARGET_ */ | |
401 | |
402 /* | |
403 * handle ta value | |
404 */ | |
405 gff_handle_continious_ta(); | |
406 | |
407 | |
408 switch( GET_STATE(GFF) ) | |
409 { | |
410 case GFF_ACTIVE: | |
411 if(grlc_data->tfi_change NEQ TFI_CHANGE_NULL) | |
412 { | |
413 grlc_activate_tfi(mac_ready_ind->fn); | |
414 } | |
415 grlc_data->ul_poll_pos_index = 0; | |
416 if(grlc_data->gff.rlc_status EQ RLC_STATUS_BOTH) | |
417 { | |
418 sig_gff_ru_mac_ready_ind(mac_ready_ind); | |
419 sig_gff_rd_mac_ready_ind(mac_ready_ind); | |
420 } | |
421 else if(grlc_data->gff.rlc_status EQ RLC_STATUS_UL) | |
422 sig_gff_ru_mac_ready_ind(mac_ready_ind); | |
423 else if(grlc_data->gff.rlc_status EQ RLC_STATUS_DL) | |
424 sig_gff_rd_mac_ready_ind(mac_ready_ind); | |
425 else | |
426 { | |
427 TRACE_ERROR("unknown rlc status: gff active but no tbf"); | |
428 } | |
429 break; | |
430 #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH | |
431 case GFF_TWO_PHASE: | |
432 grlc_data->ul_poll_pos_index = 0; | |
433 sig_gff_tm_mac_ready_ind_two_phase(mac_ready_ind); | |
434 break; | |
435 #endif | |
436 default: | |
437 /*TRACE_ERROR( "MAC_READY_IND unexpected" );*/ | |
438 break; | |
439 } | |
440 | |
441 #if defined (_TARGET_) | |
442 /*call control of asyn part*/ | |
443 grlc_data->ul_cnt_asyn = grlc_data->ul_cnt_syn; | |
444 #endif /* defined (_TARGET_) */ | |
445 | |
446 | |
447 } /* gff_mac_ready_ind() */ | |
448 | |
449 /* | |
450 +------------------------------------------------------------------------------ | |
451 | Function : gff_l1test_call_mphp_power_control | |
452 +------------------------------------------------------------------------------ | |
453 | Description : Handles the primitive L1TEST_CALL_MPHP_POWER_CONTROL | |
454 | | |
455 | Parameters : *mphp_power_control - Ptr to primitive payload | |
456 | | |
457 +------------------------------------------------------------------------------ | |
458 */ | |
459 | |
460 #ifdef _SIMULATION_ | |
461 | |
462 GLOBAL void gff_l1test_call_mphp_power_control | |
463 ( T_L1TEST_CALL_MPHP_POWER_CONTROL *call_mphp_power_control ) | |
464 { | |
465 PALLOC( return_mphp_power_control, L1TEST_RETURN_MPHP_POWER_CONTROL ); | |
466 | |
467 maca_power_control( call_mphp_power_control->assignment_id, | |
468 call_mphp_power_control->crc_error, | |
469 call_mphp_power_control->bcch_level, | |
470 call_mphp_power_control->radio_freq, | |
471 call_mphp_power_control->burst_level, | |
472 return_mphp_power_control->pch ); | |
473 | |
474 PSEND( hCommL1, return_mphp_power_control ); | |
475 | |
476 TRACE_FUNCTION( "gff_l1test_call_mphp_power_control" ); | |
477 | |
478 PFREE( call_mphp_power_control ); | |
479 | |
480 } /* gff_l1test_call_mphp_power_control() */ | |
481 | |
482 #endif /* #ifdef _SIMULATION_ */ |