FreeCalypso > hg > tcs211-l1-reconst
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 |
