comparison g23m-gsm/rr/rr_pei.c @ 0:75a11d740a02

initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 09 Jun 2016 00:02:41 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:75a11d740a02
1 /*
2 +-----------------------------------------------------------------------------
3 | Project :
4 | Modul :
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This module defines the process body interface
18 | for the component RR of the mobile station
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef RR_PEI_C
23 #define RR_PEI_C
24
25 #include "config.h"
26 #include "fixedconf.h"
27 #include "condat-features.h"
28
29 #define ENTITY_RR
30
31 /*==== INCLUDES ===================================================*/
32
33 #include <string.h>
34 #include <stdlib.h>
35 #include <stddef.h> /* offsetof */
36 #include <stdio.h> /* sprintf */
37 #include "typedefs.h"
38 #include "pcm.h"
39 #include "pconst.cdg"
40 #include "mconst.cdg"
41 #include "message.h"
42 #include "ccdapi.h"
43 #include "vsi.h"
44 #include "custom.h"
45 #include "gsm.h"
46 #include "prim.h"
47 #include "cnf_rr.h"
48 #include "tok.h"
49 #include "rr.h"
50 #include "rr_em.h"
51 #include "cl_shrd.h"
52
53 #if !defined(_SIMULATION_)
54 #include "../../services/ffs/ffs.h"
55 #include "ffs_coat.h"
56 #endif /* !_SIMULATION_ */
57
58 /*==== EXPORT =====================================================*/
59 /*
60 * several handles for communication with other entities
61 */
62 #ifdef TI_PS_HCOMM_CHANGE
63 GLOBAL T_HANDLE rr_handle = VSI_ERROR;
64 #ifdef GPRS
65 GLOBAL T_HANDLE hCommGRR = VSI_ERROR; /* GRR Communication */
66 #endif
67 #else /* for hCommHandles backward compatibility */
68 GLOBAL T_HANDLE hCommDL = VSI_ERROR;
69 #if defined FF_EOTD
70 GLOBAL T_HANDLE hCommLC = VSI_ERROR;
71 GLOBAL T_HANDLE hCommRRLP = VSI_ERROR;
72 #endif /* FF_EOTD */
73 GLOBAL T_HANDLE hCommMM = VSI_ERROR;
74 GLOBAL T_HANDLE hCommPL = VSI_ERROR;
75 GLOBAL T_HANDLE rr_handle = VSI_ERROR;
76 #ifdef GPRS
77 GLOBAL T_HANDLE hCommGRR = VSI_ERROR; /* GRR Communication */
78 #endif
79 GLOBAL T_HANDLE hCommMMI = VSI_ERROR; /* EM Communication */
80 #ifdef FF_WAP
81 GLOBAL T_HANDLE hCommWAP = VSI_ERROR; /* FMM-WAP Communication */
82 #endif
83
84 #endif /* TI_PS_HCOMM_CHANGE */
85
86 static UBYTE stop_reg = FALSE;
87
88 GLOBAL T_RR_DATA rr_data_base;
89
90 #ifdef TI_PS_FF_QUAD_BAND_SUPPORT
91 const UBYTE std_bands[12] =
92 #else
93 const UBYTE std_bands[8] =
94 #endif
95 {
96 BAND_GSM_900, /* std = 1 */
97 BAND_GSM_900 | BAND_E_GSM, /* std = 2 */
98 BAND_PCS_1900, /* std = 3 */
99 BAND_DCS_1800, /* std = 4 */
100 BAND_DUAL, /* std = 5 */
101 BAND_DUAL_EXT, /* std = 6 */
102 BAND_GSM_850, /* std = 7 */
103 BAND_DUAL_US /* std = 8 */
104 #ifdef TI_PS_FF_QUAD_BAND_SUPPORT
105 ,BAND_GSM_850 | BAND_DCS_1800, /* std = 9 */
106 BAND_GSM_900 | BAND_E_GSM | BAND_PCS_1900, /* std = 10 */
107 BAND_GSM_850 | BAND_GSM_900 | BAND_E_GSM | BAND_DCS_1800, /* std = 11 */
108 BAND_GSM_850 | BAND_GSM_900 | BAND_E_GSM | BAND_PCS_1900 /* std = 12 */
109 #endif
110 };
111
112 /*==== PRIVATE ====================================================*/
113
114 LOCAL void pei_not_supported (void *data);
115
116 /*==== VARIABLES ==================================================*/
117 #ifdef _SIMULATION_
118 LOCAL BOOL first_access = TRUE;
119 #endif /* _SIMULATION_ */
120
121 /*==== FUNCTIONS ==================================================*/
122
123 LOCAL const T_FUNC dl_table[] = {
124 MAK_FUNC_0( dat_dl_establish_ind, DL_ESTABLISH_IND ), /* 0x80004003 */
125 MAK_FUNC_0( dat_dl_establish_cnf, DL_ESTABLISH_CNF ), /* 0x80014003 */
126 MAK_FUNC_0( dat_dl_release_ind, DL_RELEASE_IND ), /* 0x80024003 */
127 MAK_FUNC_0( dat_dl_release_cnf, DL_RELEASE_CNF ), /* 0x80034003 */
128 MAK_FUNC_S( for_dl_data_ind, DL_DATA_IND ), /* 0x80044003 */
129 #if defined (REL99) && defined (TI_PS_FF_EMR)
130 MAK_FUNC_S( for_dl_short_unitdata_ind, DL_SHORT_UNITDATA_IND ), /* 0x80054003 */
131 #else
132 MAK_FUNC_0( pei_not_supported, DL_DATA_CNF ), /* 0x80054003 */
133 #endif
134 };
135
136 LOCAL const T_FUNC rr_table[] = {
137 MAK_FUNC_0( dat_rr_abort_req, RR_ABORT_REQ ),
138 MAK_FUNC_0( att_rr_activate_req, RR_ACTIVATE_REQ ),
139 MAK_FUNC_S( dat_rr_data_req, RR_DATA_REQ ),
140 MAK_FUNC_0( att_rr_deactivate_req, RR_DEACTIVATE_REQ ),
141 MAK_FUNC_S( dat_rr_establish_req, RR_ESTABLISH_REQ ),
142 MAK_FUNC_0( att_rr_sync_req, RR_SYNC_REQ ),
143 MAK_FUNC_0( att_rr_sync_hplmn_req, RR_SYNC_HPLMN_REQ )
144 };
145
146 LOCAL const T_FUNC mph_table[] = {
147 MAK_FUNC_N( pei_not_supported, MPH_BCCH_IND ),
148 MAK_FUNC_0( att_mph_measurement_ind, MPH_MEASUREMENT_IND ),
149 MAK_FUNC_0( dat_mph_dedicated_cnf, MPH_DEDICATED_CNF ),
150 MAK_FUNC_0( dat_mph_dedicated_fail_cnf, MPH_DEDICATED_FAIL_CNF ),
151 MAK_FUNC_0( att_mph_error_ind, MPH_ERROR_IND ),
152 MAK_FUNC_0( dat_mph_emo_meas_ind, MPH_EMO_MEAS_IND ),
153 MAK_FUNC_0( dat_mph_paging_ind, MPH_PAGING_IND ),
154 MAK_FUNC_0( cs_mph_power_cnf, MPH_POWER_CNF ),
155 MAK_FUNC_0( cs_mph_bsic_cnf, MPH_BSIC_CNF ),
156 MAK_FUNC_S( for_mph_unitdata_ind, MPH_UNITDATA_IND ),
157 MAK_FUNC_0( dat_mph_random_access_cnf, MPH_RANDOM_ACCESS_CNF ),
158 MAK_FUNC_0( att_mph_sync_ind, MPH_SYNC_IND ),
159 MAK_FUNC_0( att_mph_meas_order_cnf, MPH_MEAS_ORDER_CNF ),
160 #ifdef GPRS
161 MAK_FUNC_0( att_mph_ext_meas_cnf, MPH_EXT_MEAS_CNF ),
162 #else
163 MAK_FUNC_N( pei_not_supported, 0 ), /* 0x0D */
164 #endif
165 #if defined FF_EOTD
166 MAK_FUNC_0( att_mph_ncell_pos_ind, MPH_NCELL_POS_IND ),
167 #else
168 MAK_FUNC_N( pei_not_supported, 0 ), /* 0x0E */
169 #endif /* FF_EOTD */
170 MAK_FUNC_0( att_mph_stop_dedicated_cnf, MPH_STOP_DEDICATED_CNF), /* 0x0f */
171 #ifdef GPRS
172 MAK_FUNC_0( att_mph_meas_rep_cnf, MPH_MEAS_REP_CNF )
173 #else
174 MAK_FUNC_N( pei_not_supported, 0 ) /* 0x10 */
175 #endif
176 #ifdef TI_PS_FF_QUAD_BAND_SUPPORT
177 ,
178 MAK_FUNC_N( att_mph_init_rr_ind, MPH_INIT_RR_IND ) /* 0x11 */
179 #endif
180
181 };
182
183 #ifdef FF_EM_MODE
184 LOCAL const T_FUNC em_ul_table[] = {
185 MAK_FUNC_0( dat_em_sc_info_req, EM_SC_INFO_REQ ), /* 0x00*/
186 MAK_FUNC_N( pei_not_supported, 0 ), /* 0x01*/
187 MAK_FUNC_0( dat_em_nc_info_req, EM_NC_INFO_REQ ), /* 0x02*/
188 MAK_FUNC_0( dat_em_loc_pag_info_req, EM_LOC_PAG_INFO_REQ ), /* 0x03*/
189 MAK_FUNC_0( dat_em_plmn_info_req, EM_PLMN_INFO_REQ ), /* 0x04*/
190 MAK_FUNC_0( dat_em_cip_hop_dtx_info_req, EM_CIP_HOP_DTX_INFO_REQ ), /* 0x05*/
191 MAK_FUNC_0( dat_em_mobdata_power_info_req, EM_POWER_INFO_REQ ), /* 0x06*/
192 MAK_FUNC_0( dat_em_mobdata_id_info_req, EM_IDENTITY_INFO_REQ ), /* 0x07*/
193 MAK_FUNC_0( dat_em_mobdata_version_info_req,EM_SW_VERSION_INFO_REQ ), /* 0x08*/
194 MAK_FUNC_N( pei_not_supported, 0 ), /* 0x09*/
195 MAK_FUNC_N( pei_not_supported, 0 ), /* 0x0A*/
196 MAK_FUNC_N( rr_em_rr_event_req, EM_RR_EVENT_REQ ), /* 0x0B*/
197 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x0C */
198 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x0D */
199 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x0E */
200 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x0F */
201 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x10 */ /*SIM - event*/
202 MAK_FUNC_0( rr_em_pco_trace_req, EM_PCO_TRACE_REQ ), /* 0x11*/ /*PCO output*/
203 #ifdef GPRS
204 MAK_FUNC_0 (dat_em_fmm_sc_info_req, EM_FMM_SC_INFO_REQ ), /* 0x12 */
205 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x13 */
206 MAK_FUNC_0 (dat_em_fmm_nc_info_req, EM_FMM_NC_INFO_REQ ), /* 0x14 */
207 #else /*GPRS*/
208 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x12 */
209 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x13 */
210 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x14 */
211 #endif /*GPRS*/
212 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x15 */
213 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x16 */
214 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x17 */
215 MAK_FUNC_N (pei_not_supported, 0 ), /* 0x18 */
216 MAK_FUNC_0 (dat_em_amr_info_req, EM_AMR_INFO_REQ ) /* 0x19 */
217 };
218 #endif /* FF_EM_MODE */
219
220
221 #if defined FF_EOTD
222 LOCAL const T_FUNC rrlc_table[] = {
223 MAK_FUNC_0( dat_rrlc_meas_req, RRLC_MEAS_REQ )
224 };
225
226 LOCAL const T_FUNC rrrrlp_table[] = {
227 MAK_FUNC_S( dat_rrrrlp_data_req, RRRRLP_DATA_REQ )
228 };
229 #endif /* FF_EOTD */
230
231 /*
232 +--------------------------------------------------------------------+
233 | PROJECT : GSM-PS (6147) MODULE : RR_PEI |
234 | STATE : code ROUTINE : pei_primitive |
235 +--------------------------------------------------------------------+
236
237 PURPOSE : Process protocol specific primitive.
238
239 */
240
241 LOCAL SHORT pei_primitive (void * ptr)
242 {
243 T_PRIM *prim = ptr;
244
245 /*
246 * | | | |
247 * RR EM RRLC RRRRLP UPLINK
248 * | | | |
249 * +-------v-------v-------v-------v------+
250 * | |
251 * | RR |
252 * | |
253 * +----------^------------------^--------+
254 * | |
255 * MPH DL DOWNLINK
256 * | |
257 *
258 */
259
260 TRACE_FUNCTION ("pei_primitive()");
261
262 /*
263 * On keypress may stop the registration timer
264 */
265 if (stop_reg)
266 {
267 stop_reg = FALSE;
268 tim_reset_registration_timer ();
269 }
270
271 if (prim NEQ NULL)
272 {
273 ULONG opc = prim->custom.opc;
274 USHORT n;
275 const T_FUNC *table;
276 GET_INSTANCE_DATA;
277
278 VSI_PPM_REC ((T_PRIM_HEADER*)prim, __FILE__, __LINE__);
279
280 PTRACE_IN (opc);
281
282 switch (SAP_NR(opc))
283 {
284 case SAP_NR(RR_UL) : table = rr_table; n = TAB_SIZE ( rr_table); break;
285 case SAP_NR(DL_DL) : table = dl_table; n = TAB_SIZE ( dl_table); break;
286 case SAP_NR(MPH_UL) : table = mph_table; n = TAB_SIZE ( mph_table); break;
287 #if defined FF_EOTD
288 case SAP_NR(RRLC_UL) : table = rrlc_table; n = TAB_SIZE ( rrlc_table); break;
289 case SAP_NR(RRRRLP_UL): table = rrrrlp_table; n = TAB_SIZE (rrrrlp_table); break;
290 #endif /* FF_EOTD */
291
292 #ifdef GPRS
293 case RRGRR_UL: gprs_get_table_n (&table, &n); break;
294 #endif /* GPRS */
295
296 #ifdef FF_EM_MODE
297 case EM_Ul: table = em_ul_table; n = TAB_SIZE (em_ul_table); break;
298 #endif /* FF_EM_MODE*/
299
300 default : table = NULL; n = 0; break;
301 }
302
303 if (table NEQ NULL)
304 {
305 if (PRIM_NR(opc) < n)
306 {
307 table += PRIM_NR(opc);
308 #ifdef PALLOC_TRANSITION
309 P_SDU(prim) = table->soff ? (T_sdu*) (((char*)&prim->data) + table->soff) : 0;
310 #ifndef NO_COPY_ROUTING
311 P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER);
312 #endif /* NO_COPY_ROUTING */
313 #endif /* PALLOC_TRANSITION */
314 JUMP (table->func) (P2D(prim));
315
316 while (ENTITY_DATA->use_stored_entries)
317 {
318 ENTITY_DATA->use_stored_entries = FALSE;
319 srv_use_stored_prim ();
320 }
321 }
322 #if defined (REL99) && defined (TI_PS_FF_EMR)
323 else if (PRIM_NR(opc) EQ DL_SPD_PID )
324 {
325 for_dl_short_unitdata_ind((T_DL_SHORT_UNITDATA_IND*) P2D(prim));
326 }
327 #endif
328 else
329 {
330 pei_not_supported (P2D(prim));
331 }
332 return PEI_OK;
333 }
334
335 /*
336 * Primitive is no GSM Primitive
337 * then forward to the environment
338 */
339
340 #ifdef GSM_ONLY
341 PFREE (P2D(prim))
342
343 return PEI_ERROR;
344 #else
345 if (opc & SYS_MASK)
346 vsi_c_primitive (VSI_CALLER prim);
347 else
348 {
349 PFREE (P2D(prim));
350 return PEI_ERROR;
351 }
352 #endif
353 }
354 return PEI_OK;
355 }
356
357 /*
358 +--------------------------------------------------------------------+
359 | PROJECT : GSM-PS (6147) MODULE : RR_PEI |
360 | STATE : code ROUTINE : rr_pei_primitive |
361 +--------------------------------------------------------------------+
362
363 PURPOSE : used to restart a stored primitive.
364
365 */
366 GLOBAL void rr_pei_primitive (T_PRIM * prim)
367 {
368 pei_primitive (prim);
369 }
370
371 /*
372 +--------------------------------------------------------------------+
373 | PROJECT : GSM-PS (6147) MODULE : RR_PEI |
374 | STATE : code ROUTINE : wake_up_rr |
375 +--------------------------------------------------------------------+
376
377 PURPOSE : This function can be called from the MMI or keypad driver
378 to restart registration if in limited / no service condition.
379
380 */
381 /*lint -esym(714,wake_up_rr) | Symbol not referenced */
382 /*lint -esym(765,wake_up_rr) | external could be made static */
383 GLOBAL void wake_up_rr (void)
384 {
385 GET_INSTANCE_DATA;
386 T_TIME status = 0L;
387
388 TRACE_FUNCTION ("wake_up_rr()");
389
390 switch (rr_data->ms_data.rr_service)
391 {
392 case NO_SERVICE:
393 case LIMITED_SERVICE:
394 if (rr_data->ms_data.reg_counter >= 12)
395 {
396 TIMER_STATUS (rr_handle, TREG, &status);
397 if (status)
398 {
399 stop_reg = TRUE;
400 vsi_c_awake (VSI_CALLER_SINGLE);
401 }
402 }
403 break;
404 }
405 }
406
407 /*
408 +--------------------------------------------------------------------+
409 | PROJECT : GSM-PS (6147) MODULE : RR_PEI |
410 | STATE : code ROUTINE : pei_not_supported |
411 +--------------------------------------------------------------------+
412
413 PURPOSE : An unsupported primitive is received.
414
415 */
416
417 static void pei_not_supported (void * data)
418 {
419 TRACE_FUNCTION ("pei_not_supported()");
420
421 PFREE (data)
422 }
423
424 /*
425 +--------------------------------------------------------------------+
426 | PROJECT : GSM-PS (6147) MODULE : RR_PEI |
427 | STATE : code ROUTINE : pei_init |
428 +--------------------------------------------------------------------+
429
430 PURPOSE : Initialize Protocol Stack Entity
431
432 */
433 LOCAL SHORT pei_init (T_HANDLE handle)
434 {
435 GET_INSTANCE_DATA;
436 rr_handle = handle;
437
438 TRACE_FUNCTION ("pei_init()");
439
440 #ifdef TI_PS_HCOMM_CHANGE
441 if (!cl_hcom_all_handles_open())
442 {
443 return PEI_ERROR;
444 }
445
446 #ifdef GPRS
447 if (hCommGRR < VSI_OK)
448 {
449 if ((hCommGRR = vsi_c_open (VSI_CALLER GRR_NAME)) < VSI_OK)
450 return PEI_ERROR;
451 }
452 #endif
453 #else /* for hCommHandles backward compatibility */
454 if (hCommDL < VSI_OK)
455 {
456 if ((hCommDL = vsi_c_open (VSI_CALLER DL_NAME)) < VSI_OK)
457 return PEI_ERROR;
458 }
459 #if defined FF_EOTD
460 if (hCommLC < VSI_OK)
461 {
462 if ((hCommLC = vsi_c_open (VSI_CALLER LC_NAME)) < VSI_OK)
463 return PEI_ERROR;
464 }
465 if (hCommRRLP < VSI_OK)
466 {
467 if ((hCommRRLP = vsi_c_open (VSI_CALLER RRLP_NAME)) < VSI_OK)
468 return PEI_ERROR;
469 }
470 #endif /* FF_EOTD */
471
472 if (hCommMM < VSI_OK)
473 {
474 if ((hCommMM = vsi_c_open (VSI_CALLER MM_NAME)) < VSI_OK)
475 return PEI_ERROR;
476 }
477
478 if (hCommPL < VSI_OK)
479 {
480 if ((hCommPL = vsi_c_open (VSI_CALLER PL_NAME)) < VSI_OK)
481 return PEI_ERROR;
482 }
483
484 #ifdef GPRS
485 if (hCommGRR < VSI_OK)
486 {
487 if ((hCommGRR = vsi_c_open (VSI_CALLER GRR_NAME)) < VSI_OK)
488 return PEI_ERROR;
489 }
490 #endif
491
492 #ifdef FF_WAP /*FMM*/
493
494 if (hCommWAP < VSI_OK)
495 {
496 if ((hCommWAP = vsi_c_open (VSI_CALLER WAP_NAME)) < VSI_OK)
497 return PEI_ERROR;
498 }
499 #endif
500
501 if (hCommMMI < VSI_OK)
502 {
503 /*
504 * Open MMI (Layer 4)
505 */
506
507 if ((hCommMMI = vsi_c_open (VSI_CALLER ACI_NAME)) < VSI_OK)
508 return PEI_ERROR;
509 }
510 #endif /* TI_PS_HCOMM_CHANGE */
511
512 rr_data->ms_data.multislot_class_configured = FALSE;
513 rr_data->ms_data.cmsp_configured = FALSE;
514 /*
515 * Initialize Condat Coder Decoder and
516 * processes
517 */
518
519 #if !defined(_SIMULATION_)
520 // TRACE_EVENT (rr_version());
521 // SYST_TRACE (rr_version());
522 #endif /* !_SIMULATION_ */
523
524 ccd_init ();
525 att_init_gsm_data ();
526 dat_init_rr_data ();
527 cs_init_process ();
528 pcm_Init ();
529 cl_shrd_init(rr_handle);
530
531 #if defined(_SIMULATION_)
532 rr_csf_ms_cap ();
533 rr_csf_check_rfcap (TRUE);
534 #endif
535
536 #ifdef GPRS
537 gprs_init_gprs_data ();
538 #endif
539
540 #ifdef FF_EM_MODE
541 em_init_rr_event_trace();
542 em_rr_sem_init();
543 em_init_get_hchn ();
544 #endif /* FF_EM_MODE */
545
546 return PEI_OK;
547 }
548
549 /*
550 +--------------------------------------------------------------------+
551 | PROJECT : GSM-PS (6147) MODULE : RR_PEI |
552 | STATE : code ROUTINE : pei_timeout |
553 +--------------------------------------------------------------------+
554
555 PURPOSE : Process timeout
556
557 */
558
559 LOCAL SHORT pei_timeout (USHORT index)
560 {
561 GET_INSTANCE_DATA;
562
563 TRACE_FUNCTION ("pei_timeout ()");
564
565 /*
566 * Handle Timeouts
567 */
568 tim_exec_timeout (index);
569
570 while (ENTITY_DATA->use_stored_entries)
571 {
572 ENTITY_DATA->use_stored_entries = FALSE;
573 srv_use_stored_prim ();
574 }
575
576 return PEI_OK;
577 }
578
579 #ifdef _SIMULATION_
580 /*
581 +--------------------------------------------------------------------+
582 | PROJECT : GSM-PS (6147) MODULE : RR_PEI |
583 | STATE : code ROUTINE : pei_exit |
584 +--------------------------------------------------------------------+
585
586 PURPOSE : Close Resources and terminate
587
588 */
589
590 LOCAL SHORT pei_exit (void)
591 {
592 TRACE_FUNCTION ("pei_exit()");
593
594 /*
595 * clean up communication
596 */
597 #ifdef TI_PS_HCOMM_CHANGE
598 #else /* for hCommHandles backward compatibility */
599 vsi_c_close (VSI_CALLER hCommDL);
600 hCommDL = VSI_ERROR;
601
602 #if defined FF_EOTD
603 vsi_c_close (VSI_CALLER hCommLC);
604 hCommLC = VSI_ERROR;
605
606 vsi_c_close (VSI_CALLER hCommRRLP);
607 hCommRRLP = VSI_ERROR;
608 #endif /* FF_EOTD */
609
610 vsi_c_close (VSI_CALLER hCommMM);
611 hCommMM = VSI_ERROR;
612
613 vsi_c_close (VSI_CALLER hCommPL);
614 hCommPL = VSI_ERROR;
615
616 vsi_c_close (VSI_CALLER hCommMMI);
617 hCommMMI = VSI_ERROR;
618
619 #ifdef FF_WAP /*FFM*/
620 vsi_c_close (VSI_CALLER hCommWAP);
621 hCommWAP = VSI_ERROR;
622 #endif
623 #endif /* TI_PS_HCOMM_CHANGE */
624
625 #ifdef FF_EM_MODE
626 em_rr_sem_exit();
627 #endif /* FF_EM_MODE */
628
629 ccd_exit();
630 cl_shrd_exit();
631
632 return PEI_OK;
633 }
634 #endif /* _SIMULATION_ */
635
636 /*
637 +--------------------------------------------------------------------+
638 | PROJECT : GSM-PS (6147) MODULE : RR_PEI |
639 | STATE : code ROUTINE : pei_config |
640 +--------------------------------------------------------------------+
641
642 PURPOSE : Dynamic Configuration
643
644 */
645
646 #if !defined (NCONFIG)
647 LOCAL const KW_DATA kwtab[] = {
648 #ifdef OPTION_TIMER
649 RR_TIMER_SET, TIMER_SET,
650 RR_TIMER_RESET, TIMER_RESET,
651 RR_TIMER_SPEED_UP, TIMER_SPEED_UP,
652 RR_TIMER_SLOW_DOWN, TIMER_SLOW_DOWN,
653 RR_TIMER_SUPPRESS, TIMER_SUPPRESS,
654 #endif /* OPTION_TIMER */
655 RR_TFAST_CS, TIM_FAST,
656 RR_TNORMAL_CS, TIM_NORMAL,
657 RR_FCR, FCR,
658 RR_SCR, SCR,
659 RR_DLE, DLE,
660 RR_FCA, FCA,
661 RR_FRL, FRL,
662 RR_FHO, FHO,
663 RR_IHO, IHO,
664 RR_NO_SYS_TIME, NO_SYS_TIME,
665 RR_GSM_OFFSET, GSM_OFFSET,
666 RR_DCS_OFFSET, DCS_OFFSET,
667 RR_CTO, CTO,
668 RR_NKC, NKC,
669 RR_RESTRICTED_BAND, ID_RESTRICTED_BAND,
670 RR_BL_CS, BL_CS,
671 RR_U_RXT, U_RXT,
672 RR_M_RXT, M_RXT,
673 RR_L_RXT, L_RXT,
674 RR_FBLS, FBLS,
675 RR_SHOW_BL, SHOW_BL,
676 RR_SHOW_WL, SHOW_WL,
677 RR_SET_NPS_DELAY, SET_NPS_DELAY,
678 #if defined (_SIMULATION_)
679 RR_MT_CALL_NAME, RR_MT_CALL,
680 RR_MT_SMS_0_NAME, RR_MT_SMS_0,
681 RR_MT_SMS_2_NAME, RR_MT_SMS_2,
682 RR_SRV_FULL_NAME, RR_SERVICE_FULL,
683 RR_SRV_LIM_NAME, RR_SERVICE_LIMITED,
684 RR_SRV_NO, RR_SERVICE_NO,
685 RR_PSEUDO_SYNC_HO, ID_PSEUDO_SYNC_HO,
686 RR_PCM, ID_PCM,
687 RR_DCS_PCLASS_3, DCS_PCLASS_3,
688 #endif /* _SIMULATION_ */
689 RR_MULTISLOT_CLASS, ID_MULTISLOT_CLASS,
690 RR_CMSP, ID_CMSP,
691 #if !defined(_SIMULATION_)
692 RR_FFS_CHECK, ID_FFS_CHECK,
693 #endif
694 #if defined (_SIMULATION_FFS_)
695 RR_ERASE_WL, ERASE_WL,
696 RR_ERASE_BL, ERASE_BL,
697 RR_SHIELD, SHIELD,
698 RR_INIT_FFS, INIT_FFS,
699 RR_WRITE_FFS, WRITE_FFS,
700 #endif /* (_SIMULATION_FFS_)*/
701 RR_SET_WL, SET_WL,
702 RR_SET_BL, SET_BL,
703 RR_SET_WL_REGION, SET_WL_REGION,
704 RR_SET_LAST_USED_SC, SET_LAST_USED_SC,
705 RR_SCS, SCS,
706 RR_SET_WL_PLMN, SET_WL_PLMN,
707 "", 0
708 };
709
710 static const KW_DATA partab[] = {
711 #ifdef OPTION_TIMER
712 T3110_NAME, T3110,
713 T3122_NAME, T3122,
714 T3126_NAME, T3126,
715 TRESELECT_NAME, T_RESELECT,
716 TREG_NAME, TREG,
717 TABORT_NAME, TABORT,
718 #endif
719 "", 0
720 };
721 #endif /*!defined (NCONFIG)*/
722 /* Implements Measure#36 */
723 #if defined(NCONFIG)
724 #else /* NCONFIG */
725 LOCAL SHORT pei_config (T_PEI_CONFIG inString)
726 {
727 GET_INSTANCE_DATA;
728 #if !defined (NCONFIG)
729 #define NMAX_VAL 20
730 {
731 char * s = inString;
732 SHORT valno;
733 char * keyw;
734 char * val [NMAX_VAL];
735 #ifdef OPTION_TIMER
736 BOOL t_man = FALSE;
737 SHORT t_num = 0;
738 LONG t_val = 0;
739
740 #endif
741 #if defined(_SIMULATION_FFS_)
742 UBYTE count = 0,index = 0,mcc[SIZE_MCC];
743 SHORT mcc_val = 0;
744 #endif /* _SIMULATION_FFS */
745
746 TRACE_FUNCTION ("pei_config()");
747
748 TRACE_EVENT (s);
749
750 tok_init(s);
751
752 /*
753 * Parse next keyword and number of variables
754 */
755 while ((valno = tok_next(&keyw,val)) NEQ TOK_EOCS)
756 {
757 switch ( tok_key((KW_DATA *)kwtab,keyw))
758 {
759 case TOK_NOT_FOUND:
760 TRACE_ERROR ("[PEI_CONFIG]: Illegal Keyword");
761 break;
762
763 case FCR: /* fast cell reselection */
764 TRACE_EVENT ("[PEI_CONFIG]: FAST CELL RESELECTION");
765 rr_data->dyn_config.fcr = 1;
766 break;
767
768 case SCS:
769 {
770 SHORT i = 0;
771 PALLOC (error_ind, MPH_ERROR_IND);
772
773 TRACE_EVENT(" [PEI_CONFIG]: START CELL SELECTION");
774
775 for( i=0; i < 6; i++)
776 rr_data->nc_data[i].bcch_status = NON_DECODED;
777 /*
778 * Simulating Downlink Failure
779 */
780 error_ind->cs = CS_DOWN_LINK_FAIL;
781 error_ind->arfcn = rr_data->nc_data[SC_INDEX].arfcn;
782 pei_primitive ((T_PRIM *)D2P(error_ind));
783 }
784 break;
785
786 case SCR: /* slow cell reselection */
787 TRACE_EVENT ("[PEI_CONFIG]: SLOW CELL RESELECTION");
788 rr_data->dyn_config.scr = 1;
789 break;
790
791 case DLE: /* downlink error */
792 {
793 PALLOC (error_ind, MPH_ERROR_IND);
794
795 TRACE_EVENT ("[PEI_CONFIG]: DOWNLINK ERROR");
796 error_ind->cs = CS_DOWN_LINK_FAIL;
797 pei_primitive ((T_PRIM *)D2P(error_ind));
798 }
799 break;
800
801 case FRL: /* force radio link timeout */
802 {
803 PALLOC (error_ind, MPH_ERROR_IND);
804
805 TRACE_EVENT ("[PEI_CONFIG]: RADIO LINK ERROR");
806 error_ind->cs = CS_RADIO_LINK_FAIL;
807 pei_primitive ((T_PRIM *)D2P(error_ind));
808 }
809 break;
810 case FCA: /* failed channel assign */
811 TRACE_EVENT ("[PEI_CONFIG]: FAILED CHANNEL ASSIGN");
812 rr_data->dyn_config.fca = 1;
813 break;
814
815 case FHO: /* forced handover */
816 TRACE_EVENT ("[PEI_CONFIG]: FORCED HANDOVER");
817 rr_data->dyn_config.fho = 1;
818 break;
819
820 case IHO : /* Lock/Unlock the DUT to the cell it is already camping */
821 TRACE_EVENT_P1("[PEI_CONFIG]: Lock/Unlock the DUT to the cell it is already camping : %s", val[0]);
822 rr_data->dyn_config.iho = atoi (val[0]);
823 break;
824
825 case GSM_OFFSET: /* Offset for GSM channels */
826 rr_data->dyn_config.gsm_offset = atoi (val[0]);
827 break;
828
829 case DCS_OFFSET: /* Offset for DCS channels */
830 rr_data->dyn_config.dcs_offset = atoi (val[0]);
831 break;
832
833 case CTO: /* enable cell test operation mode */
834 rr_data->cell_test_operation = TRUE;
835 break;
836
837 case NKC: /* request to cipher when no ciphering key available */
838 rr_data->dyn_config.nkc = TRUE;
839 break;
840 case BL_CS: /* Controls Black List search */
841 if(valno)
842 {
843 valno = atoi (val[0]);
844 rr_data->dyn_config.bl_cs_en = valno ? 1 : 0;
845 TRACE_EVENT_P1("[PEI_CONFIG]: BL_CS : Black List search : %s", val[0]);
846 }
847 else
848 {
849 TRACE_ERROR ("[PEI_CONFIG]: BL_CS-Wrong Number of Parameters");
850 }
851 break;
852 case U_RXT: /* Upper RxLev threshold Level*/
853 if(valno>0 AND valno<=MAX_NUM_BANDS)
854 {
855 rr_csf_write_rxlev_thr( U_RXT, valno, val );
856 }
857 else
858 {
859 TRACE_ERROR ("[PEI_CONFIG]: U_RXT-Wrong Number of Parameters");
860 }
861 break;
862 case M_RXT: /* Medium threshold level*/
863 if(valno>0 AND valno<=MAX_NUM_BANDS)
864 {
865 rr_csf_write_rxlev_thr( M_RXT, valno, val );
866 }
867 else
868 {
869 TRACE_ERROR ("[PEI_CONFIG]: M_RXT-Wrong Number of Parameters");
870 }
871 break;
872 case L_RXT: /* Lower threshold level*/
873 if(valno>0 AND valno<=MAX_NUM_BANDS)
874 {
875 rr_csf_write_rxlev_thr( L_RXT, valno, val );
876 }
877 else
878 {
879 TRACE_ERROR ("[PEI_CONFIG]: L_RXT-Wrong Number of Parameters");
880 }
881 break;
882 case FBLS: /* Force Black List Search */
883 if((GET_STATE(STATE_ATT) EQ ATT_IDLE) AND
884 (rr_data->ms_data.rr_service EQ FULL_SERVICE))
885 {
886 #ifdef TI_PS_FF_QUAD_BAND_SUPPORT
887 if (rr_data->cs_data.region EQ BOTH_REGIONS)
888 {
889 if(srv_is_list_set(&rr_data->cs_data.black_list.list[EUROPEAN_REGION]) OR
890 srv_is_list_set(&rr_data->cs_data.black_list.list[AMERICAN_REGION]))
891 {
892 att_start_cell_selection(RR_ORIGINATED,CS_PARALLEL,BLACK_LIST_SEARCH_MODE);
893 }
894 else
895 TRACE_EVENT("Black List empty");
896 }
897 else
898 {
899 #endif
900 if(srv_is_list_set(
901 &rr_data->cs_data.black_list.list[rr_data->cs_data.region]))
902 {
903 att_start_cell_selection(RR_ORIGINATED,CS_PARALLEL,BLACK_LIST_SEARCH_MODE);
904 }
905 else
906 TRACE_EVENT("Black List empty");
907 #ifdef TI_PS_FF_QUAD_BAND_SUPPORT
908 }
909 #endif
910 }
911 break;
912 case ID_RESTRICTED_BAND:
913 rr_data->dyn_config.set_band = atoi (val[0]);
914
915 switch (GET_STATE (STATE_ATT))
916 {
917 case ATT_NULL:
918 case ATT_NO_SERVICE:
919 case ATT_CS1:
920 case ATT_CS2:
921 case ATT_CS3:
922 case ATT_IDLE:
923 rr_data->ms_data.rr_service = NO_SERVICE;
924 att_code_rr_abort_ind (RRCS_ABORT_CEL_SEL_FAIL);
925 SET_STATE (STATE_ATT, ATT_NO_SERVICE);
926
927 rr_data->cs_data.scan_mode = CS_FIRST_SCAN_FIRST_ATTEMPT;
928
929 att_reset_old_lai_rac();
930
931 cs_set_null ();
932 cs_set_all ();
933 cs_start_scan ();
934 /*
935 * initialise cell selection parameter
936 */
937 rr_data->sc_data.selection_type = CELL_SELECTION;
938 rr_data->sc_data.mm_started = FALSE;
939 rr_data->sc_data.found_entries = 0;
940 att_init_cr_data();
941
942 SET_STATE (STATE_ATT, ATT_CS1);
943
944 switch (rr_data->dyn_config.set_band)
945 {
946 case 0:
947 TRACE_EVENT ("[PEI_CONFIG]: Set band to default");
948 break;
949 case 1:
950 TRACE_EVENT ("[PEI_CONFIG]: Set band to GSM 900");
951 break;
952 case 2:
953 TRACE_EVENT ("[PEI_CONFIG]: Set band to DCS 1800");
954 break;
955 } /* switch (rr_data->set_band) */
956 } /* switch (GET_STATE (STATE_ATT)) */
957 break;
958
959 case NO_SYS_TIME:
960 rr_data->dyn_config.no_sys_time = TRUE;
961 break;
962
963 case SET_LAST_USED_SC:
964 if(valno)
965 {
966 rr_data->cs_data.white_list.last_sc_arfcn = atoi (val[0]);
967 TRACE_EVENT_P1("LAST SC ARFCN = %x",rr_data->cs_data.white_list.last_sc_arfcn);
968 }
969 else
970 {
971 TRACE_ERROR ("[PEI_CONFIG]: LAST_USED_SC-Wrong Number of Parameters");
972 }
973 break;
974
975 #if defined (_SIMULATION_FFS_)
976 case INIT_FFS:
977 rr_csf_ffs_init();
978 TRACE_EVENT_P1("LAST SC ARFCN = %x",rr_data->cs_data.white_list.last_sc_arfcn);
979 break;
980
981 case WRITE_FFS:
982 {
983 rr_csf_write_black_list(&rr_data->cs_data.black_list.list[0]);
984 rr_csf_write_white_list(&rr_data->cs_data.white_list);
985 }
986 break;
987 #endif /* _SIMULATION_FFS_ */
988
989
990 #ifdef OPTION_TIMER
991 case TIMER_SET:
992 if (valno EQ 2)
993 {
994 t_man = TRUE;
995 t_num = tok_key((KW_DATA *)partab,val[0]);
996 t_val = atoi(val[1]);
997 if (t_val < 0L)
998 t_val = 0L;
999 }
1000 else
1001 {
1002 TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
1003 }
1004 break;
1005 case TIMER_RESET:
1006 case TIMER_SUPPRESS:
1007 if (valno EQ 1)
1008 {
1009 t_man = TRUE; /* Timermanipulation */
1010 t_num = tok_key((KW_DATA *)partab,val[0]);
1011 t_val = 0L;
1012 }
1013 else
1014 {
1015 TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
1016 }
1017 break;
1018 case TIMER_SPEED_UP:
1019 case TIMER_SLOW_DOWN:
1020 if (valno EQ 2)
1021 {
1022 t_man = TRUE;
1023 t_num = tok_key((KW_DATA *)partab,val[0]);
1024 t_val = atoi(val[1]);
1025 if (t_val <= 0L)
1026 t_val = 1L;
1027 }
1028 else
1029 {
1030 TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
1031 }
1032 break;
1033 case TIM_FAST:
1034 if(valno)
1035 {
1036 rr_data->dyn_config.tfast_cs_val = atoi(val[0])*60000;
1037 TRACE_EVENT_P1("[PEI_CONFIG]TFAST_CS : %dms",rr_data->dyn_config.tfast_cs_val);
1038 if(!rr_data->dyn_config.tfast_cs_val)
1039 {
1040 if(IS_TIMER_ACTIVE(T_FAST_CS))
1041 TIMERSTOP(T_FAST_CS);
1042 }
1043 }
1044 else
1045 {
1046 TRACE_ERROR ("[PEI_CONFIG]: TFAST_CS-Wrong Number of Parameters");
1047 }
1048 break;
1049 case TIM_NORMAL:
1050 if(valno)
1051 {
1052 rr_data->dyn_config.tnormal_cs_val = atoi(val[0])*60000;
1053 TRACE_EVENT_P1("[PEI_CONFIG]TNORMAL_CS : %dms",rr_data->dyn_config.tnormal_cs_val);
1054 if(!rr_data->dyn_config.tnormal_cs_val)
1055 {
1056 if(IS_TIMER_ACTIVE(T_NORMAL_CS))
1057 TIMERSTOP(T_NORMAL_CS);
1058 }
1059 }
1060 else
1061 {
1062 TRACE_ERROR ("[PEI_CONFIG]: TNORMAL_CS-Wrong Number of Parameters");
1063 }
1064 break;
1065 #endif
1066
1067 #if defined (_SIMULATION_)
1068 case RR_MT_CALL:
1069 /*
1070 * Start mobile terminated call
1071 * if simulation is enabled
1072 */
1073 break;
1074 case RR_MT_SMS_0:
1075 /*
1076 * Start mobile terminated SMS class 0
1077 * if simulation is enabled
1078 */
1079 break;
1080 case RR_MT_SMS_2:
1081 /*
1082 * Start mobile terminated SMS class 0
1083 * if simulation is enabled
1084 */
1085 break;
1086 case RR_SERVICE_FULL:
1087 /*
1088 * Set full service
1089 * if simulation is enabled
1090 */
1091 break;
1092 case RR_SERVICE_LIMITED:
1093 /*
1094 * Set limited service
1095 * if simulation is enabled
1096 */
1097 break;
1098 case RR_SERVICE_NO:
1099 /*
1100 * Set no service
1101 * if simulation is enabled
1102 */
1103 break;
1104 case RR_MO_CONNECT:
1105 break;
1106
1107 case ID_PSEUDO_SYNC_HO:
1108 if (valno)
1109 {
1110 if (atoi (val[0]))
1111 rr_data->ms_data.rf_cap.ps = TRUE;
1112 else
1113 rr_data->ms_data.rf_cap.ps = FALSE;
1114 TRACE_EVENT_P1 ("PSEUDO_SYNC_HO capability changed (%u)",
1115 rr_data->ms_data.rf_cap.ps);
1116 rr_csf_fit_capability ();
1117 }
1118 else
1119 {
1120 TRACE_ERROR("[PEI_CONFIG]: use CONFIG PSEUDO_SYNC_HO=<value>");
1121 }
1122 break;
1123 case DCS_PCLASS_3 :
1124 TRACE_EVENT_P1("DCS_PCLASS_3 old [%d] -> new[3]",
1125 rr_data->ms_data.rf_cap.rf_power.pow_class4[IDX_PWRCLASS_1800].pow_class);
1126 rr_data->ms_data.rf_cap.rf_power.pow_class4[IDX_PWRCLASS_1800].pow_class = POWER_CLASS_3;
1127 break;
1128 case ID_PCM: /* sample: COMMAND ("RR CONFIG PCM=<MSCAP,0x0F,0xb7,0b10001010,0,0,0>") */
1129 if (valno)
1130 {
1131 UBYTE b[NMAX_VAL-1];
1132 UBYTE version,ok=1;
1133 USHORT i,n=valno-1;
1134
1135 if ( pcm_ReadFile ( val[0], n, b, &version) EQ PCM_OK)
1136 {
1137 for ( i = 0; i < n; ++i )
1138 {
1139 UBYTE c,*p = val[i+1];
1140 int dig,z = 0;
1141 UBYTE base;
1142
1143 if ( p[0] EQ '0' )
1144 {
1145 if ( p[1] EQ 'x' OR p[1] EQ 'X' ) { p += 2; base = 16; } else
1146 if ( p[1] EQ 'b' OR p[1] EQ 'B' ) { p += 2; base = 2; } else
1147 base = 8;
1148 }
1149 else
1150 base = 10;
1151
1152 while ( ok AND (c = *p++) != '\0' )
1153 {
1154 if ( c >= '0' AND c <= '9' ) dig = c - '0'; else
1155 if ( c >= 'A' AND c <= 'F' ) dig = c - 'A' + 10; else
1156 if ( c >= 'a' AND c <= 'f' ) dig = c - 'a' + 10; else
1157 {
1158 ok = 0;
1159 break;
1160 }
1161
1162 if ( base EQ 2 ) ok = dig >= 0 AND dig <= 1; else
1163 if ( base EQ 8 ) ok = dig >= 0 AND dig <= 7; else
1164 if ( base EQ 10 ) ok = dig >= 0 AND dig <= 9; else
1165 if ( base EQ 16 ) ok = dig >= 0 AND dig <= 15;
1166
1167 if ( ok )
1168 z = z * base + dig;
1169 };
1170
1171 if ( ok )
1172 {
1173 TRACE_EVENT_P4 ( "%s[%d]: 0x%02x -> 0x%02x", val[0], i, b[i], z );
1174 b[i] = z;
1175 }
1176 else
1177 {
1178 TRACE_EVENT_P1 ( "invalid number:%s", val[i+1] );
1179 break;
1180 }
1181 }
1182
1183 if ( ok )
1184 {
1185 if ( pcm_WriteFile ( val[0], n, b) EQ PCM_OK)
1186 {
1187 rr_csf_read_rfcap ();
1188 rr_csf_fit_capability ();
1189 rr_csf_read_imei (&rr_data->ms_data.imei);
1190 rr_csf_ms_cap ();
1191
1192 }
1193 else
1194 {
1195 TRACE_EVENT ( "cannot perform PCM write action" );
1196 }
1197 }
1198 }
1199 else
1200 {
1201 TRACE_EVENT ( "cannot perform PCM read action" );
1202 }
1203
1204 TRACE_EVENT_P1 ( "PCM '%s' " , val[0] );
1205 }
1206 else
1207 {
1208 TRACE_ERROR("[PEI_CONFIG]: use PCM=<value>");
1209 }
1210 break;
1211
1212 #endif /* _SIMULATION_ */
1213 #if defined(_SIMULATION_FFS_)
1214 case SHIELD:
1215 if(!valno)
1216 {
1217 memset(&rr_data->dyn_config.mcc_shield,0,sizeof(T_shield_mcc));
1218 }
1219 else
1220 {
1221 rr_data->dyn_config.mcc_shield.enabled = TRUE;
1222 if(valno > MAX_MCC_SHIELD)
1223 {
1224 TRACE_ERROR("max configurable mcc shield values are four");
1225 valno = MAX_MCC_SHIELD;
1226 }
1227 index = rr_data->dyn_config.mcc_shield.index;
1228 for(count=0;count< valno;count++)
1229 {
1230 if(index >= MAX_MCC_SHIELD)
1231 {
1232 index = 0;
1233 }
1234 mcc_val = atoi(val[count]);
1235 if(!mcc_val)
1236 {
1237 TRACE_ERROR("mcc value cannot be zero");
1238 }
1239 else
1240 {
1241 mcc[0] = (mcc_val/100);
1242 mcc[1] = (mcc_val/10)%10;
1243 mcc[2] = (mcc_val % 10);
1244 if(!rr_csf_mcc_present(mcc))
1245 {
1246 memcpy(rr_data->dyn_config.mcc_shield.mcc[index],mcc,SIZE_MCC);
1247 index++;
1248 }
1249 }
1250 }
1251 rr_data->dyn_config.mcc_shield.index = index;
1252 }
1253 rr_csf_write_mcc_shield_to_ffs();
1254 break;
1255 #endif /* defined(_SIMULATION_FFS_)*/
1256 case ID_MULTISLOT_CLASS:
1257 if (valno EQ 1)
1258 {
1259 UBYTE ms = atoi (val[0]);
1260 TRACE_EVENT_P1 ("MULTISLOT_CLASS changed (%u)", ms);
1261 rr_data->ms_data.multislot_class_configured = TRUE;
1262 rr_data->ms_data.rf_cap.rf_ms.gprs_ms_class = ms;
1263 #ifdef GPRS
1264 #ifdef REL99
1265 rr_data->ms_data.ra_cap.ra_cap_values.acc_cap.v_ms_struct = SUPPORTED;
1266 rr_data->ms_data.ra_cap.ra_cap_values.acc_cap.ms_struct.gprs_struct.gprs_ms_class = ms;
1267 if (rr_data->ms_data.ra_cap.c_ra_cap_r EQ MAX_ADD_RA_CAP)
1268 #else
1269 rr_data->ms_data.ra_cap.acc_cap.v_ms_struct = SUPPORTED;
1270 rr_data->ms_data.ra_cap.acc_cap.ms_struct.gprs_struct.gprs_ms_class = ms;
1271 if (rr_data->ms_data.ra_cap.v_ra_cap2)
1272 #endif
1273 {
1274 /*
1275 * zero means that the same value for multislot parameters as given
1276 * in an earlier access capabilities field within this IE apply
1277 * also here.
1278 */
1279 #ifdef REL99
1280 rr_data->ms_data.ra_cap.ra_cap_r[0].ra_cap_values.acc_cap.v_ms_struct = FALSE;
1281 #else
1282 rr_data->ms_data.ra_cap.ra_cap2.acc_cap.v_ms_struct = FALSE;
1283 #endif
1284 }
1285 #endif
1286 }
1287 else
1288 {
1289 TRACE_ERROR("[PEI_CONFIG]: use CONFIG MULTISLOT_CLASS=<value>");
1290 }
1291 break;
1292 case ID_CMSP:
1293 if (valno EQ 1)
1294 {
1295 BOOL cmsp = atoi (val[0]);
1296 if (cmsp)
1297 cmsp = 1; /* boolean */
1298 TRACE_EVENT_P2 ("CMSP changed (%u->%u)", rr_data->ms_data.rf_cap.cmsp, cmsp);
1299 rr_data->ms_data.cmsp_configured = TRUE;
1300 rr_data->ms_data.rf_cap.cmsp = cmsp;
1301 }
1302 else
1303 {
1304 TRACE_ERROR("[PEI_CONFIG]: use CONFIG CMSP=<0|1>");
1305 }
1306 break;
1307 #if defined(_TARGET_)
1308 #endif /* _TARGET_ */
1309 #if defined (_SIMULATION_FFS_)
1310 case ERASE_WL:
1311 /*lint -e655 (Warning -- bit-wise operation uses (compatible) enum's)*/
1312 cs_clear_white_list (CLR_WHITE_LIST_RAM | CLR_WHITE_LIST_SIM | CLR_WHITE_LIST_FFS);
1313 /*lint +e655 (Warning -- bit-wise operation uses (compatible) enum's)*/
1314 break;
1315 case ERASE_BL:
1316 /*lint -e655 (Warning -- bit-wise operation uses (compatible) enum's)*/
1317 cs_clear_black_list (CLR_BLACK_LIST_RAM | CLR_BLACK_LIST_FFS);
1318 /*lint +e655 (Warning -- bit-wise operation uses (compatible) enum's)*/
1319 break;
1320 #endif /* _SIMULATION_FFS_ */
1321 case SHOW_BL:
1322 /*lint -e655 (Warning -- bit-wise operation uses (compatible) enum's)*/
1323 srv_trace_black_list ();
1324 /*lint +e655 (Warning -- bit-wise operation uses (compatible) enum's)*/
1325 break;
1326 case SHOW_WL:
1327 /*lint -e655 (Warning -- bit-wise operation uses (compatible) enum's)*/
1328 srv_trace_white_list ();
1329 /*lint +e655 (Warning -- bit-wise operation uses (compatible) enum's)*/
1330 break;
1331 case SET_WL:
1332 if(valno < 2)
1333 {
1334 TRACE_ERROR("[PEI_CONFIG]: wrong Number of Parameters");
1335 }
1336 else
1337 {
1338 UBYTE c_region;
1339 USHORT c_arfcn;
1340 UBYTE i;
1341
1342 if(valno > 6)
1343 valno = 6; /* 1 to 5 ARFCNs can be configured at a time */
1344
1345 c_region = atoi(val[0]);
1346 if(cs_check_region(c_region))
1347 {
1348 rr_data->cs_data.white_list.region = c_region;
1349
1350 for(i=1;i<valno;i++)
1351 {
1352 c_arfcn = atoi(val[i]);
1353 if(cs_check_arfcn_range(c_arfcn))
1354 {
1355 srv_set_channel(&rr_data->cs_data.white_list.list,c_arfcn);
1356 TRACE_EVENT_P1("Arfcn:%d -> WL", c_arfcn);
1357 } /* arfcn */
1358 } /* for */
1359 } /* region */
1360 } /* valno */
1361 break;
1362
1363 case SET_BL:
1364 if(valno < 2)
1365 {
1366 TRACE_ERROR("[PEI_CONFIG]: wrong Number of Parameters");
1367 }
1368 else
1369 {
1370 UBYTE c_region;
1371 USHORT c_arfcn;
1372 UBYTE i;
1373
1374 if(valno > 6)
1375 valno = 6; /* 1 to 5 ARFCNs can be configured at a time */
1376
1377 c_region = atoi(val[0]);
1378 if(cs_check_region(c_region))
1379 {
1380 for(i=1;i<valno;i++)
1381 {
1382 c_arfcn = atoi(val[i]);
1383 if(cs_check_arfcn_range(c_arfcn))
1384 {
1385 srv_set_channel(&rr_data->cs_data.black_list.list[c_region],c_arfcn);
1386 TRACE_EVENT_P1("Arfcn:%d -> BL", c_arfcn);
1387 } /* arfcn */
1388 } /* for */
1389 } /* region */
1390 } /* valno */
1391 break;
1392 case SET_WL_REGION:
1393 if(valno)
1394 {
1395 if(cs_check_region((U8)atoi (val[0])))
1396 rr_data->cs_data.white_list.region = atoi (val[0]);
1397 }
1398 else
1399 {
1400 TRACE_ERROR ("[PEI_CONFIG]: wrong Number of Parameters");
1401 }
1402 break;
1403 case SET_WL_PLMN:
1404 if(valno < 2)
1405 {
1406 TRACE_ERROR("[PEI_CONFIG]: wrong Number of Parameters");
1407 }
1408 else
1409 {
1410 SHORT plmn = atoi (val[0]);
1411 /* copy MCC */
1412 rr_data->cs_data.white_list.last_sc_lac.mcc[0] = (plmn/100);
1413 rr_data->cs_data.white_list.last_sc_lac.mcc[1] = (plmn/10)%10;
1414 rr_data->cs_data.white_list.last_sc_lac.mcc[2] = (plmn % 10);
1415
1416 /* Copy MNC */
1417 plmn = atoi (val[1]);
1418 rr_data->cs_data.white_list.last_sc_lac.mnc[0] = (plmn/100);
1419 rr_data->cs_data.white_list.last_sc_lac.mnc[1] = (plmn/10)%10;
1420 rr_data->cs_data.white_list.last_sc_lac.mnc[2] = (plmn % 10);
1421
1422 if(!rr_data->cs_data.white_list.last_sc_lac.mnc[2])
1423 rr_data->cs_data.white_list.last_sc_lac.mnc[2] = 0x0f;
1424
1425 TRACE_EVENT_P6( "[PEI_CONFIG]SET_WL_PLMN MCC/MNC r=%x%x%x/%x%x%x",
1426 rr_data->cs_data.white_list.last_sc_lac.mcc[0],
1427 rr_data->cs_data.white_list.last_sc_lac.mcc[1],
1428 rr_data->cs_data.white_list.last_sc_lac.mcc[2],
1429 rr_data->cs_data.white_list.last_sc_lac.mnc[0],
1430 rr_data->cs_data.white_list.last_sc_lac.mnc[1],
1431 rr_data->cs_data.white_list.last_sc_lac.mnc[2]);
1432 }
1433 break;
1434 case SET_NPS_DELAY:
1435 if(valno)
1436 {
1437 rr_data->dyn_config.lim_ser_nps_delay = atoi (val[0]);
1438 }
1439 else
1440 {
1441 TRACE_ERROR ("[PEI_CONFIG]: wrong Number of Parameters");
1442 }
1443 break;
1444 default:
1445 break;
1446 }
1447
1448 #ifdef OPTION_TIMER
1449 /*
1450 * If timer manipulation
1451 */
1452
1453 if (t_man)
1454 {
1455 t_man = FALSE;
1456 if (t_num >= 0 AND t_num < MAX_RR_TIMER)
1457 ; /* vsi_t_config is removed in latest GPF */
1458 else
1459 {
1460 TRACE_ERROR ("[PEI_CONFIG]: Parameter out of Range");
1461 }
1462 }
1463 #endif
1464 }
1465 } /*!defined (NCONFIG)*/
1466 #endif /*!defined (NCONFIG)*/
1467
1468 return PEI_OK;
1469 }
1470 #endif /* NCONFIG */
1471 /*
1472 +--------------------------------------------------------------------+
1473 | PROJECT : GSM-PS (6147) MODULE : RR_PEI |
1474 | STATE : code ROUTINE : rr_pei_config |
1475 +--------------------------------------------------------------------+
1476
1477 PURPOSE : Dynamic Configuration
1478
1479 */
1480 /*lint -esym(714,rr_pei_config) | Symbol not referenced | used by Frame */
1481 /*lint -esym(765,rr_pei_config) | external could be made static | used by Frame */
1482 /* Implements Measure#36 */
1483 #if defined(NCONFIG)
1484 #else /* NCONFIG */
1485 GLOBAL SHORT rr_pei_config ( char * inString, char * dummy )
1486 {
1487 pei_config ( inString );
1488
1489 return PEI_OK;
1490 }
1491 #endif /* NCONFIG */
1492
1493
1494 /*
1495 +--------------------------------------------------------------------+
1496 | PROJECT : GSM-PS (6147) MODULE : RR_PEI |
1497 | STATE : code ROUTINE : pei_create |
1498 +--------------------------------------------------------------------+
1499
1500 PURPOSE : Create the Protocol Stack Entity
1501
1502 */
1503 /*lint -esym(714,rr_pei_create) | Symbol not referenced | used by Frame */
1504 /*lint -esym(765,rr_pei_create) | external could be made static | used by Frame */
1505 GLOBAL SHORT rr_pei_create (T_PEI_INFO **info)
1506 {
1507 static const T_PEI_INFO pei_info =
1508 {
1509 "RR",
1510 {
1511 pei_init,
1512 #ifdef _SIMULATION_
1513 pei_exit,
1514 #else
1515 NULL,
1516 #endif
1517 pei_primitive,
1518 pei_timeout,
1519 NULL, /* no signal function */
1520 NULL, /* no run function */
1521 /* Implements Measure#36 */
1522 #if defined(NCONFIG)
1523 NULL, /* no pei_config function */
1524 #else /* NCONFIG */
1525 pei_config,
1526 #endif /* NCONFIG */
1527 NULL,
1528 },
1529 #ifdef GPRS
1530 1736, /* Stack Size */
1531 #else
1532 1936, /* Stack Size increase from 1436 to 1936 2007/5/31 */
1533 #endif
1534 10, /* Queue Entries */
1535 205, /* Priority */
1536 NUM_OF_RR_TIMERS, /* number of timer */
1537 /* flags */
1538 #ifdef _TARGET_
1539 #ifdef GPRS
1540 PASSIVE_BODY|COPY_BY_REF|TRC_NO_SUSPEND|PRIM_NO_SUSPEND
1541 #else
1542 PASSIVE_BODY|COPY_BY_REF|TRC_NO_SUSPEND|PRIM_NO_SUSPEND
1543 #endif
1544 #else
1545 PASSIVE_BODY|COPY_BY_REF
1546 #endif
1547 };
1548
1549 TRACE_FUNCTION ("pei_create()");
1550
1551 /*
1552 * Close Resources if open
1553 */
1554
1555 #ifdef _SIMULATION_
1556 if (first_access)
1557 first_access = FALSE;
1558 else
1559 pei_exit ();
1560 #endif
1561
1562 /*
1563 * Export startup configuration data
1564 */
1565
1566 *info = (T_PEI_INFO *)&pei_info;
1567
1568 return PEI_OK;
1569 }
1570 #endif