FreeCalypso > hg > freecalypso-citrine
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 |