FreeCalypso > hg > leo2moko-debug
comparison g23m/condat/ms/src/alr/alr_dedi.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:509db1a7b7b8 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : GSM-PS | |
4 | Modul : alr_DEDI | |
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 Modul defines the SDL process Dedicated_Control. | |
18 +----------------------------------------------------------------------------- | |
19 */ | |
20 | |
21 #ifndef ALR_DEDI_C | |
22 #define ALR_DEDI_C | |
23 | |
24 #define ENTITY_PL | |
25 | |
26 /*==== INCLUDES ===================================================*/ | |
27 #include <string.h> | |
28 #include <stdlib.h> | |
29 #include <ctype.h> | |
30 #include "typedefs.h" | |
31 #include "pconst.cdg" | |
32 #include "mconst.cdg" | |
33 #include "message.h" | |
34 #include "ccdapi.h" | |
35 #include "vsi.h" | |
36 #include "custom.h" | |
37 #include "gsm.h" | |
38 #include "prim.h" | |
39 #include "cnf_alr.h" | |
40 #include "mon_alr.h" | |
41 #include "pei.h" | |
42 #include "tok.h" | |
43 | |
44 #include "pcm.h" | |
45 #ifdef GPRS | |
46 #include "alr_gprs.h" | |
47 #endif | |
48 | |
49 #include "alr.h" | |
50 #include "alr_em.h" | |
51 | |
52 /*=== Constrains =======================================*/ | |
53 | |
54 #define TCH_F_INDEX 1 | |
55 | |
56 /*==== EXPORT =====================================================*/ | |
57 /*==== PRIVAT =====================================================*/ | |
58 LOCAL UBYTE dedi_channel_mode (UBYTE channel_mode, UBYTE channel_type); | |
59 LOCAL void dedi_convert_chan_desc (T_channel_desc * channel_desc); | |
60 LOCAL void dedi_convert_frequency_list (T_frequency_list * frequency_list); | |
61 LOCAL UBYTE dedi_conversion_needed (void); | |
62 LOCAL void dedi_chan_ass_fail (void); | |
63 LOCAL void dedi_pdch_ass_fail (void); | |
64 LOCAL void dedi_cco_fail (void); | |
65 LOCAL void dedi_handover_fail (void); | |
66 LOCAL void dedi_async_handover (T_MPH_DEDICATED_REQ *dedicated_req); | |
67 LOCAL void dedi_chan_ass (T_MPH_DEDICATED_REQ *dedicated_req); | |
68 LOCAL void dedi_fill_ma (USHORT *ma, T_frequency_list *rf); | |
69 LOCAL void dedi_imm_ass (T_MPH_DEDICATED_REQ *dedicated_req); | |
70 LOCAL void dedi_pdch_ass (T_MPH_DEDICATED_REQ *dedicated_req); | |
71 LOCAL void dedi_pre_sync_handover (T_MPH_DEDICATED_REQ *dedicated_req); | |
72 LOCAL void dedi_sync_handover (T_MPH_DEDICATED_REQ *dedicated_req); | |
73 | |
74 /*==== VARIABLES ==================================================*/ | |
75 LOCAL UBYTE actual_channel; | |
76 | |
77 /*==== FUNCTIONS ==================================================*/ | |
78 | |
79 #if defined (WIN32) | |
80 #define TRACING | |
81 #endif | |
82 | |
83 #if defined (TRACING) | |
84 #define ALR_TRACE_DEDI(a) ALR_TRACE(a) | |
85 #else | |
86 #define ALR_TRACE_DEDI(a) | |
87 #endif | |
88 | |
89 #if defined (TRACING) | |
90 #define ALR_TRACE_DEDI_DTX(a1) TRACE_EVENT_P1 ("DTX = %d", a1); | |
91 #define ALR_TRACE_DEDI_PARA(h, rf, _ch, sub, _tno, _tsc, _ta, _st, _dtx, _maio)\ | |
92 {if (h){\ | |
93 TRACE_EVENT_P9 ("immass:hop[%04x] ch/s=%u/%u tno=%u tsc=%u ta=%u st=%u dtx=%u maio=%u",\ | |
94 rf, _ch, sub, _tno, _tsc, _ta, _st, _dtx, _maio);\ | |
95 }else{\ | |
96 TRACE_EVENT_P9 ("immass:[%u] ch/s=%u/%u tno=%u tsc=%u ta=%u st=%u dtx=%u maio=%u",\ | |
97 rf, _ch, sub, _tno, _tsc, _ta, _st, _dtx, _maio);}} | |
98 #define ALR_TRACE_DEDI_HO_1(p1,p2,p3,p4,p5,p6) \ | |
99 TRACE_EVENT_P6 ("d rf=%d bsic=%d sti=%d ch2=%d ch=%d tsc=%d",\ | |
100 p1, p2, p3, p4, p5, p6) | |
101 #define ALR_TRACE_DEDI_HO_2(p1,p2,p3,p4,p5,p6) \ | |
102 TRACE_EVENT_P6 ("d tn=%d arf=%d pow=%d ref=%d acc=%d nci=%d", \ | |
103 p1, p2, p3, p4, p5, p6) | |
104 #define ALR_TRACE_DEDI_HO_3(p1,p2,p3,p4,p5,p6) \ | |
105 TRACE_EVENT_P6 ("d mode=%d power=%d dtx=%d rlt=%d tav=%d pwrc=%d", \ | |
106 p1, p2, p3, p4, p5, p6) | |
107 #define ALR_TRACE_DEDI_HO_4(p1,p2,p3) \ | |
108 TRACE_EVENT_P3 ("d mode=%d stat=%d algo=%d", p1, p2, p3); | |
109 #define ALR_TRACE_DEDI_HO_5(p1,p2,p3,p4,p5,p6) \ | |
110 TRACE_EVENT_P6 ("a h=%d maio=0x%x hsn=%d chty=%d subch=%d tno=%d", \ | |
111 p1, p2, p3, p4, p5, p6) | |
112 #define ALR_TRACE_DEDI_HO_6(p1,p2,p3,p4,p5,p6) \ | |
113 TRACE_EVENT_P6 ("a tsc=%d txpwr=%d ho_acc=%d sti_p=%d ncc=%d bcc=%d", \ | |
114 p1, p2, p3, p4, p5, p6) | |
115 #define ALR_TRACE_DEDI_HO_7(p1,p2,p3,p4) \ | |
116 TRACE_EVENT_P4 ("a rf=%d chmo1=%d ciphmo=%d a5=%d", \ | |
117 p1, p2, p3, p4) | |
118 #define ALR_TRACE_DEDI_FREQ_LIST() TRACE_EVENT_P2 ("HOP = %d %d", \ | |
119 frequency_list->rf_chan_no.radio_freq[j], \ | |
120 ARFCN_TO_L1 (frequency_list->rf_chan_no.radio_freq[j])) | |
121 | |
122 #else | |
123 | |
124 #define ALR_TRACE_DEDI_DTX(d) | |
125 #define ALR_TRACE_DEDI_PARA(hop,p1,p2,p3,p4,p5,p6,p7,p8,p9) | |
126 #define ALR_TRACE_DEDI_HO_1(p1,p2,p3,p4,p5,p6) | |
127 #define ALR_TRACE_DEDI_HO_2(p1,p2,p3,p4,p5,p6) | |
128 #define ALR_TRACE_DEDI_HO_3(p1,p2,p3,p4,p5,p6) | |
129 #define ALR_TRACE_DEDI_HO_4(p1,p2,p3) | |
130 #define ALR_TRACE_DEDI_HO_5(p1,p2,p3,p4,p5,p6) | |
131 #define ALR_TRACE_DEDI_HO_6(p1,p2,p3,p4,p5,p6) | |
132 #define ALR_TRACE_DEDI_HO_7(p1,p2,p3,p4) | |
133 #define ALR_TRACE_DEDI_FREQ_LIST() | |
134 | |
135 #endif | |
136 | |
137 | |
138 | |
139 /* | |
140 +--------------------------------------------------------------------+ | |
141 | PROJECT : GSM-PS (8403) MODULE : ALR_DEDI | | |
142 | STATE : code ROUTINE : dedi_init | | |
143 +--------------------------------------------------------------------+ | |
144 | |
145 PURPOSE : Initialize Dedicated Control Process. | |
146 | |
147 */ | |
148 | |
149 GLOBAL void dedi_init (void) | |
150 { | |
151 alr_data->state[STATE_DEDI] = DEDI_INACTIVE; | |
152 } | |
153 | |
154 | |
155 | |
156 /* | |
157 +--------------------------------------------------------------------+ | |
158 | PROJECT : GSM-PS (8403) MODULE : ALR_DEDI | | |
159 | STATE : code ROUTINE : dedi_req | | |
160 +--------------------------------------------------------------------+ | |
161 | |
162 PURPOSE : Process signal dedi_req from SDL process Main_Control. | |
163 RR configures a dedicated channel. | |
164 | |
165 */ | |
166 | |
167 /* | |
168 * Conversion Channel Type Air Interface to TI definition | |
169 */ | |
170 | |
171 LOCAL const UBYTE CH_TYPE [16] = | |
172 { | |
173 0, /* undefined */ | |
174 1, /* TCH fullrate */ | |
175 2, /* TCH halfrate (0) */ | |
176 2, /* TCH halfrate (1) */ | |
177 3, /* SDCCH/4 (0) */ | |
178 3, /* SDCCH/4 (1) */ | |
179 3, /* SDCCH/4 (2) */ | |
180 3, /* SDCCH/4 (3) */ | |
181 4, /* SDCCH/8 (0) */ | |
182 4, /* SDCCH/8 (1) */ | |
183 4, /* SDCCH/8 (2) */ | |
184 4, /* SDCCH/8 (3) */ | |
185 4, /* SDCCH/8 (4) */ | |
186 4, /* SDCCH/8 (5) */ | |
187 4, /* SDCCH/8 (6) */ | |
188 4 /* SDCCH/8 (7) */ | |
189 }; | |
190 | |
191 | |
192 /* | |
193 * Conversion Sub Channel Air Interface to TI definition | |
194 */ | |
195 | |
196 LOCAL const UBYTE SUB_TYPE [16] = | |
197 { | |
198 0, /* undefined */ | |
199 0, /* TCH fullrate */ | |
200 0, /* TCH halfrate (0) */ | |
201 1, /* TCH halfrate (1) */ | |
202 0, /* SDCCH/4 (0) */ | |
203 1, /* SDCCH/4 (1) */ | |
204 2, /* SDCCH/4 (2) */ | |
205 3, /* SDCCH/4 (3) */ | |
206 0, /* SDCCH/8 (0) */ | |
207 1, /* SDCCH/8 (1) */ | |
208 2, /* SDCCH/8 (2) */ | |
209 3, /* SDCCH/8 (3) */ | |
210 4, /* SDCCH/8 (4) */ | |
211 5, /* SDCCH/8 (5) */ | |
212 6, /* SDCCH/8 (6) */ | |
213 7 /* SDCCH/8 (7) */ | |
214 }; | |
215 | |
216 GLOBAL void dedi_req (T_MPH_DEDICATED_REQ * dedicated_req) | |
217 { | |
218 /* | |
219 * RR signals which procedure is processed | |
220 */ | |
221 USHORT mode = dedicated_req->mod; | |
222 | |
223 switch (mode) | |
224 { | |
225 case MODE_SYS_INFO_CHANGE: | |
226 /* | |
227 * Changed values for DTX, PWRC and Radio Link Timeout | |
228 */ | |
229 ALR_TRACE_DEDI_DTX(dedicated_req->tr_para.dtx); | |
230 | |
231 nc_update_dedicated (dedicated_req->tr_para.dtx, | |
232 dedicated_req->tr_para.pwrc); | |
233 alr_data->dedi_data.rlt = alr_data->dedi_data.act_rlt = (UBYTE)((dedicated_req->tr_para.rlt + 1) * 4); | |
234 | |
235 ALR_EM_SET_EM_ACT_RLT; | |
236 | |
237 break; | |
238 case MODE_IMM_ASSIGN: | |
239 /* | |
240 * Immediate Assignment Procedure | |
241 */ | |
242 dedi_imm_ass (dedicated_req); | |
243 break; | |
244 case MODE_CHAN_ASSIGN: | |
245 /* | |
246 * Intracell Handover | |
247 */ | |
248 dedi_chan_ass (dedicated_req); | |
249 /* | |
250 * reset radio link timeout counter | |
251 */ | |
252 alr_data->dedi_data.act_rlt = alr_data->dedi_data.rlt; | |
253 | |
254 ALR_EM_SET_EM_ACT_RLT; | |
255 | |
256 break; | |
257 #ifdef GPRS | |
258 case MODE_PDCH_ASSIGN: | |
259 /* | |
260 * Packet Data CHannel Assignment | |
261 */ | |
262 dedi_pdch_ass (dedicated_req); | |
263 break; | |
264 #endif | |
265 case MODE_ASYNC_HANDOVER: | |
266 case MODE_SYNC_HANDOVER: | |
267 case MODE_PRE_SYNC_HANDOVER: | |
268 { | |
269 ULONG dummy1, dummy2; | |
270 if( nc_get_fn_time(dedicated_req->arfcn, &dummy1, &dummy2) EQ FALSE) | |
271 { | |
272 /* | |
273 * Timing Information not present for the cell | |
274 */ | |
275 ALR_TRACE_DEDI("Handover to a cell - whose SYNC is not done"); | |
276 ma_dedi_cnf(DEDI_RES_CELL_NOT_SYNC); | |
277 } | |
278 else | |
279 { | |
280 nc_suspend_handover(); | |
281 switch(mode) | |
282 { | |
283 case MODE_ASYNC_HANDOVER: | |
284 /* | |
285 * Asynchronous handover | |
286 */ | |
287 dedi_async_handover (dedicated_req); | |
288 break; | |
289 case MODE_SYNC_HANDOVER: | |
290 /* | |
291 * Synchronous handover | |
292 */ | |
293 dedi_sync_handover (dedicated_req); | |
294 break; | |
295 case MODE_PRE_SYNC_HANDOVER: | |
296 /* | |
297 * Pre-synchronous handover | |
298 */ | |
299 dedi_pre_sync_handover (dedicated_req); | |
300 break; | |
301 default : | |
302 break; | |
303 } | |
304 alr_data->dedi_data.act_rlt = alr_data->dedi_data.rlt; | |
305 ALR_EM_SET_EM_ACT_RLT; | |
306 } | |
307 } | |
308 break; | |
309 default: | |
310 break; | |
311 } | |
312 } | |
313 | |
314 /* | |
315 +--------------------------------------------------------------------+ | |
316 | PROJECT : GSM-PS (8403) MODULE : ALR_DEDI | | |
317 | STATE : code ROUTINE : dedi_fail_req | | |
318 +--------------------------------------------------------------------+ | |
319 | |
320 PURPOSE : Process signal dedi_fail_req from SDL process Main_Control. | |
321 RR signals that going back to the old channel after channel | |
322 assignment or handover is necessary. | |
323 | |
324 */ | |
325 | |
326 GLOBAL void dedi_fail_req (void) | |
327 { | |
328 /* | |
329 * RR signals which procedure is running | |
330 */ | |
331 switch (alr_data->dedi_data.act_mode) | |
332 { | |
333 case MODE_CHAN_ASSIGN: | |
334 /* | |
335 * channel assignment procedure | |
336 */ | |
337 dedi_chan_ass_fail (); | |
338 break; | |
339 case MODE_PDCH_ASSIGN: | |
340 dedi_pdch_ass_fail(); | |
341 break; | |
342 case MODE_CELL_CHANGE_ORDER: | |
343 dedi_cco_fail(); | |
344 break; | |
345 case MODE_ASYNC_HANDOVER: | |
346 case MODE_SYNC_HANDOVER: | |
347 case MODE_PRE_SYNC_HANDOVER: | |
348 case MODE_PSEUDO_SYNC_HANDOVER: | |
349 /* | |
350 * one of the handover procedures | |
351 */ | |
352 dedi_handover_fail (); | |
353 break; | |
354 default: | |
355 break; | |
356 } | |
357 } | |
358 | |
359 /* | |
360 +--------------------------------------------------------------------+ | |
361 | PROJECT : GSM-PS (8403) MODULE : ALR_DEDI | | |
362 | STATE : code ROUTINE : dedi_ta_fail_ind | | |
363 +--------------------------------------------------------------------+ | |
364 | |
365 PURPOSE : Process signal dedi_ta_fail_ind from SDL process | |
366 Main_Control. | |
367 Layer 1 signals that the timing advance is out of | |
368 range during handover. This will be forwarded to RR and | |
369 switching back to the old channel is initiated by RR. | |
370 | |
371 */ | |
372 | |
373 GLOBAL void dedi_ta_fail_ind (void) | |
374 { | |
375 ma_dedi_cnf (DEDI_RES_TA_OUT_OF_RANGE); | |
376 } | |
377 | |
378 /* | |
379 +--------------------------------------------------------------------+ | |
380 | PROJECT : GSM-PS (8403) MODULE : ALR_DEDI | | |
381 | STATE : code ROUTINE : dedi_ho_finished | | |
382 +--------------------------------------------------------------------+ | |
383 | |
384 PURPOSE : Process signal dedi_ho_finished from SDL process | |
385 Main_Control. | |
386 Layer 1 signals that the handover has finished successful. | |
387 This is forwarded to RR which starts resumption of the | |
388 link on the new channel. | |
389 | |
390 */ | |
391 | |
392 GLOBAL void dedi_ho_finished (UBYTE cause) | |
393 { | |
394 ma_clean_dedi_sys_buffer (); | |
395 if (cause EQ 0) | |
396 { | |
397 ALR_TRACE_DEDI ("ho ok"); | |
398 | |
399 /* | |
400 * handover successfull | |
401 */ | |
402 ma_dedi_cnf (DEDI_RES_OK); | |
403 } | |
404 else | |
405 { | |
406 ALR_TRACE_DEDI ("ho fail"); | |
407 | |
408 /* | |
409 * handover failed | |
410 */ | |
411 nc_update_list (alr_data->dedi_data.old_bcch); | |
412 ma_dedi_cnf (DEDI_RES_TIMEOUT); | |
413 } | |
414 } | |
415 | |
416 /* | |
417 +--------------------------------------------------------------------+ | |
418 | PROJECT : GSM-PS (8403) MODULE : ALR_DEDI | | |
419 | STATE : code ROUTINE : dedi_chan_ass_fail | | |
420 +--------------------------------------------------------------------+ | |
421 | |
422 PURPOSE : Process Channel Assignment Failure (back to old | |
423 dedicated channel). | |
424 In fact this is a new configuration of the layer 1. The | |
425 parameters of the old channel are stored in TI++. | |
426 | |
427 */ | |
428 | |
429 LOCAL void dedi_chan_ass_fail (void) | |
430 { | |
431 PALLOC (chan_ass, MPHC_CHANNEL_ASSIGN_REQ); | |
432 | |
433 memset (chan_ass, 0, sizeof (T_MPHC_CHANNEL_ASSIGN_REQ)); | |
434 | |
435 if (alr_data->dedi_data.redef_starting_time.start_time_present) | |
436 { | |
437 /* | |
438 * Special case: frequency redefinition values ares stored. | |
439 */ | |
440 memcpy (&chan_ass->channel_desc_1, | |
441 &alr_data->dedi_data.redef_channel_desc, | |
442 sizeof (T_channel_desc)); | |
443 memcpy (&chan_ass->frequency_list, | |
444 &alr_data->dedi_data.redef_frequency_list, | |
445 sizeof (T_frequency_list)); | |
446 memcpy (&chan_ass->channel_desc_1_bef_sti, | |
447 &alr_data->dedi_data.old_channel_desc, | |
448 sizeof (T_channel_desc)); | |
449 memcpy (&chan_ass->frequency_list_bef_sti, | |
450 &alr_data->dedi_data.old_frequency_list, | |
451 sizeof (T_frequency_list)); | |
452 memcpy (&chan_ass->starting_time, | |
453 &alr_data->dedi_data.redef_starting_time, | |
454 sizeof (T_starting_time)); | |
455 | |
456 /* | |
457 * convert channel numbers if needed | |
458 */ | |
459 if (dedi_conversion_needed ()) | |
460 { | |
461 dedi_convert_chan_desc ((T_channel_desc *)&chan_ass->channel_desc_1); | |
462 dedi_convert_frequency_list (&chan_ass->frequency_list); | |
463 dedi_convert_chan_desc ((T_channel_desc *)&chan_ass->channel_desc_1_bef_sti); | |
464 dedi_convert_frequency_list ((T_frequency_list *)&chan_ass->frequency_list_bef_sti); | |
465 } | |
466 } | |
467 else | |
468 { | |
469 /* | |
470 * Normal case | |
471 */ | |
472 memcpy (&chan_ass->channel_desc_1, | |
473 &alr_data->dedi_data.old_channel_desc, | |
474 sizeof (T_channel_desc)); | |
475 memcpy (&chan_ass->frequency_list, | |
476 &alr_data->dedi_data.old_frequency_list, | |
477 sizeof (T_frequency_list)); | |
478 | |
479 /* | |
480 * convert channel numbers if needed | |
481 */ | |
482 if (dedi_conversion_needed ()) | |
483 { | |
484 dedi_convert_chan_desc ((T_channel_desc *)&chan_ass->channel_desc_1); | |
485 dedi_convert_frequency_list (&chan_ass->frequency_list); | |
486 } | |
487 } | |
488 | |
489 chan_ass->txpwr = alr_data->dedi_data.old_power; | |
490 chan_ass->cipher_mode = alr_data->dedi_data.old_cipher_mode; | |
491 chan_ass->channel_mode_1 = alr_data->dedi_data.old_channel_mode; | |
492 chan_ass->a5_algorithm = alr_data->dedi_data.old_a5_algorithm; | |
493 chan_ass->cipher_key = alr_data->dedi_data.old_cipher_key; | |
494 chan_ass->dtx_allowed = alr_data->dedi_data.old_dtx_allowed; | |
495 chan_ass->amr_configuration = alr_data->dedi_data.old_amr_configuration; | |
496 | |
497 /* | |
498 * store actual channel for layer 2 channel decision | |
499 */ | |
500 actual_channel = alr_data->dedi_data.old_channel; | |
501 | |
502 /* | |
503 * store actual channel parameter in ALR. In fact they are | |
504 * the old values. | |
505 */ | |
506 if (alr_data->dedi_data.redef_starting_time.start_time_present) | |
507 { | |
508 /* | |
509 * Special case: frequency redefinition values ares stored. | |
510 */ | |
511 memcpy (&alr_data->dedi_data.act_channel_desc, | |
512 &alr_data->dedi_data.redef_channel_desc, | |
513 sizeof (T_channel_desc)); | |
514 memcpy (&alr_data->dedi_data.act_frequency_list, | |
515 &alr_data->dedi_data.redef_frequency_list, | |
516 sizeof (T_frequency_list)); | |
517 } | |
518 else | |
519 { | |
520 /* | |
521 * Normal case | |
522 */ | |
523 memcpy (&alr_data->dedi_data.act_channel_desc, | |
524 &alr_data->dedi_data.old_channel_desc, | |
525 sizeof (T_channel_desc)); | |
526 memcpy (&alr_data->dedi_data.act_frequency_list, | |
527 &alr_data->dedi_data.old_frequency_list, | |
528 sizeof (T_frequency_list)); | |
529 } | |
530 alr_data->dedi_data.act_power = alr_data->dedi_data.old_power; | |
531 alr_data->dedi_data.act_cipher_mode = alr_data->dedi_data.old_cipher_mode; | |
532 alr_data->dedi_data.act_channel_mode = alr_data->dedi_data.old_channel_mode; | |
533 alr_data->dedi_data.act_a5_algorithm = alr_data->dedi_data.old_a5_algorithm; | |
534 alr_data->dedi_data.act_cipher_key = alr_data->dedi_data.old_cipher_key; | |
535 alr_data->dedi_data.act_dtx_allowed = alr_data->dedi_data.old_dtx_allowed; | |
536 alr_data->dedi_data.act_amr_configuration = alr_data->dedi_data.old_amr_configuration; | |
537 alr_data->dedi_data.act_mode = MODE_CHAN_ASS_FAIL; | |
538 | |
539 /* | |
540 * send data to layer 1 | |
541 */ | |
542 ma_dedi_chan_ass_req (chan_ass); | |
543 } | |
544 | |
545 /* | |
546 +--------------------------------------------------------------------+ | |
547 | PROJECT : GSM-PS (8403) MODULE : alr_dedi | | |
548 | STATE : code ROUTINE : dedi_pdch_ass_fail | | |
549 +--------------------------------------------------------------------+ | |
550 | |
551 PURPOSE : PDCH Assignment Failure (back to old | |
552 dedicated channel). | |
553 | |
554 Use the channel configuration in alr_data->dedi_data.act* with | |
555 MPHC-IMMED-ASSIGN-REQ. With the subsequent MPHC-IMMED-ASSIGN-CON | |
556 alr_data->dedi_data.temp* is NOT assigned to alr_data->dedi_data.act*, | |
557 refer to function dedi_imm_ass_cnf. | |
558 The actual switch back to the original channel is performed via | |
559 a channel assignment procedure carried out by dedi_chan_ass_fail | |
560 which is called in dedi_imm_ass_cnf. | |
561 */ | |
562 | |
563 LOCAL void dedi_pdch_ass_fail (void) | |
564 { | |
565 T_DEDI_DATA *d = &alr_data->dedi_data; | |
566 PALLOC (immed_assign_req, MPHC_IMMED_ASSIGN_REQ); | |
567 | |
568 memset ( immed_assign_req, 0 , sizeof *immed_assign_req ); | |
569 | |
570 immed_assign_req->channel_desc = d->old_channel_desc; | |
571 immed_assign_req->timing_advance = (UBYTE)alr_data->nc_data.tav; | |
572 immed_assign_req->frequency_list = d->old_frequency_list; | |
573 immed_assign_req->starting_time = d->old_starting_time; | |
574 immed_assign_req->frequency_list_bef_sti = d->old_frequency_list_bef_sti; | |
575 immed_assign_req->maio_bef_sti = d->old_channel_desc.chan_sel.rf_channel.maio; | |
576 /* | |
577 immed_assign_req->bcch_allocation = ... not used in current implementation | |
578 immed_assign_req->ba_id = ... not used in current implementation | |
579 */ | |
580 immed_assign_req->dtx_allowed = d->old_dtx_allowed; | |
581 immed_assign_req->pwrc = d->old_pwrc; | |
582 | |
583 SET_STATE (STATE_DEDI, DEDI_IMM_ASS_RECONN); | |
584 PSENDX (L1, immed_assign_req); | |
585 } | |
586 | |
587 /* | |
588 +--------------------------------------------------------------------+ | |
589 | PROJECT : GSM-PS (8403) MODULE : alr_dedi | | |
590 | STATE : code ROUTINE : dedi_cco_fail | | |
591 +--------------------------------------------------------------------+ | |
592 | |
593 PURPOSE : Cell Change Order Failure (back to old | |
594 dedicated channel). | |
595 | |
596 */ | |
597 | |
598 LOCAL void dedi_cco_fail (void) | |
599 { | |
600 dedi_pdch_ass_fail(); | |
601 } | |
602 | |
603 /* | |
604 +--------------------------------------------------------------------+ | |
605 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
606 | STATE : code ROUTINE : dedi_handover_fail | | |
607 +--------------------------------------------------------------------+ | |
608 | |
609 PURPOSE : Process Handover Failure (back to old | |
610 dedicated channel). | |
611 For handover switching back is carried out | |
612 autonomously by layer 1. Only the configuration | |
613 data in ALR is updated to the parameters of the | |
614 old channel. | |
615 | |
616 */ | |
617 | |
618 LOCAL void dedi_handover_fail (void) | |
619 { | |
620 | |
621 /* | |
622 * store actual channel value for layer 2 channel selection | |
623 */ | |
624 actual_channel = alr_data->dedi_data.old_channel; | |
625 | |
626 /* | |
627 * update actual channel parameters to the old values | |
628 */ | |
629 alr_data->serving_cell = alr_data->dedi_data.act_bcch = alr_data->dedi_data.old_bcch; | |
630 alr_data->dedi_data.act_channel_desc = alr_data->dedi_data.old_channel_desc; | |
631 alr_data->dedi_data.act_frequency_list = alr_data->dedi_data.old_frequency_list; | |
632 alr_data->dedi_data.act_cipher_mode = alr_data->dedi_data.old_cipher_mode; | |
633 alr_data->dedi_data.act_channel_mode = alr_data->dedi_data.old_channel_mode; | |
634 alr_data->dedi_data.act_a5_algorithm = alr_data->dedi_data.old_a5_algorithm; | |
635 alr_data->dedi_data.act_cipher_key = alr_data->dedi_data.old_cipher_key; | |
636 alr_data->dedi_data.act_amr_configuration = alr_data->dedi_data.old_amr_configuration; | |
637 alr_data->dedi_data.act_mode = MODE_HANDOVER_FAIL; | |
638 | |
639 /* | |
640 * Inform layer 1 about handover failure | |
641 */ | |
642 nc_suspend_handover(); | |
643 ma_dedi_ho_fail_req (); | |
644 } | |
645 | |
646 /* | |
647 +--------------------------------------------------------------------+ | |
648 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
649 | STATE : code ROUTINE : dedi_imm_ass | | |
650 +--------------------------------------------------------------------+ | |
651 | |
652 PURPOSE : Converts MPH_DEDICATED_REQ to MPHC_IMMED_ASSIGN_REQ. | |
653 This function is used during Immediate Assignment procedure. | |
654 | |
655 */ | |
656 | |
657 LOCAL void dedi_imm_ass (T_MPH_DEDICATED_REQ *dedicated_req) | |
658 { | |
659 T_DEDI_DATA *dd = &alr_data->dedi_data; | |
660 PALLOC (imm_ass, MPHC_IMMED_ASSIGN_REQ); /* T_MPHC_IMMED_ASSIGN_REQ */ | |
661 | |
662 ALR_EM_CONFIGURE_IMMIDIATE_ASSIGNMENT; | |
663 | |
664 memset (imm_ass, 0, sizeof (T_MPHC_IMMED_ASSIGN_REQ)); | |
665 if (dedicated_req->ch_type.h EQ 1) | |
666 { | |
667 /* | |
668 * with frequency hopping | |
669 */ | |
670 imm_ass->channel_desc.chan_sel.h = 1; | |
671 imm_ass->channel_desc.chan_sel.rf_channel.maio = | |
672 dedicated_req->ch_type.maio; | |
673 imm_ass->channel_desc.chan_sel.rf_channel.hsn = | |
674 dedicated_req->ch_type.hsn; | |
675 dedi_fill_ma (dedicated_req->ch_type.ma, &imm_ass->frequency_list); | |
676 dedi_fill_ma (dedicated_req->ch_type2.ma, | |
677 (T_frequency_list *)&imm_ass->frequency_list_bef_sti); | |
678 } | |
679 else | |
680 { | |
681 ALR_TRACE_DEDI ("no hopping"); | |
682 /* | |
683 * Avoid the union, arfcn is mapped to maio and hsn | |
684 * in the non-hopping case. | |
685 */ | |
686 imm_ass->channel_desc.chan_sel.h = 0; | |
687 imm_ass->channel_desc.chan_sel.rf_channel.maio = | |
688 (UBYTE)(dedicated_req->ch_type.arfcn & 0xFF); | |
689 imm_ass->channel_desc.chan_sel.rf_channel.hsn = | |
690 (UBYTE)((dedicated_req->ch_type.arfcn >> 8) & 0xFF); | |
691 } | |
692 | |
693 /* | |
694 * set the actual channel for layer 2 channel selection | |
695 */ | |
696 actual_channel = imm_ass->channel_desc.channel_type = | |
697 CH_TYPE [dedicated_req->ch_type.ch]; | |
698 /* | |
699 * set the rest of parameters | |
700 */ | |
701 imm_ass->channel_desc.sub_channel = SUB_TYPE [dedicated_req->ch_type.ch]; | |
702 imm_ass->channel_desc.timeslot_no = dedicated_req->ch_type.tn; | |
703 imm_ass->channel_desc.tsc = dedicated_req->ch_type.tsc; | |
704 imm_ass->timing_advance = dedicated_req->tr_para.tav; | |
705 nc_store_tav(dedicated_req->tr_para.tav); | |
706 imm_ass->starting_time.start_time_present = dedicated_req->start.v_start; | |
707 imm_ass->starting_time.start_time.t1 = dedicated_req->start.t1; | |
708 imm_ass->starting_time.start_time.t3 = dedicated_req->start.t3; | |
709 imm_ass->starting_time.start_time.t2 = dedicated_req->start.t2; | |
710 imm_ass->maio_bef_sti = dedicated_req->ch_type2.maio; | |
711 imm_ass->dtx_allowed = dedicated_req->tr_para.dtx; | |
712 /* | |
713 * calculate radio link timeout value | |
714 */ | |
715 dd->rlt = dd->act_rlt = (UBYTE)((dedicated_req->tr_para.rlt + 1) * 4); | |
716 | |
717 ALR_EM_SET_EM_ACT_RLT_2; | |
718 | |
719 memset (&imm_ass->bcch_allocation, 0, sizeof (T_bcch_allocation)); | |
720 imm_ass->ba_id = ALR_BA_LOW; | |
721 imm_ass->pwrc = dedicated_req->tr_para.pwrc; | |
722 /* | |
723 * store new parameters as temporary channel configuration | |
724 */ | |
725 dd->temp_bcch = dedicated_req->arfcn; | |
726 dd->temp_channel_desc = imm_ass->channel_desc; | |
727 dd->temp_channel_mode = dedi_channel_mode (MODE_SIG_ONLY, 0); | |
728 dd->temp_frequency_list = imm_ass->frequency_list; | |
729 dd->temp_starting_time = imm_ass->starting_time; | |
730 dd->temp_frequency_list_bef_sti = imm_ass->frequency_list_bef_sti; | |
731 dd->temp_channel_desc_bef_sti = imm_ass->channel_desc; | |
732 dd->temp_channel_desc_bef_sti.chan_sel.rf_channel.maio | |
733 = imm_ass->maio_bef_sti; | |
734 dd->temp_pwrc = imm_ass->pwrc; | |
735 dd->temp_cipher_mode = CI_NO_CIPHERING; | |
736 dd->temp_a5_algorithm = 0; | |
737 memset ( &dd->temp_cipher_key, 0, sizeof (T_cipher_key) ); | |
738 | |
739 SET_STATE (STATE_DEDI, DEDI_IMM_ASS); | |
740 | |
741 /* | |
742 * convert channel numbers if needed | |
743 */ | |
744 if (dedi_conversion_needed ()) | |
745 { | |
746 dedi_convert_chan_desc (&imm_ass->channel_desc); | |
747 dedi_convert_frequency_list (&imm_ass->frequency_list); | |
748 dedi_convert_frequency_list ((T_frequency_list *)&imm_ass->frequency_list_bef_sti); | |
749 } | |
750 | |
751 /* | |
752 * send parameters to layer 1 | |
753 */ | |
754 ALR_TRACE_DEDI_PARA(imm_ass->channel_desc.chan_sel.h, | |
755 imm_ass->channel_desc.chan_sel.rf_channel.maio+ | |
756 (imm_ass->channel_desc.chan_sel.rf_channel.hsn<<8), | |
757 imm_ass->channel_desc.channel_type, | |
758 imm_ass->channel_desc.sub_channel, | |
759 imm_ass->channel_desc.timeslot_no, | |
760 imm_ass->channel_desc.tsc, | |
761 imm_ass->timing_advance, | |
762 imm_ass->starting_time.start_time_present, | |
763 imm_ass->dtx_allowed, | |
764 imm_ass->maio_bef_sti); | |
765 | |
766 ma_dedi_imm_ass_req (imm_ass); | |
767 } | |
768 | |
769 /* | |
770 +--------------------------------------------------------------------+ | |
771 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
772 | STATE : code ROUTINE : dedi_chan_ass | | |
773 +--------------------------------------------------------------------+ | |
774 | |
775 PURPOSE : Converts MPH_DEDICATED_REQ to MPHC_CHANNEL_ASSIGN_REQ. | |
776 This function is used during channel assignment procedure. | |
777 | |
778 */ | |
779 | |
780 LOCAL void dedi_chan_ass (T_MPH_DEDICATED_REQ *dedicated_req) | |
781 { | |
782 int i; | |
783 PALLOC (chan_ass, MPHC_CHANNEL_ASSIGN_REQ); | |
784 | |
785 ALR_EM_CONFIGURE_CHANNEL_ASSIGNMENT; | |
786 | |
787 memset (chan_ass, 0, sizeof (T_MPHC_CHANNEL_ASSIGN_REQ)); | |
788 | |
789 if (dedicated_req->ch_type.h EQ 1) | |
790 { | |
791 /* | |
792 * with frequency hopping | |
793 */ | |
794 chan_ass->channel_desc_1.chan_sel.h = 1; | |
795 chan_ass->channel_desc_1.chan_sel.rf_channel.maio = | |
796 dedicated_req->ch_type.maio; | |
797 chan_ass->channel_desc_1.chan_sel.rf_channel.hsn = | |
798 dedicated_req->ch_type.hsn; | |
799 dedi_fill_ma (dedicated_req->ch_type.ma, | |
800 &chan_ass->frequency_list); | |
801 } | |
802 else | |
803 { | |
804 /* | |
805 * Avoid the union in the non-hopping case and | |
806 * map arfcn to maio and hsn. | |
807 */ | |
808 chan_ass->channel_desc_1.chan_sel.h = 0; | |
809 chan_ass->channel_desc_1.chan_sel.rf_channel.maio = | |
810 (UBYTE)(dedicated_req->ch_type.arfcn & 0xFF); | |
811 chan_ass->channel_desc_1.chan_sel.rf_channel.hsn = | |
812 (UBYTE)((dedicated_req->ch_type.arfcn >> 8) & 0xFF); | |
813 } | |
814 /* | |
815 * fill the layer 1 structure | |
816 */ | |
817 alr_data->dedi_data.temp_channel = | |
818 chan_ass->channel_desc_1.channel_type = | |
819 CH_TYPE [dedicated_req->ch_type.ch]; | |
820 chan_ass->channel_desc_1.sub_channel = | |
821 SUB_TYPE [dedicated_req->ch_type.ch]; | |
822 chan_ass->channel_desc_1.timeslot_no = dedicated_req->ch_type.tn; | |
823 chan_ass->channel_desc_1.tsc = dedicated_req->ch_type.tsc; | |
824 chan_ass->txpwr = cut_power_value (dedicated_req->tr_para.power, | |
825 dedicated_req); | |
826 chan_ass->channel_mode_1 = dedi_channel_mode(dedicated_req->tr_para.mode, | |
827 alr_data->dedi_data.temp_channel); | |
828 chan_ass->amr_configuration.noise_suppression_control_bit = dedicated_req->amr_conf.nscb; | |
829 chan_ass->amr_configuration.initial_codec_mode_indicator = dedicated_req->amr_conf.icmi; | |
830 chan_ass->amr_configuration.initial_codec_mode = dedicated_req->amr_conf.st_mode; | |
831 chan_ass->amr_configuration.active_codec_set = dedicated_req->amr_conf.acs; | |
832 /* Traces only needed for IOT session */ | |
833 TRACE_EVENT_P1("*AMR NSCB %d", chan_ass->amr_configuration.noise_suppression_control_bit); | |
834 TRACE_EVENT_P1("*AMR ICMI %d", chan_ass->amr_configuration.initial_codec_mode_indicator); | |
835 TRACE_EVENT_P1("*AMR ICM %d", chan_ass->amr_configuration.initial_codec_mode); | |
836 TRACE_EVENT_P1("*AMR ACS %d", chan_ass->amr_configuration.active_codec_set); | |
837 for (i=0; i<dedicated_req->amr_conf.c_cod_prop; i++) | |
838 { | |
839 memcpy(&chan_ass->amr_configuration.threshold[i], &dedicated_req->amr_conf.cod_prop[i].codec_thr, 1); | |
840 memcpy(&chan_ass->amr_configuration.hysteresis[i], &dedicated_req->amr_conf.cod_prop[i].codec_hyst, 1); | |
841 TRACE_EVENT_P2("*AMR threshold[%d] %d", i, chan_ass->amr_configuration.threshold[i]); | |
842 TRACE_EVENT_P2("*AMR hysteresis[%d] %d", i, chan_ass->amr_configuration.hysteresis[i]); | |
843 } | |
844 chan_ass->starting_time.start_time_present = | |
845 dedicated_req->start.v_start; | |
846 chan_ass->starting_time.start_time.t1 = | |
847 dedicated_req->start.t1; | |
848 chan_ass->starting_time.start_time.t3 = | |
849 dedicated_req->start.t3; | |
850 chan_ass->starting_time.start_time.t2 = | |
851 dedicated_req->start.t2; | |
852 | |
853 if (dedicated_req->ch_type2.ch NEQ NOT_PRESENT_8BIT) | |
854 { | |
855 | |
856 if (dedicated_req->ch_type2.h EQ 1) | |
857 { | |
858 chan_ass->channel_desc_1_bef_sti.chan_sel.h = 1; | |
859 chan_ass->channel_desc_1_bef_sti.chan_sel.rf_channel.maio = | |
860 dedicated_req->ch_type2.maio; | |
861 chan_ass->channel_desc_1_bef_sti.chan_sel.rf_channel.hsn = | |
862 dedicated_req->ch_type2.hsn; | |
863 dedi_fill_ma (dedicated_req->ch_type2.ma, | |
864 (T_frequency_list *)&chan_ass->frequency_list_bef_sti); | |
865 } | |
866 else | |
867 { | |
868 /* | |
869 * Avoid the union !!! | |
870 */ | |
871 chan_ass->channel_desc_1_bef_sti.chan_sel.h = 0; | |
872 chan_ass->channel_desc_1_bef_sti.chan_sel.rf_channel.maio = | |
873 (UBYTE)(dedicated_req->ch_type2.arfcn & 0xFF); | |
874 chan_ass->channel_desc_1_bef_sti.chan_sel.rf_channel.hsn = | |
875 (UBYTE)((dedicated_req->ch_type2.arfcn >> 8) & 0xFF); | |
876 } | |
877 chan_ass->channel_desc_1_bef_sti.channel_type = | |
878 CH_TYPE [dedicated_req->ch_type2.ch]; | |
879 chan_ass->channel_desc_1_bef_sti.sub_channel = | |
880 SUB_TYPE [dedicated_req->ch_type2.ch]; | |
881 chan_ass->channel_desc_1_bef_sti.timeslot_no = | |
882 dedicated_req->ch_type2.tn; | |
883 chan_ass->channel_desc_1_bef_sti.tsc = | |
884 dedicated_req->ch_type2.tsc; | |
885 } | |
886 chan_ass->cipher_mode = dedicated_req->ciph.stat; | |
887 chan_ass->a5_algorithm = dedicated_req->ciph.algo; | |
888 memcpy (&chan_ass->cipher_key, dedicated_req->ciph.kc, KC_STRING_SIZE); | |
889 chan_ass->dtx_allowed = dedicated_req->tr_para.dtx; | |
890 | |
891 /* | |
892 * store the new configuration as temporary configuration | |
893 */ | |
894 alr_data->dedi_data.temp_bcch = dedicated_req->arfcn; | |
895 memcpy (&alr_data->dedi_data.temp_channel_desc, | |
896 &chan_ass->channel_desc_1, | |
897 sizeof (T_channel_desc)); | |
898 alr_data->dedi_data.temp_channel_mode = chan_ass->channel_mode_1; | |
899 alr_data->dedi_data.temp_frequency_list = chan_ass->frequency_list; | |
900 alr_data->dedi_data.temp_cipher_mode = chan_ass->cipher_mode; | |
901 alr_data->dedi_data.temp_a5_algorithm = chan_ass->a5_algorithm; | |
902 alr_data->dedi_data.temp_cipher_key = chan_ass->cipher_key; | |
903 alr_data->dedi_data.temp_power = chan_ass->txpwr; | |
904 alr_data->dedi_data.temp_dtx_allowed = chan_ass->dtx_allowed; | |
905 alr_data->dedi_data.act_mode = MODE_CHAN_ASSIGN; | |
906 alr_data->dedi_data.temp_amr_configuration = chan_ass->amr_configuration; | |
907 | |
908 /* | |
909 * convert channel numbers if needed | |
910 */ | |
911 if (dedi_conversion_needed ()) | |
912 { | |
913 dedi_convert_chan_desc ((T_channel_desc *)&chan_ass->channel_desc_1); | |
914 dedi_convert_chan_desc ((T_channel_desc *)&chan_ass->channel_desc_1_bef_sti); | |
915 dedi_convert_frequency_list (&chan_ass->frequency_list); | |
916 dedi_convert_frequency_list ((T_frequency_list *)&chan_ass->frequency_list_bef_sti); | |
917 } | |
918 | |
919 /* | |
920 * inform layer 1 about the new channel configuration | |
921 */ | |
922 ma_dedi_chan_ass_req (chan_ass); | |
923 } | |
924 | |
925 /* | |
926 +--------------------------------------------------------------------+ | |
927 | PROJECT : GSM-PS (8403) MODULE : alr_dedi | | |
928 | STATE : code ROUTINE : dedi_pdch_ass | | |
929 +--------------------------------------------------------------------+ | |
930 | |
931 PURPOSE : "Deactivation of previously assigned channels (layer1)" | |
932 according to GSM 04.18, clause 3.4.19 during a | |
933 PDCH Assignment procedure. | |
934 | |
935 */ | |
936 | |
937 LOCAL void dedi_pdch_ass (T_MPH_DEDICATED_REQ *dedicated_req) | |
938 { | |
939 T_DEDI_DATA *d = &alr_data->dedi_data; | |
940 | |
941 /* | |
942 * The PDCH Assignment Procedure is similar to the Channel Assignment | |
943 * Procedure. Both are perfomred in dedicated state in order to switch | |
944 * to a 'new' channel. "Normal operation" is suspend during the procedure. | |
945 * In case of failure the old channel is activated and the message | |
946 * ASSIGNMENT FAILURE is sent. | |
947 */ | |
948 | |
949 ma_stop_active_procs ( STOP_PCH_READING ); | |
950 | |
951 /* Current state is now DEDI_INACTIVE. | |
952 * In Layer 1 SDCCH or TCH is stopped. In order to re-activate the channel | |
953 * (failure to TBF establishment), the Current Channel Configuration must be | |
954 * stored. This configuration will then be used to re-establish the channel. | |
955 * The Current Channel Configuration is provided in the last successful | |
956 * Immediate Assignment, Channel Assignment or Handover in the variables | |
957 * alr_data->dedi_data.act***. The re-activation can be done with the | |
958 * Immediate Assignment Procedure followed by a Channel Assignment Procedure. | |
959 * However there is the prerequisite that L1 must be in Idle Mode to perform | |
960 * Immediate Assignment. This will be achieved by sending MPH-IDLE-REQ. | |
961 */ | |
962 | |
963 d->old_channel = actual_channel; | |
964 d->old_bcch = d->act_bcch; | |
965 d->old_channel_desc = d->act_channel_desc; | |
966 d->old_channel_mode = d->act_channel_mode; | |
967 d->old_frequency_list = d->act_frequency_list; | |
968 d->old_starting_time = d->act_starting_time; | |
969 d->old_frequency_list_bef_sti = d->act_frequency_list_bef_sti; | |
970 d->old_channel_desc_bef_sti = d->act_channel_desc_bef_sti; | |
971 d->old_pwrc = d->act_pwrc; | |
972 d->old_cipher_mode = d->act_cipher_mode; | |
973 d->old_a5_algorithm = d->act_a5_algorithm; | |
974 d->old_cipher_key = d->act_cipher_key; | |
975 d->old_power = d->act_power; | |
976 d->old_dtx_allowed = d->act_dtx_allowed; | |
977 | |
978 /* | |
979 * Save the activation mode for Resume / Reconnection | |
980 */ | |
981 alr_data->dedi_data.act_mode = MODE_PDCH_ASSIGN; | |
982 } | |
983 | |
984 /* | |
985 +--------------------------------------------------------------------+ | |
986 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
987 | STATE : code ROUTINE : dedi_async_handover | | |
988 +--------------------------------------------------------------------+ | |
989 | |
990 PURPOSE : Converts MPH_DEDICATED_REQ to MPHC_ASYNC_HO_REQ. | |
991 This function is used during asynchronous handover. | |
992 | |
993 */ | |
994 | |
995 LOCAL void dedi_async_handover (T_MPH_DEDICATED_REQ * dedicated_req) | |
996 { | |
997 int i; | |
998 PALLOC (async, MPHC_ASYNC_HO_REQ); | |
999 | |
1000 ALR_EM_CONFIGURE_HANDOVER(EM_HANDOVER_ASYNC); | |
1001 | |
1002 memset (async, 0, sizeof (T_MPHC_ASYNC_HO_REQ)); | |
1003 if (dedicated_req->ch_type.h EQ 1) | |
1004 { | |
1005 ALR_TRACE_DEDI ("hopping"); | |
1006 /* | |
1007 * new channel with frequency hopping. | |
1008 */ | |
1009 async->handover_command.channel_desc_1.chan_sel.h = 1; | |
1010 async->handover_command.channel_desc_1.chan_sel.rf_channel.maio = | |
1011 dedicated_req->ch_type.maio; | |
1012 async->handover_command.channel_desc_1.chan_sel.rf_channel.hsn = | |
1013 dedicated_req->ch_type.hsn; | |
1014 dedi_fill_ma (dedicated_req->ch_type.ma, | |
1015 &async->handover_command.frequency_list); | |
1016 } | |
1017 else | |
1018 { | |
1019 ALR_TRACE_DEDI ("no hop"); | |
1020 /* | |
1021 * Avoid the union in the non-hopping case. Mapping | |
1022 * of arfcn to maio and hsn. | |
1023 */ | |
1024 async->handover_command.channel_desc_1.chan_sel.h = 0; | |
1025 async->handover_command.channel_desc_1.chan_sel.rf_channel.maio = | |
1026 (UBYTE)(dedicated_req->ch_type.arfcn & 0xFF); | |
1027 async->handover_command.channel_desc_1.chan_sel.rf_channel.hsn = | |
1028 (UBYTE)((dedicated_req->ch_type.arfcn >> 8) & 0xFF); | |
1029 } | |
1030 | |
1031 /* | |
1032 * convert the parameters to the layer 1 structure | |
1033 */ | |
1034 alr_data->dedi_data.temp_channel = async->handover_command.channel_desc_1.channel_type = CH_TYPE [dedicated_req->ch_type.ch]; | |
1035 async->handover_command.channel_desc_1.sub_channel = SUB_TYPE [dedicated_req->ch_type.ch]; | |
1036 async->handover_command.channel_desc_1.timeslot_no = dedicated_req->ch_type.tn; | |
1037 async->handover_command.channel_desc_1.tsc = dedicated_req->ch_type.tsc; | |
1038 async->handover_command.txpwr = cut_power_value (dedicated_req->ho_param.ho_pow, dedicated_req); | |
1039 async->handover_command.ho_acc = dedicated_req->ho_param.ho_ref; | |
1040 async->handover_command.starting_time.start_time_present = dedicated_req->start.v_start; | |
1041 if (dedicated_req->start.v_start) | |
1042 { | |
1043 ALR_TRACE_DEDI ("start time"); | |
1044 | |
1045 async->handover_command.starting_time.start_time.t1 = dedicated_req->start.t1; | |
1046 async->handover_command.starting_time.start_time.t3 = dedicated_req->start.t3; | |
1047 async->handover_command.starting_time.start_time.t2 = dedicated_req->start.t2; | |
1048 } | |
1049 async->handover_command.cell_description.ncc = (UBYTE)(dedicated_req->bsic >> 3); | |
1050 async->handover_command.cell_description.bcc = (UBYTE)(dedicated_req->bsic & 7); | |
1051 async->handover_command.cell_description.bcch_carrier = ARFCN_TO_L1 (dedicated_req->arfcn); | |
1052 async->handover_command.channel_mode_1 = | |
1053 dedi_channel_mode (dedicated_req->tr_para.mode, | |
1054 alr_data->dedi_data.temp_channel); | |
1055 async->amr_configuration.noise_suppression_control_bit = dedicated_req->amr_conf.nscb; | |
1056 async->amr_configuration.initial_codec_mode_indicator = dedicated_req->amr_conf.icmi; | |
1057 async->amr_configuration.initial_codec_mode = dedicated_req->amr_conf.st_mode; | |
1058 async->amr_configuration.active_codec_set = dedicated_req->amr_conf.acs; | |
1059 /* Traces only needed for IOT session */ | |
1060 TRACE_EVENT_P1("*AMR NSCB %d", async->amr_configuration.noise_suppression_control_bit); | |
1061 TRACE_EVENT_P1("*AMR ICMI %d", async->amr_configuration.initial_codec_mode_indicator); | |
1062 TRACE_EVENT_P1("*AMR ICM %d", async->amr_configuration.initial_codec_mode); | |
1063 TRACE_EVENT_P1("*AMR ACS %d", async->amr_configuration.active_codec_set); | |
1064 for (i=0; i<dedicated_req->amr_conf.c_cod_prop; i++) | |
1065 { | |
1066 memcpy(&async->amr_configuration.threshold[i], &dedicated_req->amr_conf.cod_prop[i].codec_thr, 1); | |
1067 memcpy(&async->amr_configuration.hysteresis[i], &dedicated_req->amr_conf.cod_prop[i].codec_hyst, 1); | |
1068 TRACE_EVENT_P2("*AMR threshold[%d] %d", i, async->amr_configuration.threshold[i]); | |
1069 TRACE_EVENT_P2("*AMR hysteresis[%d] %d", i, async->amr_configuration.hysteresis[i]); | |
1070 } | |
1071 | |
1072 | |
1073 if (dedicated_req->start.v_start AND | |
1074 dedicated_req->ch_type2.ch NEQ NOT_PRESENT_8BIT) | |
1075 { | |
1076 ALR_TRACE_DEDI ("bef sti"); | |
1077 /* | |
1078 * before starting time elements are available | |
1079 */ | |
1080 | |
1081 if (dedicated_req->ch_type2.h EQ 1) | |
1082 { | |
1083 async->handover_command.channel_desc_1_bef_sti.chan_sel.h = 1; | |
1084 async->handover_command.channel_desc_1_bef_sti.chan_sel.rf_channel.maio = dedicated_req->ch_type2.maio; | |
1085 async->handover_command.channel_desc_1_bef_sti.chan_sel.rf_channel.hsn = dedicated_req->ch_type2.hsn; | |
1086 dedi_fill_ma (dedicated_req->ch_type2.ma, (T_frequency_list *) &async->handover_command.frequency_list_bef_sti); | |
1087 } | |
1088 else | |
1089 { | |
1090 /* | |
1091 * Avoid the union !!! | |
1092 */ | |
1093 async->handover_command.channel_desc_1_bef_sti.chan_sel.h = 0; | |
1094 async->handover_command.channel_desc_1_bef_sti.chan_sel.rf_channel.maio = | |
1095 (UBYTE)(dedicated_req->ch_type2.arfcn & 0xFF); | |
1096 async->handover_command.channel_desc_1_bef_sti.chan_sel.rf_channel.hsn = | |
1097 (UBYTE)((dedicated_req->ch_type2.arfcn >> 8) & 0xFF); | |
1098 } | |
1099 | |
1100 async->handover_command.channel_desc_1_bef_sti.channel_type = CH_TYPE [dedicated_req->ch_type2.ch]; | |
1101 async->handover_command.channel_desc_1_bef_sti.sub_channel = SUB_TYPE [dedicated_req->ch_type2.ch]; | |
1102 async->handover_command.channel_desc_1_bef_sti.timeslot_no = dedicated_req->ch_type2.tn; | |
1103 async->handover_command.channel_desc_1_bef_sti.tsc = dedicated_req->ch_type2.tsc; | |
1104 } | |
1105 async->handover_command.cipher_mode = dedicated_req->ciph.stat; | |
1106 async->handover_command.a5_algorithm = dedicated_req->ciph.algo; | |
1107 memcpy (&async->cipher_key, dedicated_req->ciph.kc, KC_STRING_SIZE); | |
1108 | |
1109 /* | |
1110 * store the new parameters as temporary configuration. | |
1111 */ | |
1112 alr_data->dedi_data.temp_bcch = dedicated_req->arfcn; | |
1113 memcpy (&alr_data->dedi_data.temp_channel_desc, &async->handover_command.channel_desc_1, sizeof (T_channel_desc)); | |
1114 alr_data->dedi_data.temp_channel_mode = async->handover_command.channel_mode_1; | |
1115 alr_data->dedi_data.temp_frequency_list = async->handover_command.frequency_list; | |
1116 alr_data->dedi_data.temp_cipher_mode = async->handover_command.cipher_mode; | |
1117 alr_data->dedi_data.temp_a5_algorithm = async->handover_command.a5_algorithm; | |
1118 alr_data->dedi_data.temp_cipher_key = async->cipher_key; | |
1119 alr_data->dedi_data.temp_power = async->handover_command.txpwr; | |
1120 alr_data->dedi_data.temp_bsic = dedicated_req->bsic; | |
1121 alr_data->dedi_data.temp_amr_configuration = async->amr_configuration; | |
1122 alr_data->dedi_data.act_mode = MODE_ASYNC_HANDOVER; | |
1123 | |
1124 nc_get_fn_time (alr_data->dedi_data.temp_bcch, (ULONG *)&async->fn_offset, (ULONG *)&async->time_alignmnt); | |
1125 | |
1126 /* | |
1127 * convert channel numbers if needed | |
1128 */ | |
1129 if (dedi_conversion_needed ()) | |
1130 { | |
1131 dedi_convert_chan_desc ((T_channel_desc *)&async->handover_command.channel_desc_1); | |
1132 dedi_convert_chan_desc ((T_channel_desc *)&async->handover_command.channel_desc_1_bef_sti); | |
1133 dedi_convert_frequency_list (&async->handover_command.frequency_list); | |
1134 dedi_convert_frequency_list ((T_frequency_list *)&async->handover_command.frequency_list_bef_sti); | |
1135 } | |
1136 /* | |
1137 * forward the parameters to layer 1 | |
1138 */ | |
1139 ALR_TRACE_DEDI_HO_1 (dedicated_req->arfcn, | |
1140 dedicated_req->bsic, | |
1141 dedicated_req->start.v_start, | |
1142 dedicated_req->ch_type2.ch, | |
1143 dedicated_req->ch_type.ch, | |
1144 dedicated_req->ch_type.tsc); | |
1145 ALR_TRACE_DEDI_HO_2 (dedicated_req->ch_type.tn, | |
1146 dedicated_req->ch_type.arfcn, | |
1147 dedicated_req->ho_param.ho_pow, | |
1148 dedicated_req->ho_param.ho_ref, | |
1149 dedicated_req->ho_param.ho_acc_type, | |
1150 dedicated_req->ho_param.ho_nci); | |
1151 ALR_TRACE_DEDI_HO_3 (dedicated_req->tr_para.mode, | |
1152 dedicated_req->tr_para.power, | |
1153 dedicated_req->tr_para.dtx, | |
1154 dedicated_req->tr_para.rlt, | |
1155 dedicated_req->tr_para.tav, | |
1156 dedicated_req->tr_para.pwrc); | |
1157 ALR_TRACE_DEDI_HO_4 (dedicated_req->tr_para.mode, | |
1158 dedicated_req->ciph.stat, | |
1159 dedicated_req->ciph.algo); | |
1160 ALR_TRACE_DEDI_HO_5 (async->handover_command.channel_desc_1.chan_sel.h, | |
1161 async->handover_command.channel_desc_1.chan_sel.rf_channel.maio, | |
1162 async->handover_command.channel_desc_1.chan_sel.rf_channel.hsn, | |
1163 async->handover_command.channel_desc_1.channel_type, | |
1164 async->handover_command.channel_desc_1.sub_channel, | |
1165 async->handover_command.channel_desc_1.timeslot_no); | |
1166 ALR_TRACE_DEDI_HO_6 (async->handover_command.channel_desc_1.tsc, | |
1167 async->handover_command.txpwr, | |
1168 async->handover_command.ho_acc, | |
1169 async->handover_command.starting_time.start_time_present, | |
1170 async->handover_command.cell_description.ncc, | |
1171 async->handover_command.cell_description.bcc); | |
1172 ALR_TRACE_DEDI_HO_7 (async->handover_command.cell_description.bcch_carrier, | |
1173 async->handover_command.channel_mode_1, | |
1174 async->handover_command.cipher_mode, | |
1175 async->handover_command.a5_algorithm); | |
1176 | |
1177 ma_dedi_async_ho_req (async); | |
1178 } | |
1179 | |
1180 | |
1181 /* | |
1182 +--------------------------------------------------------------------+ | |
1183 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
1184 | STATE : code ROUTINE : dedi_sync_handover | | |
1185 +--------------------------------------------------------------------+ | |
1186 | |
1187 PURPOSE : Converts MPH_DEDICATED_REQ to MPHC_SYNC_HO_REQ. | |
1188 This function is used during synchronous handover. | |
1189 | |
1190 */ | |
1191 | |
1192 LOCAL void dedi_sync_handover (T_MPH_DEDICATED_REQ *dedicated_req) | |
1193 { | |
1194 int i; | |
1195 PALLOC (sync, MPHC_SYNC_HO_REQ); | |
1196 | |
1197 ALR_EM_CONFIGURE_HANDOVER(EM_HANDOVER_SYNC); | |
1198 | |
1199 memset (sync, 0, sizeof (T_MPHC_SYNC_HO_REQ)); | |
1200 if (dedicated_req->ch_type.h EQ 1) | |
1201 { | |
1202 /* | |
1203 * new cell with frequency hopping | |
1204 */ | |
1205 sync->handover_command.channel_desc_1.chan_sel.h = 1; | |
1206 sync->handover_command.channel_desc_1.chan_sel.rf_channel.maio = | |
1207 dedicated_req->ch_type.maio; | |
1208 sync->handover_command.channel_desc_1.chan_sel.rf_channel.hsn = | |
1209 dedicated_req->ch_type.hsn; | |
1210 dedi_fill_ma (dedicated_req->ch_type.ma, | |
1211 &sync->handover_command.frequency_list); | |
1212 } | |
1213 else | |
1214 { | |
1215 /* | |
1216 * Avoid the union in the non-hopping case, map arfcn to | |
1217 * maio and hsn | |
1218 */ | |
1219 sync->handover_command.channel_desc_1.chan_sel.h = 0; | |
1220 sync->handover_command.channel_desc_1.chan_sel.rf_channel.maio = | |
1221 (UBYTE)(dedicated_req->ch_type.arfcn & 0xFF); | |
1222 sync->handover_command.channel_desc_1.chan_sel.rf_channel.hsn = | |
1223 (UBYTE)((dedicated_req->ch_type.arfcn >> 8) & 0xFF); | |
1224 } | |
1225 | |
1226 /* | |
1227 * fill layer 1 structure with the new parameters | |
1228 */ | |
1229 alr_data->dedi_data.temp_channel = | |
1230 sync->handover_command.channel_desc_1.channel_type = | |
1231 CH_TYPE [dedicated_req->ch_type.ch]; | |
1232 sync->handover_command.channel_desc_1.sub_channel = | |
1233 SUB_TYPE [dedicated_req->ch_type.ch]; | |
1234 sync->handover_command.channel_desc_1.timeslot_no = | |
1235 dedicated_req->ch_type.tn; | |
1236 sync->handover_command.channel_desc_1.tsc = dedicated_req->ch_type.tsc; | |
1237 sync->handover_command.txpwr = | |
1238 cut_power_value (dedicated_req->ho_param.ho_pow, dedicated_req); | |
1239 sync->handover_command.ho_acc = dedicated_req->ho_param.ho_ref; | |
1240 sync->handover_command.starting_time.start_time_present = | |
1241 dedicated_req->start.v_start; | |
1242 sync->handover_command.starting_time.start_time.t1 = | |
1243 dedicated_req->start.t1; | |
1244 sync->handover_command.starting_time.start_time.t3 = | |
1245 dedicated_req->start.t3; | |
1246 sync->handover_command.starting_time.start_time.t2 = | |
1247 dedicated_req->start.t2; | |
1248 | |
1249 sync->nci = dedicated_req->ho_param.ho_nci; | |
1250 sync->handover_command.cell_description.ncc = | |
1251 (UBYTE)(dedicated_req->bsic >> 3); | |
1252 sync->handover_command.cell_description.bcc = | |
1253 (UBYTE)(dedicated_req->bsic & 7); | |
1254 sync->handover_command.cell_description.bcch_carrier = | |
1255 ARFCN_TO_L1(dedicated_req->arfcn); | |
1256 sync->handover_command.channel_mode_1 = | |
1257 dedi_channel_mode (dedicated_req->tr_para.mode, | |
1258 alr_data->dedi_data.temp_channel); | |
1259 sync->amr_configuration.noise_suppression_control_bit = dedicated_req->amr_conf.nscb; | |
1260 sync->amr_configuration.initial_codec_mode_indicator = dedicated_req->amr_conf.icmi; | |
1261 sync->amr_configuration.initial_codec_mode = dedicated_req->amr_conf.st_mode; | |
1262 sync->amr_configuration.active_codec_set = dedicated_req->amr_conf.acs; | |
1263 /* Traces only needed for IOT session */ | |
1264 TRACE_EVENT_P1("*AMR NSCB %d", sync->amr_configuration.noise_suppression_control_bit); | |
1265 TRACE_EVENT_P1("*AMR ICMI %d", sync->amr_configuration.initial_codec_mode_indicator); | |
1266 TRACE_EVENT_P1("*AMR ICM %d", sync->amr_configuration.initial_codec_mode); | |
1267 TRACE_EVENT_P1("*AMR ACS %d", sync->amr_configuration.active_codec_set); | |
1268 for (i=0; i<dedicated_req->amr_conf.c_cod_prop; i++) | |
1269 { | |
1270 memcpy(&sync->amr_configuration.threshold[i], &dedicated_req->amr_conf.cod_prop[i].codec_thr, 1); | |
1271 memcpy(&sync->amr_configuration.hysteresis[i], &dedicated_req->amr_conf.cod_prop[i].codec_hyst, 1); | |
1272 TRACE_EVENT_P2("*AMR threshold[%d] %d", i, sync->amr_configuration.threshold[i]); | |
1273 TRACE_EVENT_P2("*AMR hysteresis[%d] %d", i, sync->amr_configuration.hysteresis[i]); | |
1274 } | |
1275 | |
1276 if (dedicated_req->start.v_start AND | |
1277 dedicated_req->ch_type2.ch NEQ NOT_PRESENT_8BIT) | |
1278 { | |
1279 | |
1280 if (dedicated_req->ch_type2.h EQ 1) | |
1281 { | |
1282 sync->handover_command.channel_desc_1_bef_sti.chan_sel.h = 1; | |
1283 sync->handover_command.channel_desc_1_bef_sti.chan_sel.rf_channel.maio = dedicated_req->ch_type2.maio; | |
1284 sync->handover_command.channel_desc_1_bef_sti.chan_sel.rf_channel.hsn = dedicated_req->ch_type2.hsn; | |
1285 dedi_fill_ma (dedicated_req->ch_type2.ma, | |
1286 (T_frequency_list *) | |
1287 &sync->handover_command.frequency_list_bef_sti); | |
1288 } | |
1289 else | |
1290 { | |
1291 /* | |
1292 * Avoid the union !!! | |
1293 */ | |
1294 sync->handover_command.channel_desc_1_bef_sti.chan_sel.h = 0; | |
1295 sync->handover_command.channel_desc_1_bef_sti.chan_sel.rf_channel.maio = | |
1296 (UBYTE)(dedicated_req->ch_type2.arfcn & 0xFF); | |
1297 sync->handover_command.channel_desc_1_bef_sti.chan_sel.rf_channel.hsn = | |
1298 (UBYTE)((dedicated_req->ch_type2.arfcn >> 8) & 0xFF); | |
1299 } | |
1300 sync->handover_command.channel_desc_1_bef_sti.channel_type = | |
1301 CH_TYPE [dedicated_req->ch_type2.ch]; | |
1302 sync->handover_command.channel_desc_1_bef_sti.sub_channel = | |
1303 SUB_TYPE [dedicated_req->ch_type2.ch]; | |
1304 sync->handover_command.channel_desc_1_bef_sti.timeslot_no = | |
1305 dedicated_req->ch_type2.tn; | |
1306 sync->handover_command.channel_desc_1_bef_sti.tsc = | |
1307 dedicated_req->ch_type2.tsc; | |
1308 } | |
1309 sync->handover_command.cipher_mode = dedicated_req->ciph.stat; | |
1310 sync->handover_command.a5_algorithm = dedicated_req->ciph.algo; | |
1311 memcpy (&sync->cipher_key, dedicated_req->ciph.kc, KC_STRING_SIZE); | |
1312 | |
1313 /* | |
1314 * store the new values as temporary configuration | |
1315 */ | |
1316 alr_data->dedi_data.temp_bcch = dedicated_req->arfcn; | |
1317 memcpy (&alr_data->dedi_data.temp_channel_desc, | |
1318 &sync->handover_command.channel_desc_1, | |
1319 sizeof (T_channel_desc)); | |
1320 alr_data->dedi_data.temp_channel_mode = | |
1321 sync->handover_command.channel_mode_1; | |
1322 alr_data->dedi_data.temp_frequency_list = | |
1323 sync->handover_command.frequency_list; | |
1324 alr_data->dedi_data.temp_cipher_mode = | |
1325 sync->handover_command.cipher_mode; | |
1326 alr_data->dedi_data.temp_a5_algorithm = | |
1327 sync->handover_command.a5_algorithm; | |
1328 alr_data->dedi_data.temp_cipher_key = | |
1329 sync->cipher_key; | |
1330 alr_data->dedi_data.temp_power = sync->handover_command.txpwr; | |
1331 alr_data->dedi_data.temp_bsic = dedicated_req->bsic; | |
1332 alr_data->dedi_data.temp_amr_configuration = sync->amr_configuration; | |
1333 alr_data->dedi_data.act_mode = MODE_SYNC_HANDOVER; | |
1334 | |
1335 nc_get_fn_time (alr_data->dedi_data.temp_bcch, | |
1336 (ULONG *)&sync->fn_offset, | |
1337 (ULONG *)&sync->time_alignmnt); | |
1338 | |
1339 /* | |
1340 * convert channel numbers if needed | |
1341 */ | |
1342 if (dedi_conversion_needed ()) | |
1343 { | |
1344 dedi_convert_chan_desc ((T_channel_desc *)&sync->handover_command.channel_desc_1); | |
1345 dedi_convert_chan_desc ((T_channel_desc *)&sync->handover_command.channel_desc_1_bef_sti); | |
1346 dedi_convert_frequency_list (&sync->handover_command.frequency_list); | |
1347 dedi_convert_frequency_list ((T_frequency_list *)&sync->handover_command.frequency_list_bef_sti); | |
1348 } | |
1349 /* | |
1350 * forward the new configuration to layer 1 | |
1351 */ | |
1352 ma_dedi_sync_ho_req (sync); | |
1353 } | |
1354 | |
1355 /* | |
1356 +--------------------------------------------------------------------+ | |
1357 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
1358 | STATE : code ROUTINE : dedi_pre_sync_handover | | |
1359 +--------------------------------------------------------------------+ | |
1360 | |
1361 PURPOSE : Converts MPH_DEDICATED_REQ to MPHC_PRE_SYNC_HO_REQ. | |
1362 This function is used during pre-synchronous handover. | |
1363 | |
1364 */ | |
1365 | |
1366 LOCAL void dedi_pre_sync_handover (T_MPH_DEDICATED_REQ *dedicated_req) | |
1367 { | |
1368 int i; | |
1369 PALLOC (presync, MPHC_PRE_SYNC_HO_REQ); | |
1370 | |
1371 ALR_EM_CONFIGURE_HANDOVER(EM_HANDOVER_PRE_SYNC); | |
1372 | |
1373 memset (presync, 0, sizeof (T_MPHC_PRE_SYNC_HO_REQ)); | |
1374 if (dedicated_req->ch_type.h EQ 1) | |
1375 { | |
1376 /* | |
1377 * new channel uses frequency hopping | |
1378 */ | |
1379 presync->handover_command.channel_desc_1.chan_sel.h = 1; | |
1380 presync->handover_command.channel_desc_1.chan_sel.rf_channel.maio = | |
1381 dedicated_req->ch_type.maio; | |
1382 presync->handover_command.channel_desc_1.chan_sel.rf_channel.hsn = | |
1383 dedicated_req->ch_type.hsn; | |
1384 dedi_fill_ma (dedicated_req->ch_type.ma, | |
1385 &presync->handover_command.frequency_list); | |
1386 } | |
1387 else | |
1388 { | |
1389 /* | |
1390 * Avoid the union in the non-hopping case. Map arfcn to | |
1391 * maio and hsn. | |
1392 */ | |
1393 presync->handover_command.channel_desc_1.chan_sel.h = 0; | |
1394 presync->handover_command.channel_desc_1.chan_sel.rf_channel.maio = | |
1395 (UBYTE)(dedicated_req->ch_type.arfcn & 0xFF); | |
1396 presync->handover_command.channel_desc_1.chan_sel.rf_channel.hsn = | |
1397 (UBYTE)((dedicated_req->ch_type.arfcn >> 8) & 0xFF); | |
1398 } | |
1399 | |
1400 /* | |
1401 * fill layer 1 structure with the new parameters | |
1402 */ | |
1403 alr_data->dedi_data.temp_channel = | |
1404 presync->handover_command.channel_desc_1.channel_type = | |
1405 CH_TYPE [dedicated_req->ch_type.ch]; | |
1406 presync->handover_command.channel_desc_1.sub_channel = | |
1407 SUB_TYPE [dedicated_req->ch_type.ch]; | |
1408 presync->handover_command.channel_desc_1.timeslot_no = | |
1409 dedicated_req->ch_type.tn; | |
1410 presync->handover_command.channel_desc_1.tsc = dedicated_req->ch_type.tsc; | |
1411 presync->handover_command.txpwr = | |
1412 cut_power_value (dedicated_req->ho_param.ho_pow, dedicated_req); | |
1413 presync->handover_command.ho_acc = dedicated_req->ho_param.ho_ref; | |
1414 presync->handover_command.starting_time.start_time_present = | |
1415 dedicated_req->start.v_start; | |
1416 presync->handover_command.starting_time.start_time.t1 = | |
1417 dedicated_req->start.t1; | |
1418 presync->handover_command.starting_time.start_time.t3 = | |
1419 dedicated_req->start.t3; | |
1420 presync->handover_command.starting_time.start_time.t2 = | |
1421 dedicated_req->start.t2; | |
1422 presync->handover_command.cell_description.ncc = | |
1423 (UBYTE)(dedicated_req->bsic >> 3); | |
1424 presync->handover_command.cell_description.bcc = | |
1425 (UBYTE)(dedicated_req->bsic & 7); | |
1426 presync->handover_command.cell_description.bcch_carrier = | |
1427 ARFCN_TO_L1(dedicated_req->arfcn); | |
1428 presync->nci = dedicated_req->ho_param.ho_nci; | |
1429 presync->handover_command.channel_mode_1 = | |
1430 dedi_channel_mode (dedicated_req->tr_para.mode, | |
1431 alr_data->dedi_data.temp_channel); | |
1432 presync->amr_configuration.noise_suppression_control_bit = dedicated_req->amr_conf.nscb; | |
1433 presync->amr_configuration.initial_codec_mode_indicator = dedicated_req->amr_conf.icmi; | |
1434 presync->amr_configuration.initial_codec_mode = dedicated_req->amr_conf.st_mode; | |
1435 presync->amr_configuration.active_codec_set = dedicated_req->amr_conf.acs; | |
1436 /* Traces only needed for IOT session */ | |
1437 TRACE_EVENT_P1("*AMR NSCB %d", presync->amr_configuration.noise_suppression_control_bit); | |
1438 TRACE_EVENT_P1("*AMR ICMI %d", presync->amr_configuration.initial_codec_mode_indicator); | |
1439 TRACE_EVENT_P1("*AMR ICM %d", presync->amr_configuration.initial_codec_mode); | |
1440 TRACE_EVENT_P1("*AMR ACS %d", presync->amr_configuration.active_codec_set); | |
1441 for (i=0; i<dedicated_req->amr_conf.c_cod_prop; i++) | |
1442 { | |
1443 memcpy(&presync->amr_configuration.threshold[i], &dedicated_req->amr_conf.cod_prop[i].codec_thr, 1); | |
1444 memcpy(&presync->amr_configuration.hysteresis[i], &dedicated_req->amr_conf.cod_prop[i].codec_hyst, 1); | |
1445 TRACE_EVENT_P2("*AMR threshold[%d] %d", i, presync->amr_configuration.threshold[i]); | |
1446 TRACE_EVENT_P2("*AMR hysteresis[%d] %d", i, presync->amr_configuration.hysteresis[i]); | |
1447 } | |
1448 | |
1449 presync->timing_advance_valid = TRUE; | |
1450 presync->timing_advance = dedicated_req->tr_para.tav; | |
1451 | |
1452 if (dedicated_req->start.v_start AND | |
1453 dedicated_req->ch_type2.ch NEQ NOT_PRESENT_8BIT) | |
1454 { | |
1455 if (dedicated_req->ch_type2.h EQ 1) | |
1456 { | |
1457 presync->handover_command.channel_desc_1_bef_sti.chan_sel.h = 1; | |
1458 presync->handover_command.channel_desc_1_bef_sti.chan_sel.rf_channel.maio = dedicated_req->ch_type2.maio; | |
1459 presync->handover_command.channel_desc_1_bef_sti.chan_sel.rf_channel.hsn = dedicated_req->ch_type2.hsn; | |
1460 dedi_fill_ma (dedicated_req->ch_type2.ma, | |
1461 (T_frequency_list *) | |
1462 &presync->handover_command.frequency_list_bef_sti); | |
1463 } | |
1464 else | |
1465 { | |
1466 /* | |
1467 * Avoid the union !!! | |
1468 */ | |
1469 presync->handover_command.channel_desc_1_bef_sti.chan_sel.h = 0; | |
1470 presync->handover_command.channel_desc_1_bef_sti.chan_sel.rf_channel.maio = | |
1471 (UBYTE)(dedicated_req->ch_type2.arfcn & 0xFF); | |
1472 presync->handover_command.channel_desc_1_bef_sti.chan_sel.rf_channel.hsn = | |
1473 (UBYTE)((dedicated_req->ch_type2.arfcn >> 8) & 0xFF); | |
1474 } | |
1475 presync->handover_command.channel_desc_1_bef_sti.channel_type = | |
1476 CH_TYPE [dedicated_req->ch_type2.ch]; | |
1477 presync->handover_command.channel_desc_1_bef_sti.sub_channel = | |
1478 SUB_TYPE [dedicated_req->ch_type2.ch]; | |
1479 presync->handover_command.channel_desc_1_bef_sti.timeslot_no = | |
1480 dedicated_req->ch_type2.tn; | |
1481 presync->handover_command.channel_desc_1_bef_sti.tsc = | |
1482 dedicated_req->ch_type2.tsc; | |
1483 } | |
1484 presync->handover_command.cipher_mode = dedicated_req->ciph.stat; | |
1485 presync->handover_command.a5_algorithm = dedicated_req->ciph.algo; | |
1486 memcpy (&presync->cipher_key, dedicated_req->ciph.kc, KC_STRING_SIZE); | |
1487 | |
1488 /* | |
1489 * store the new parameters as temporary configuration. | |
1490 */ | |
1491 alr_data->dedi_data.temp_bcch = dedicated_req->arfcn; | |
1492 memcpy (&alr_data->dedi_data.temp_channel_desc, | |
1493 &presync->handover_command.channel_desc_1, | |
1494 sizeof (T_channel_desc)); | |
1495 alr_data->dedi_data.temp_channel_mode = | |
1496 presync->handover_command.channel_mode_1; | |
1497 alr_data->dedi_data.temp_frequency_list = | |
1498 presync->handover_command.frequency_list; | |
1499 alr_data->dedi_data.temp_cipher_mode = | |
1500 presync->handover_command.cipher_mode; | |
1501 alr_data->dedi_data.temp_a5_algorithm = | |
1502 presync->handover_command.a5_algorithm; | |
1503 alr_data->dedi_data.temp_cipher_key = | |
1504 presync->cipher_key; | |
1505 alr_data->dedi_data.temp_power = presync->handover_command.txpwr; | |
1506 alr_data->dedi_data.temp_bsic = dedicated_req->bsic; | |
1507 alr_data->dedi_data.temp_amr_configuration = presync->amr_configuration; | |
1508 alr_data->dedi_data.act_mode = MODE_PRE_SYNC_HANDOVER; | |
1509 | |
1510 nc_get_fn_time (alr_data->dedi_data.temp_bcch, | |
1511 (ULONG *)&presync->fn_offset, | |
1512 (ULONG *)&presync->time_alignmnt); | |
1513 | |
1514 /* | |
1515 * convert channel numbers if needed | |
1516 */ | |
1517 if (dedi_conversion_needed ()) | |
1518 { | |
1519 dedi_convert_chan_desc ((T_channel_desc *)&presync->handover_command.channel_desc_1); | |
1520 dedi_convert_chan_desc ((T_channel_desc *)&presync->handover_command.channel_desc_1_bef_sti); | |
1521 dedi_convert_frequency_list (&presync->handover_command.frequency_list); | |
1522 dedi_convert_frequency_list ((T_frequency_list *)&presync->handover_command.frequency_list_bef_sti); | |
1523 } | |
1524 /* | |
1525 * forward the parameters to layer 1 | |
1526 */ | |
1527 ma_dedi_pre_sync_ho_req (presync); | |
1528 } | |
1529 | |
1530 /* | |
1531 +--------------------------------------------------------------------+ | |
1532 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
1533 | STATE : code ROUTINE : dedi_freq_redef_req | | |
1534 +--------------------------------------------------------------------+ | |
1535 | |
1536 PURPOSE : Process signal dedi_freq_redef_req from SDL Process | |
1537 alr_MAIN. | |
1538 This function is used during frequency redefinition. | |
1539 | |
1540 */ | |
1541 | |
1542 GLOBAL void dedi_freq_redef_req (T_MPH_FREQ_REDEF_REQ *freq) | |
1543 { | |
1544 PALLOC (change, MPHC_CHANGE_FREQUENCY); | |
1545 | |
1546 ALR_EM_CONFIGURE_FREQUENCY_REDEFINITION; | |
1547 | |
1548 memset (change, 0, sizeof (T_MPHC_CHANGE_FREQUENCY)); | |
1549 if (freq->ch_type.h EQ 1) | |
1550 { | |
1551 /* | |
1552 * new channel uses frequency hopping | |
1553 */ | |
1554 change->channel_desc.chan_sel.h = 1; | |
1555 change->channel_desc.chan_sel.rf_channel.maio = freq->ch_type.maio; | |
1556 change->channel_desc.chan_sel.rf_channel.hsn = freq->ch_type.hsn; | |
1557 dedi_fill_ma (freq->ch_type.ma, &change->frequency_list); | |
1558 } | |
1559 else | |
1560 { | |
1561 /* | |
1562 * Avoid the union for the non-hopping case | |
1563 */ | |
1564 change->channel_desc.chan_sel.h = 0; | |
1565 change->channel_desc.chan_sel.rf_channel.maio = | |
1566 (UBYTE)(freq->ch_type.arfcn & 0xFF); | |
1567 change->channel_desc.chan_sel.rf_channel.hsn = | |
1568 (UBYTE)((freq->ch_type.arfcn >> 8) & 0xFF); | |
1569 } | |
1570 | |
1571 /* | |
1572 * fill layer 1 structure with the parameters. | |
1573 */ | |
1574 change->channel_desc.channel_type = CH_TYPE [freq->ch_type.ch]; | |
1575 change->channel_desc.sub_channel = SUB_TYPE [freq->ch_type.ch]; | |
1576 change->channel_desc.timeslot_no = freq->ch_type.tn; | |
1577 change->channel_desc.tsc = freq->ch_type.tsc; | |
1578 change->starting_time.start_time_present = freq->start.v_start; | |
1579 change->starting_time.start_time.t1 = freq->start.t1; | |
1580 change->starting_time.start_time.t3 = freq->start.t3; | |
1581 change->starting_time.start_time.t2 = freq->start.t2; | |
1582 | |
1583 /* | |
1584 * store new values as temporary configuration | |
1585 */ | |
1586 alr_data->dedi_data.redef_channel_desc = change->channel_desc; | |
1587 alr_data->dedi_data.redef_frequency_list = change->frequency_list; | |
1588 alr_data->dedi_data.redef_starting_time = change->starting_time; | |
1589 | |
1590 /* | |
1591 * convert channel numbers if needed | |
1592 */ | |
1593 if (dedi_conversion_needed ()) | |
1594 { | |
1595 dedi_convert_chan_desc (&change->channel_desc); | |
1596 dedi_convert_frequency_list (&change->frequency_list); | |
1597 } | |
1598 /* | |
1599 * forward parameters to layer 1 | |
1600 */ | |
1601 ma_dedi_change_freq_req (change); | |
1602 | |
1603 } | |
1604 | |
1605 /* | |
1606 +--------------------------------------------------------------------+ | |
1607 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
1608 | STATE : code ROUTINE : dedi_chan_mode_req | | |
1609 +--------------------------------------------------------------------+ | |
1610 | |
1611 PURPOSE : Process signal dedi_chan_mode_req from SDL Process | |
1612 alr_MAIN. | |
1613 This function is used during channel mode modify procedure. | |
1614 | |
1615 */ | |
1616 | |
1617 GLOBAL void dedi_chan_mode_req (T_MPH_CHANNEL_MODE_REQ *ch_mode) | |
1618 { | |
1619 int i; | |
1620 PALLOC (chm, MPHC_CHANNEL_MODE_MODIFY_REQ); | |
1621 | |
1622 ALR_EM_CONFIGURE_CHANNEL_MODE_MODIFY; | |
1623 | |
1624 memset (chm, 0, sizeof (T_MPHC_CHANNEL_MODE_MODIFY_REQ)); | |
1625 /* | |
1626 * convert parameters | |
1627 */ | |
1628 chm->sub_channel = SUB_TYPE [ch_mode->ch]; | |
1629 alr_data->dedi_data.act_channel_mode = | |
1630 chm->channel_mode = dedi_channel_mode (ch_mode->mode, | |
1631 actual_channel); | |
1632 | |
1633 /* | |
1634 * set multirate configuration parameters | |
1635 */ | |
1636 if(ch_mode->mode EQ CM_AMR) | |
1637 { | |
1638 alr_data->dedi_data.act_amr_configuration.noise_suppression_control_bit = | |
1639 chm->amr_configuration.noise_suppression_control_bit = ch_mode->amr_conf.nscb; | |
1640 alr_data->dedi_data.act_amr_configuration.initial_codec_mode_indicator = | |
1641 chm->amr_configuration.initial_codec_mode_indicator = ch_mode->amr_conf.icmi; | |
1642 alr_data->dedi_data.act_amr_configuration.initial_codec_mode = | |
1643 chm->amr_configuration.initial_codec_mode = ch_mode->amr_conf.st_mode; | |
1644 alr_data->dedi_data.act_amr_configuration.active_codec_set = | |
1645 chm->amr_configuration.active_codec_set = ch_mode->amr_conf.acs; | |
1646 | |
1647 /* Traces only needed for IOT session */ | |
1648 TRACE_EVENT_P1("*AMR NSCB %d", chm->amr_configuration.noise_suppression_control_bit); | |
1649 TRACE_EVENT_P1("*AMR ICMI %d", chm->amr_configuration.initial_codec_mode_indicator); | |
1650 TRACE_EVENT_P1("*AMR ICM %d", chm->amr_configuration.initial_codec_mode); | |
1651 TRACE_EVENT_P1("*AMR ACS %d", chm->amr_configuration.active_codec_set); | |
1652 for (i=0; i<ch_mode->amr_conf.c_cod_prop; i++) | |
1653 { | |
1654 memcpy(&alr_data->dedi_data.act_amr_configuration.threshold[i], &ch_mode->amr_conf.cod_prop[i].codec_thr, 1); | |
1655 memcpy(&alr_data->dedi_data.act_amr_configuration.hysteresis[i], &ch_mode->amr_conf.cod_prop[i].codec_hyst, 1); | |
1656 | |
1657 memcpy(&chm->amr_configuration.threshold[i], &ch_mode->amr_conf.cod_prop[i].codec_thr, 1); | |
1658 memcpy(&chm->amr_configuration.hysteresis[i], &ch_mode->amr_conf.cod_prop[i].codec_hyst, 1); | |
1659 TRACE_EVENT_P2("*AMR threshold[%d] %d", i, chm->amr_configuration.threshold[i]); | |
1660 TRACE_EVENT_P2("*AMR hysteresis[%d] %d", i, chm->amr_configuration.hysteresis[i]); | |
1661 } | |
1662 } | |
1663 | |
1664 /* | |
1665 * forward new channel mode to layer 1 | |
1666 */ | |
1667 ma_dedi_chan_mode_req (chm); | |
1668 } | |
1669 | |
1670 /* | |
1671 +--------------------------------------------------------------------+ | |
1672 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
1673 | STATE : code ROUTINE : dedi_ciph_req | | |
1674 +--------------------------------------------------------------------+ | |
1675 | |
1676 PURPOSE : Process signal dedi_ciph_req from SDL Process | |
1677 alr_MAIN. | |
1678 This function is used during cipher mode setting procedure. | |
1679 | |
1680 */ | |
1681 | |
1682 GLOBAL void dedi_ciph_req (T_MPH_CIPHERING_REQ *ciph_req) | |
1683 { | |
1684 PALLOC (set_ciph, MPHC_SET_CIPHERING_REQ); | |
1685 | |
1686 ALR_EM_CONFIGURE_CIPHER_MODE_SETTING; | |
1687 | |
1688 memset (set_ciph, 0, sizeof (T_MPHC_SET_CIPHERING_REQ)); | |
1689 /* | |
1690 * convert the parameters to the layer 1 structure | |
1691 */ | |
1692 set_ciph->cipher_mode = ciph_req->ciph.stat; | |
1693 set_ciph->a5_algorithm = ciph_req->ciph.algo; | |
1694 memcpy (set_ciph->new_ciph_param.A, ciph_req->ciph.kc, KC_STRING_SIZE); | |
1695 | |
1696 alr_data->dedi_data.act_cipher_mode = set_ciph->cipher_mode; | |
1697 alr_data->dedi_data.act_a5_algorithm = set_ciph->a5_algorithm; | |
1698 memcpy (&alr_data->dedi_data.act_cipher_key, | |
1699 &set_ciph->new_ciph_param, KC_STRING_SIZE); | |
1700 | |
1701 /* | |
1702 * forward the parameters to layer 1 | |
1703 */ | |
1704 ma_dedi_ciph_req (set_ciph); | |
1705 } | |
1706 | |
1707 | |
1708 /* | |
1709 +--------------------------------------------------------------------+ | |
1710 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
1711 | STATE : code ROUTINE : dedi_imm_ass_cnf | | |
1712 +--------------------------------------------------------------------+ | |
1713 | |
1714 PURPOSE : Process signal dedi_imm_ass_cnf from SDL process | |
1715 Main_Control. | |
1716 Layer 1 confirms the configuration of a dedicated | |
1717 channel during the immediate assignment procedure. | |
1718 | |
1719 */ | |
1720 | |
1721 GLOBAL void dedi_imm_ass_cnf (void) | |
1722 { | |
1723 T_DEDI_DATA * d = &alr_data->dedi_data; | |
1724 | |
1725 if (GET_STATE (STATE_DEDI) EQ DEDI_IMM_ASS) | |
1726 { | |
1727 /* | |
1728 * the response of layer 1 is expected | |
1729 */ | |
1730 ma_clean_dedi_sys_buffer (); | |
1731 SET_STATE (STATE_DEDI, DEDI_ACTIVE); | |
1732 /* | |
1733 * store temporary parameters as actual channel configuration | |
1734 */ | |
1735 d->act_bcch = d->temp_bcch; | |
1736 d->act_channel_desc = d->temp_channel_desc; | |
1737 d->act_channel_mode = d->temp_channel_mode; | |
1738 d->act_frequency_list = d->temp_frequency_list; | |
1739 d->act_starting_time = d->temp_starting_time; | |
1740 d->act_frequency_list_bef_sti = d->temp_frequency_list_bef_sti; | |
1741 d->act_channel_desc_bef_sti = d->temp_channel_desc_bef_sti; | |
1742 d->act_pwrc = d->temp_pwrc; | |
1743 d->act_cipher_mode = d->temp_cipher_mode; | |
1744 d->act_a5_algorithm = d->temp_a5_algorithm; | |
1745 d->act_cipher_key = d->temp_cipher_key; | |
1746 d->act_power = cut_power_value (alr_data->rach_data.max_tx_pwr_ccch, NULL); | |
1747 /* | |
1748 * Send a MPH_DEDICATED_CNF to RR to | |
1749 * start the establishment of the | |
1750 * layer 2 connection. | |
1751 */ | |
1752 ma_dedi_cnf (DEDICATED_SUCCESS); | |
1753 } | |
1754 else | |
1755 if (GET_STATE (STATE_DEDI) EQ DEDI_IMM_ASS_RECONN) | |
1756 { | |
1757 ma_clean_dedi_sys_buffer (); | |
1758 dedi_chan_ass_fail(); /* act_mode will take on MODE_CHAN_ASS_FAIL */ | |
1759 SET_STATE (STATE_DEDI, DEDI_ACTIVE); | |
1760 } | |
1761 } | |
1762 | |
1763 /* | |
1764 +--------------------------------------------------------------------+ | |
1765 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
1766 | STATE : code ROUTINE : dedi_change_freq_cnf | | |
1767 +--------------------------------------------------------------------+ | |
1768 | |
1769 PURPOSE : Process signal dedi_change_freq_cnf from SDL process | |
1770 Main_Control. | |
1771 Layer 1 confirms setting of the new parameters during | |
1772 a frequency redefinition procedure. | |
1773 */ | |
1774 | |
1775 GLOBAL void dedi_change_freq_cnf (void) | |
1776 { | |
1777 T_DEDI_DATA *d = &alr_data->dedi_data; | |
1778 | |
1779 d->act_channel_desc = d->redef_channel_desc; | |
1780 d->act_frequency_list = d->redef_frequency_list; | |
1781 memset (&d->redef_channel_desc, 0, sizeof (T_channel_desc)); | |
1782 memset (&d->redef_frequency_list, 0, sizeof (T_frequency_list)); | |
1783 memset (&d->redef_starting_time, 0, sizeof (T_starting_time)); | |
1784 ma_clean_dedi_sys_buffer (); | |
1785 } | |
1786 | |
1787 /* | |
1788 +--------------------------------------------------------------------+ | |
1789 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
1790 | STATE : code ROUTINE : dedi_chan_ass_cnf | | |
1791 +--------------------------------------------------------------------+ | |
1792 | |
1793 PURPOSE : Process signal dedi_chan_ass_cnf from SDL process | |
1794 Main_Control. | |
1795 Layer 1 confirms setting of a new channel configuration | |
1796 during a channel assignment procedure. | |
1797 | |
1798 */ | |
1799 | |
1800 GLOBAL void dedi_chan_ass_cnf (void) | |
1801 { | |
1802 if (GET_STATE (STATE_DEDI) EQ DEDI_ACTIVE) | |
1803 { | |
1804 if (alr_data->dedi_data.act_mode EQ MODE_CHAN_ASSIGN) | |
1805 { | |
1806 /* | |
1807 * the response of layer 1 was exspected in the | |
1808 * positive case of switching to a new channel. | |
1809 */ | |
1810 T_DEDI_DATA *d = &alr_data->dedi_data; | |
1811 | |
1812 /* | |
1813 * store actual parameters as old parameters | |
1814 */ | |
1815 d->old_channel = actual_channel; | |
1816 d->old_bcch = d->act_bcch; | |
1817 d->old_channel_desc = d->act_channel_desc; | |
1818 d->old_channel_mode = d->act_channel_mode; | |
1819 d->old_frequency_list = d->act_frequency_list; | |
1820 d->old_cipher_mode = d->act_cipher_mode; | |
1821 d->old_a5_algorithm = d->act_a5_algorithm; | |
1822 d->old_cipher_key = d->act_cipher_key; | |
1823 d->old_power = d->act_power; | |
1824 d->old_dtx_allowed = d->act_dtx_allowed; | |
1825 d->old_amr_configuration = d->act_amr_configuration; | |
1826 | |
1827 /* | |
1828 * store temporary parameters as actual channel configuration | |
1829 */ | |
1830 actual_channel = d->temp_channel; | |
1831 d->act_bcch = d->temp_bcch; | |
1832 d->act_channel_desc = d->temp_channel_desc; | |
1833 d->act_channel_mode = d->temp_channel_mode; | |
1834 d->act_frequency_list = d->temp_frequency_list; | |
1835 d->act_cipher_mode = d->temp_cipher_mode; | |
1836 d->act_a5_algorithm = d->temp_a5_algorithm; | |
1837 d->act_cipher_key = d->temp_cipher_key; | |
1838 d->act_power = d->temp_power; | |
1839 d->act_dtx_allowed = d->temp_dtx_allowed; | |
1840 d->act_amr_configuration = d->temp_amr_configuration; | |
1841 ma_dedi_cnf (DEDICATED_SUCCESS); | |
1842 } | |
1843 else | |
1844 /* | |
1845 * the response of layer 1 was exspected in the | |
1846 * negative case of switching to the old channel. | |
1847 */ | |
1848 { | |
1849 ma_dedi_fail_cnf (); | |
1850 memset (&alr_data->dedi_data.redef_channel_desc, 0, sizeof (T_channel_desc)); | |
1851 memset (&alr_data->dedi_data.redef_frequency_list, 0, sizeof (T_frequency_list)); | |
1852 memset (&alr_data->dedi_data.redef_starting_time, 0, sizeof (T_starting_time)); | |
1853 } | |
1854 } | |
1855 } | |
1856 | |
1857 /* | |
1858 +--------------------------------------------------------------------+ | |
1859 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
1860 | STATE : code ROUTINE : dedi_ho_fail_cnf | | |
1861 +--------------------------------------------------------------------+ | |
1862 | |
1863 PURPOSE : Process signal dedi_ho_fail_cnf from SDL process | |
1864 Main_Control. | |
1865 Layer 1 signals that the handover has failed. | |
1866 | |
1867 */ | |
1868 | |
1869 GLOBAL void dedi_ho_fail_cnf (void) | |
1870 { | |
1871 /* | |
1872 * recalculate all timing advances to the old bcch. | |
1873 */ | |
1874 nc_update_list (alr_data->dedi_data.act_bcch); | |
1875 /* | |
1876 * signal dedicated failure to RR | |
1877 */ | |
1878 nc_resume_dedicated(); | |
1879 ma_dedi_fail_cnf (); | |
1880 } | |
1881 | |
1882 /* | |
1883 +--------------------------------------------------------------------+ | |
1884 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
1885 | STATE : code ROUTINE : dedi_async_ho_cnf | | |
1886 +--------------------------------------------------------------------+ | |
1887 | |
1888 PURPOSE : Process signal dedi_async_ho_cnf from SDL process | |
1889 Main_Control. | |
1890 This function handles the positive end of an | |
1891 asynchronous handover. | |
1892 | |
1893 */ | |
1894 | |
1895 GLOBAL void dedi_async_ho_cnf (void) | |
1896 { | |
1897 T_DEDI_DATA *d = &alr_data->dedi_data; | |
1898 /* | |
1899 * All timing advances are now calculated relative | |
1900 * to the new dedicated channel | |
1901 */ | |
1902 nc_update_list (alr_data->dedi_data.temp_bcch); | |
1903 ma_clean_dedi_sys_buffer (); | |
1904 /* | |
1905 * store actual parameters as old parameters | |
1906 */ | |
1907 d->old_channel = actual_channel; | |
1908 d->old_bcch = d->act_bcch; | |
1909 d->old_bsic = alr_data->bsic; | |
1910 d->old_channel_desc = d->act_channel_desc; | |
1911 d->old_channel_mode = d->act_channel_mode; | |
1912 d->old_frequency_list = d->act_frequency_list; | |
1913 d->old_cipher_mode = d->act_cipher_mode; | |
1914 d->old_a5_algorithm = d->act_a5_algorithm; | |
1915 d->old_cipher_key = d->act_cipher_key; | |
1916 d->old_power = d->act_power; | |
1917 d->old_amr_configuration = d->act_amr_configuration; | |
1918 /* | |
1919 * store temporary parameters as actual channel configuration | |
1920 */ | |
1921 actual_channel = d->temp_channel; | |
1922 | |
1923 alr_data->serving_cell = d->act_bcch = d->temp_bcch; | |
1924 alr_data->sc_band = get_band(d->act_bcch); | |
1925 alr_data->bsic = alr_data->dedi_data.temp_bsic; | |
1926 d->act_channel_desc = d->temp_channel_desc; | |
1927 d->act_channel_mode = d->temp_channel_mode; | |
1928 d->act_frequency_list = d->temp_frequency_list; | |
1929 d->act_cipher_mode = d->temp_cipher_mode; | |
1930 d->act_a5_algorithm = d->temp_a5_algorithm; | |
1931 d->act_cipher_key = d->temp_cipher_key; | |
1932 d->act_power = d->temp_power; | |
1933 d->old_amr_configuration = d->act_amr_configuration; | |
1934 | |
1935 if (alr_data->nc_data.dtx) | |
1936 nc_update_dedicated (alr_data->nc_data.dtx, | |
1937 alr_data->nc_data.pwrc); | |
1938 nc_resume_dedicated(); | |
1939 } | |
1940 | |
1941 /* | |
1942 +--------------------------------------------------------------------+ | |
1943 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
1944 | STATE : code ROUTINE : dedi_sync_ho_cnf | | |
1945 +--------------------------------------------------------------------+ | |
1946 | |
1947 PURPOSE : Process signal dedi_sync_ho_cnf from SDL process | |
1948 Main_Control. | |
1949 This function handles the positive end of a | |
1950 synchronous handover. | |
1951 | |
1952 */ | |
1953 | |
1954 GLOBAL void dedi_sync_ho_cnf (void) | |
1955 { | |
1956 T_DEDI_DATA *d = &alr_data->dedi_data; | |
1957 | |
1958 /* | |
1959 * All timing advances are now calculated relative | |
1960 * to the new dedicated channel | |
1961 */ | |
1962 nc_update_list (alr_data->dedi_data.temp_bcch); | |
1963 ma_clean_dedi_sys_buffer (); | |
1964 /* | |
1965 * store actual parameters as old parameters | |
1966 */ | |
1967 d->old_channel = actual_channel; | |
1968 d->old_bcch = d->act_bcch; | |
1969 d->old_bsic = alr_data->bsic; | |
1970 d->old_channel_desc = d->act_channel_desc; | |
1971 d->old_channel_mode = d->act_channel_mode; | |
1972 d->old_frequency_list = d->act_frequency_list; | |
1973 d->old_cipher_mode = d->act_cipher_mode; | |
1974 d->old_a5_algorithm = d->act_a5_algorithm; | |
1975 d->old_cipher_key = d->act_cipher_key; | |
1976 d->old_power = d->act_power; | |
1977 d->old_amr_configuration = d->act_amr_configuration; | |
1978 | |
1979 /* | |
1980 * store temporary parameters as actual channel configuration | |
1981 */ | |
1982 actual_channel = d->temp_channel; | |
1983 | |
1984 alr_data->serving_cell = d->act_bcch = d->temp_bcch; | |
1985 alr_data->sc_band = get_band(d->act_bcch); | |
1986 alr_data->bsic = alr_data->dedi_data.temp_bsic; | |
1987 d->act_channel_desc = d->temp_channel_desc; | |
1988 d->act_channel_mode = d->temp_channel_mode; | |
1989 d->act_frequency_list = d->temp_frequency_list; | |
1990 d->act_cipher_mode = d->temp_cipher_mode; | |
1991 d->act_a5_algorithm = d->temp_a5_algorithm; | |
1992 d->act_cipher_key = d->temp_cipher_key; | |
1993 d->act_power = d->temp_power; | |
1994 d->act_amr_configuration = d->temp_amr_configuration; | |
1995 | |
1996 if (alr_data->nc_data.dtx) | |
1997 nc_update_dedicated (alr_data->nc_data.dtx, | |
1998 alr_data->nc_data.pwrc); | |
1999 | |
2000 nc_resume_dedicated(); | |
2001 } | |
2002 | |
2003 /* | |
2004 +--------------------------------------------------------------------+ | |
2005 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
2006 | STATE : code ROUTINE : dedi_pre_sync_ho_cnf | | |
2007 +--------------------------------------------------------------------+ | |
2008 | |
2009 PURPOSE : Process signal dedi_pre_sync_ho_cnf from SDL process | |
2010 Main_Control. | |
2011 This function handles the positive end of a | |
2012 pre-synchronous handover. | |
2013 | |
2014 */ | |
2015 | |
2016 GLOBAL void dedi_pre_sync_ho_cnf (void) | |
2017 { | |
2018 T_DEDI_DATA *d = &alr_data->dedi_data; | |
2019 /* | |
2020 * All timing advances are now calculated relative | |
2021 * to the new dedicated channel | |
2022 */ | |
2023 nc_update_list (alr_data->dedi_data.temp_bcch); | |
2024 ma_clean_dedi_sys_buffer (); | |
2025 /* | |
2026 * store actual parameters as old parameters | |
2027 */ | |
2028 d->old_channel = actual_channel; | |
2029 d->old_bcch = d->act_bcch; | |
2030 d->old_bsic = alr_data->bsic; | |
2031 d->old_channel_desc = d->act_channel_desc; | |
2032 d->old_channel_mode = d->act_channel_mode; | |
2033 d->old_frequency_list = d->act_frequency_list; | |
2034 d->old_cipher_mode = d->act_cipher_mode; | |
2035 d->old_a5_algorithm = d->act_a5_algorithm; | |
2036 d->old_cipher_key = d->act_cipher_key; | |
2037 d->old_power = d->act_power; | |
2038 d->old_amr_configuration = d->act_amr_configuration; | |
2039 | |
2040 /* | |
2041 * store temporary parameters as actual channel configuration | |
2042 */ | |
2043 actual_channel = d->temp_channel; | |
2044 alr_data->serving_cell = d->act_bcch = d->temp_bcch; | |
2045 alr_data->sc_band = get_band(d->act_bcch); | |
2046 alr_data->bsic = alr_data->dedi_data.temp_bsic; | |
2047 d->act_channel_desc = d->temp_channel_desc; | |
2048 d->act_channel_mode = d->temp_channel_mode; | |
2049 d->act_frequency_list = d->temp_frequency_list; | |
2050 d->act_cipher_mode = d->temp_cipher_mode; | |
2051 d->act_a5_algorithm = d->temp_a5_algorithm; | |
2052 d->act_cipher_key = d->temp_cipher_key; | |
2053 d->act_power = d->temp_power; | |
2054 d->old_amr_configuration = d->act_amr_configuration; | |
2055 | |
2056 if (alr_data->nc_data.dtx) | |
2057 nc_update_dedicated (alr_data->nc_data.dtx, | |
2058 alr_data->nc_data.pwrc); | |
2059 | |
2060 nc_resume_dedicated(); | |
2061 } | |
2062 | |
2063 /* | |
2064 +--------------------------------------------------------------------+ | |
2065 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
2066 | STATE : code ROUTINE : dedi_fill_ma | | |
2067 +--------------------------------------------------------------------+ | |
2068 | |
2069 PURPOSE : Fills a frequency list for layer 1. | |
2070 Condatīs representation is a list of USHORT with | |
2071 0xFFFF as delimiter. | |
2072 TIīs representation is different from this. | |
2073 | |
2074 */ | |
2075 | |
2076 LOCAL void dedi_fill_ma (USHORT * ma, | |
2077 T_frequency_list * rf) | |
2078 { | |
2079 UBYTE i = 0; | |
2080 | |
2081 memset (rf, 0, sizeof (T_frequency_list)); | |
2082 | |
2083 while (ma[i] NEQ NOT_PRESENT_16BIT AND | |
2084 i < MAX_MA_CARRIER) | |
2085 { | |
2086 rf->rf_chan_no.radio_freq[i] = ma[i]; | |
2087 i++; | |
2088 rf->rf_chan_cnt++; | |
2089 } | |
2090 } | |
2091 | |
2092 /* | |
2093 +--------------------------------------------------------------------+ | |
2094 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
2095 | STATE : code ROUTINE : dedi_tch_loop_req | | |
2096 +--------------------------------------------------------------------+ | |
2097 | |
2098 PURPOSE : Process signal dedi_tch_loop_req from SDL Process | |
2099 alr_MAIN. | |
2100 | |
2101 */ | |
2102 | |
2103 GLOBAL void dedi_tch_loop_req (T_MPH_TCH_LOOP_REQ *tloop) | |
2104 { | |
2105 if (tloop->tch_loop EQ NOT_PRESENT_8BIT) | |
2106 { | |
2107 /* | |
2108 * Open TCH loop | |
2109 */ | |
2110 ma_dedi_open_tch_loop_req (); | |
2111 | |
2112 ALR_EM_CONFIGURE_TCH_LOOP(EM_TCH_OPEN); | |
2113 | |
2114 } | |
2115 else | |
2116 { | |
2117 /* | |
2118 * Close TCH loop | |
2119 */ | |
2120 PALLOC (loop, OML1_CLOSE_TCH_LOOP_REQ); | |
2121 | |
2122 /* | |
2123 * Format of tch_loop in according to 3GPP 04.14, 8.1 CLOSE_TCH_LOOP_CMD | |
2124 */ | |
2125 loop->sub_channel = alr_data->dedi_data.act_channel_desc.sub_channel; | |
2126 loop->frame_erasure = tloop->tch_loop; | |
2127 | |
2128 ma_dedi_close_tch_loop_req (loop); | |
2129 | |
2130 ALR_EM_CONFIGURE_TCH_LOOP(EM_TCH_CLOSE); | |
2131 } | |
2132 } | |
2133 | |
2134 | |
2135 /* | |
2136 +--------------------------------------------------------------------+ | |
2137 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
2138 | STATE : code ROUTINE : dedi_dai_req | | |
2139 +--------------------------------------------------------------------+ | |
2140 | |
2141 PURPOSE : Process signal dedi_dai_req from SDL Process | |
2142 alr_MAIN. | |
2143 RR requests configuration of the digital audio interface. | |
2144 | |
2145 */ | |
2146 | |
2147 GLOBAL void dedi_dai_req (T_MPH_DAI_REQ * dai) | |
2148 { | |
2149 | |
2150 if (dai->device EQ DAI_NO_TEST) | |
2151 { | |
2152 /* | |
2153 * Stop DAI test | |
2154 */ | |
2155 ma_dedi_stop_dai_req (); | |
2156 | |
2157 ALR_EM_CONFIGURE_DAI_TESTING(EM_DAI_STOP); | |
2158 | |
2159 } | |
2160 else | |
2161 { | |
2162 PALLOC (dai_req, OML1_START_DAI_TEST_REQ); | |
2163 | |
2164 /* | |
2165 * Start DAI test | |
2166 */ | |
2167 dai_req->tested_device = dai->device; | |
2168 ma_dedi_start_dai_req (dai_req); | |
2169 | |
2170 ALR_EM_CONFIGURE_DAI_TESTING(EM_DAI_START); | |
2171 | |
2172 } | |
2173 } | |
2174 | |
2175 /* | |
2176 +--------------------------------------------------------------------+ | |
2177 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
2178 | STATE : code ROUTINE : dedi_channel_mode | | |
2179 +--------------------------------------------------------------------+ | |
2180 | |
2181 PURPOSE : The function converts the channel mode representation | |
2182 from Condatīs notation (equal to GSM) to TIīs values. | |
2183 | |
2184 */ | |
2185 | |
2186 LOCAL UBYTE dedi_channel_mode (UBYTE channel_mode, UBYTE channel_type) | |
2187 { | |
2188 switch (channel_mode) | |
2189 { | |
2190 case MODE_SIG_ONLY: /* signalling only */ | |
2191 return CM_SIGNALLING_ONLY; | |
2192 | |
2193 case MODE_SPEECH_VER1: /* Speech */ | |
2194 if (channel_type EQ CH_TYPE[TCH_F_INDEX]) /* TCH fullrate */ | |
2195 return CM_TCH_FS; /* TCH fullrate speech */ | |
2196 else | |
2197 return CM_TCH_HS; /* TCH halfrate speech */ | |
2198 | |
2199 case MODE_DATA_12_0: /* Data 12 k */ | |
2200 return CM_TCH_96; | |
2201 | |
2202 case MODE_DATA_6_0: /* Data 6 k */ | |
2203 if (channel_type EQ CH_TYPE[TCH_F_INDEX]) /* TCH fullrate */ | |
2204 return CM_TCH_F_48; /* TCH fullrate data 6 k */ | |
2205 else | |
2206 return CM_TCH_H_48; /* TCH halfrate data 6 k */ | |
2207 | |
2208 case MODE_DATA_3_6: /* Data 3.6 k */ | |
2209 if (channel_type EQ CH_TYPE[TCH_F_INDEX]) /* TCH fullrate */ | |
2210 return CM_TCH_F_24; /* TCH fullrate data 3.6 k */ | |
2211 else | |
2212 return CM_TCH_H_24; /* TCH halfrate data 3.6 k */ | |
2213 | |
2214 case MODE_DATA_14_5: /* Data 14.5 k */ | |
2215 return CM_TCH_144; /* TCH fullrate data 14.5 k*/ | |
2216 | |
2217 case MODE_SPEECH_VER2: /* enhanced full rate */ | |
2218 return CM_TCH_EFR; | |
2219 | |
2220 case MODE_SPEECH_VER3: /* adaptiv multi-rate */ | |
2221 if (channel_type EQ CH_TYPE[TCH_F_INDEX]) /* TCH fullrate */ | |
2222 return CM_TCH_AFS; /* TCH/AFS fullrate */ | |
2223 else | |
2224 return CM_TCH_AHS; /* TCH/AHS halfrate */ | |
2225 | |
2226 default: | |
2227 return CM_SIGNALLING_ONLY; /* all other set to signalling only */ | |
2228 } | |
2229 } | |
2230 | |
2231 /* | |
2232 +------------------------------ --------------------------------------+ | |
2233 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
2234 | STATE : code ROUTINE : dedi_increment_rlt | | |
2235 +--------------------------------------------------------------------+ | |
2236 | |
2237 PURPOSE : A valid block has received on SACCH. The radio | |
2238 link counter is incremented if possible. | |
2239 | |
2240 */ | |
2241 | |
2242 GLOBAL void dedi_increment_rlt (void) | |
2243 { | |
2244 /* | |
2245 * increase radio link timeout counter if necessary | |
2246 */ | |
2247 if (alr_data->dedi_data.act_rlt NEQ alr_data->dedi_data.rlt) | |
2248 { | |
2249 alr_data->dedi_data.act_rlt += 2; | |
2250 | |
2251 if (alr_data->dedi_data.act_rlt > alr_data->dedi_data.rlt) | |
2252 alr_data->dedi_data.act_rlt = alr_data->dedi_data.rlt; | |
2253 #if !defined NTRACE | |
2254 trc_mon_counter_dedi (alr_data->dedi_data.act_rlt, | |
2255 alr_data->dedi_data.rlt); | |
2256 #endif /* (!defined NTRACE) */ | |
2257 | |
2258 ALR_EM_SET_EM_ACT_RLT; | |
2259 } | |
2260 } | |
2261 | |
2262 /* | |
2263 +--------------------------------------------------------------------+ | |
2264 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
2265 | STATE : code ROUTINE : dedi_decrement_rlt | | |
2266 +--------------------------------------------------------------------+ | |
2267 | |
2268 PURPOSE : An invalid block has received on SACCH. The radio | |
2269 link counter is decremented. If the value is zero | |
2270 an error indication is send to RR. | |
2271 */ | |
2272 | |
2273 GLOBAL void dedi_decrement_rlt (void) | |
2274 { | |
2275 | |
2276 /* | |
2277 * invalid block received. Decrement radio link timeout counter. | |
2278 */ | |
2279 if (alr_data->dedi_data.act_rlt > 1) | |
2280 { | |
2281 #if !defined NTRACE | |
2282 trc_mon_counter_dedi (alr_data->dedi_data.act_rlt, | |
2283 alr_data->dedi_data.rlt); | |
2284 #endif /* (!defined NTRACE */ | |
2285 alr_data->dedi_data.act_rlt--; | |
2286 | |
2287 ALR_EM_SET_EM_ACT_RLT; | |
2288 | |
2289 } | |
2290 else | |
2291 { | |
2292 /* | |
2293 * radio link failure detected | |
2294 */ | |
2295 ma_error_ind (CS_RADIO_LINK_FAIL, alr_data->serving_cell); | |
2296 alr_data->dedi_data.act_rlt = alr_data->dedi_data.rlt; | |
2297 #if !defined NTRACE | |
2298 trc_mon_counter_dedi (alr_data->dedi_data.act_rlt, | |
2299 alr_data->dedi_data.rlt); | |
2300 #endif | |
2301 | |
2302 ALR_EM_SET_EM_ACT_RLT; | |
2303 | |
2304 } | |
2305 } | |
2306 | |
2307 /* | |
2308 +--------------------------------------------------------------------+ | |
2309 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
2310 | STATE : code ROUTINE : dedi_convert_frequency_list| | |
2311 +--------------------------------------------------------------------+ | |
2312 | |
2313 PURPOSE : converts the channel numbers of a frequency list | |
2314 in the non-hopping case for DCS 1800 channel numbers | |
2315 in the dualband variants. | |
2316 */ | |
2317 | |
2318 LOCAL void dedi_convert_frequency_list (T_frequency_list * frequency_list) | |
2319 { | |
2320 UBYTE i, j; | |
2321 | |
2322 i = (UBYTE)frequency_list->rf_chan_cnt; | |
2323 | |
2324 if (i >= 64) | |
2325 i = 63; | |
2326 | |
2327 ALR_TRACE_DEDI ("-----------"); | |
2328 | |
2329 for (j = 0; j < i; j++) | |
2330 { | |
2331 ALR_TRACE_DEDI_FREQ_LIST (); | |
2332 | |
2333 frequency_list->rf_chan_no.radio_freq[j] = | |
2334 ARFCN_TO_L1 (frequency_list->rf_chan_no.radio_freq[j]); | |
2335 } | |
2336 } | |
2337 | |
2338 /* | |
2339 +--------------------------------------------------------------------+ | |
2340 | PROJECT : GSM-PS (8403) MODULE : ALR_DEDI | | |
2341 | STATE : code ROUTINE : dedi_stop | | |
2342 +--------------------------------------------------------------------+ | |
2343 | |
2344 PURPOSE : Process signal dedi_stop from SDL process Main_Control. | |
2345 This signal stops all dedicated activities of ALR. | |
2346 | |
2347 */ | |
2348 | |
2349 GLOBAL void dedi_stop (void) | |
2350 { | |
2351 if (GET_STATE (STATE_DEDI) NEQ DEDI_INACTIVE) | |
2352 { | |
2353 /* | |
2354 * if dedicated mode is active, | |
2355 * the process and layer 1 are set to idle. | |
2356 */ | |
2357 SET_STATE (STATE_DEDI, DEDI_INACTIVE); | |
2358 ma_dedi_stop_req (); | |
2359 alr_data->dedi_data.act_mode = NOT_PRESENT_8BIT; | |
2360 } | |
2361 } | |
2362 | |
2363 /* | |
2364 +--------------------------------------------------------------------+ | |
2365 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
2366 | STATE : code ROUTINE : dedi_convert_chan_desc | | |
2367 +--------------------------------------------------------------------+ | |
2368 | |
2369 PURPOSE : converts the channel number of a channel description | |
2370 in the non-hopping case for DCS 1800 channel numbers | |
2371 in the dualband variants. | |
2372 */ | |
2373 | |
2374 LOCAL void dedi_convert_chan_desc (T_channel_desc * channel_desc) | |
2375 { | |
2376 USHORT channel; | |
2377 | |
2378 if (channel_desc->chan_sel.h EQ 0) | |
2379 { | |
2380 channel = (USHORT)(channel_desc->chan_sel.rf_channel.maio + | |
2381 (channel_desc->chan_sel.rf_channel.hsn << 8)); | |
2382 channel_desc->chan_sel.rf_channel.maio = | |
2383 (UBYTE)(ARFCN_TO_L1(channel) & 0xFF); | |
2384 channel_desc->chan_sel.rf_channel.hsn = | |
2385 (UBYTE)(ARFCN_TO_L1(channel) >> 8); | |
2386 } | |
2387 } | |
2388 | |
2389 /* | |
2390 +--------------------------------------------------------------------+ | |
2391 | PROJECT : GSM-PS (8403) MODULE : alr_DEDI | | |
2392 | STATE : code ROUTINE : dedi_conversion_needed | | |
2393 +--------------------------------------------------------------------+ | |
2394 | |
2395 PURPOSE : Checks whether conversion is needed or not. | |
2396 | |
2397 */ | |
2398 | |
2399 LOCAL UBYTE dedi_conversion_needed (void) | |
2400 { | |
2401 if ((std EQ STD_EGSM) OR | |
2402 (std EQ STD_DUAL) OR | |
2403 (std EQ STD_DUAL_EGSM) OR | |
2404 (std EQ STD_DUAL_US)) | |
2405 return TRUE; | |
2406 else | |
2407 return FALSE; | |
2408 } | |
2409 #endif | |
2410 | |
2411 |