FreeCalypso > hg > fc-magnetite
comparison src/g23m-gprs/gmm/gmm_syncp.c @ 183:219afcfc6250
src/g23m-gprs: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Oct 2016 04:24:13 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
182:f02d0a0e1849 | 183:219afcfc6250 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : GPRS (8441) | |
4 | Modul : gmm_syncp.c | |
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 : | |
18 +----------------------------------------------------------------------------- | |
19 */ | |
20 | |
21 #ifndef GMM_SYNCP_C | |
22 #define GMM_SYNCP_C | |
23 #endif | |
24 | |
25 #define ENTITY_GMM | |
26 | |
27 /*==== INCLUDES =============================================================*/ | |
28 | |
29 #include "typedefs.h" /* to get Condat data types */ | |
30 #include "vsi.h" /* to get a lot of macros */ | |
31 #include "macdef.h" | |
32 #include "gprs.h" | |
33 #include "gsm.h" /* to get a lot of macros */ | |
34 #include "ccdapi.h" /* to get CCD API */ | |
35 #include "cnf_gmm.h" /* to get cnf-definitions */ | |
36 #include "mon_gmm.h" /* to get mon-definitions */ | |
37 #include "prim.h" /* to get the definitions of used SAP and directions */ | |
38 #include "gmm.h" /* to get the global entity definitions */ | |
39 #include "gmm_f.h" /* to get the gdebug print function */ | |
40 | |
41 #include "gmm_kerns.h" /* to get signals */ | |
42 #include "gmm_syncf.h" | |
43 | |
44 | |
45 /* | |
46 +------------------------------------------------------------------------------ | |
47 | Function : sync_tsync | |
48 +------------------------------------------------------------------------------ | |
49 | Description : Handles expiry of timer TSYNC. This function is called from | |
50 | pei_primitive(). | |
51 | Timeout for waiting of GMMRR_CELL_IND or MMGMM_ACTIVATE_IND | |
52 | or MMGMM_NREG_IND | |
53 | Parameters : none | |
54 | | |
55 +------------------------------------------------------------------------------ | |
56 */ | |
57 GLOBAL void sync_tsync (void) | |
58 { | |
59 GMM_TRACE_FUNCTION( "sync_tsync" ); | |
60 TRACE_0_INFO("TIMEOUT TSYNC expired"); | |
61 | |
62 switch( GET_STATE( SYNC ) ) | |
63 { | |
64 case SYNC_WAIT_FOR_GPRS: | |
65 SET_STATE ( SYNC, SYNC_IDLE ); | |
66 sync_send_mm_cell_info(); | |
67 break; | |
68 case SYNC_WAIT_FOR_GSM: | |
69 SET_STATE ( SYNC, SYNC_IDLE ); | |
70 sync_send_cell_info(); | |
71 break; | |
72 case SYNC_IDLE: | |
73 default: | |
74 TRACE_ERROR("TSYNC expired in wrong state"); | |
75 sync_send_cell_info(); | |
76 break; | |
77 } | |
78 GMM_RETURN; | |
79 } /* sync_tsync */ | |
80 | |
81 /* | |
82 +------------------------------------------------------------------------------ | |
83 | Function : sync_gmmrr_cell_ind | |
84 +------------------------------------------------------------------------------ | |
85 | Description : Handles the primitive GMMRR_CELL_IND | |
86 | | |
87 | Parameters : *gmmrr_cell_ind - Ptr to primitive payload | |
88 | | |
89 +------------------------------------------------------------------------------ | |
90 */ | |
91 GLOBAL void sync_gmmrr_cell_ind (T_GMMRR_CELL_IND * gmmrr_cell_ind) | |
92 { | |
93 | |
94 #ifdef REL99 | |
95 /*The flag value is initialized to 0(CL_SGSN_REL_98_OR_OLDER). */ | |
96 U8 temp_sgsnr_flag = PS_SGSN_98_OLDER; /* TCS 4.0 */ | |
97 #endif | |
98 | |
99 GMM_TRACE_FUNCTION( "sync_gmmrr_cell_ind" ); | |
100 #ifdef GMM_TCS4 | |
101 TRACE_12_PARA("%s, %s,%x%x%x, %x%x%x, NMO: %d, lac %x, rac %x, cid %x", /* TCS 4.0 */ | |
102 (RT_GPRS==gmmrr_cell_ind->cell_info.rt?"GPRS":"EDGE"), /* TCS 4.0 */ | |
103 GMMRR_SERVICE_FULL == gmmrr_cell_ind->cell_info.service_state?"service":(GMMRR_SERVICE_LIMITED== gmmrr_cell_ind->cell_info.service_state?"limited service":"NO GPRS service"), | |
104 gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mcc[0], | |
105 gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mcc[1], | |
106 gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mcc[2], | |
107 gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mnc[0], | |
108 gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mnc[1], | |
109 gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mnc[2], | |
110 gmmrr_cell_ind->cell_info.net_mode+1, | |
111 gmmrr_cell_ind->cell_info.cell_env.rai.lac, | |
112 gmmrr_cell_ind->cell_info.cell_env.rai.rac, | |
113 gmmrr_cell_ind->cell_info.cell_env.cid); | |
114 #else | |
115 TRACE_11_PARA("%s,%x%x%x, %x%x%x, NMO: %d, lac %x, rac %x, cid %x", | |
116 GMMRR_SERVICE_FULL == gmmrr_cell_ind->cell_info.service_state?"service":(GMMRR_SERVICE_LIMITED== gmmrr_cell_ind->cell_info.service_state?"limited service":"NO GPRS service"), | |
117 gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mcc[0], | |
118 gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mcc[1], | |
119 gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mcc[2], | |
120 gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mnc[0], | |
121 gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mnc[1], | |
122 gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mnc[2], | |
123 gmmrr_cell_ind->cell_info.net_mode+1, | |
124 gmmrr_cell_ind->cell_info.cell_env.rai.lac, | |
125 gmmrr_cell_ind->cell_info.cell_env.rai.rac, | |
126 gmmrr_cell_ind->cell_info.cell_env.cid); | |
127 #endif | |
128 | |
129 #ifdef REL99 | |
130 /* During initialiazation sgsnr_flag should be initialized to | |
131 * the value 0 (CL_SGSN_REL_98_OR_OLDER) | |
132 */ | |
133 /* The function getSGSNRelease is implemented by RR layer. It | |
134 * returns the current SGSN release flag - CL_SGSN_REL_98_OR_OLDER | |
135 * or CL_SGSN_REL_99_ONWARDS | |
136 */ | |
137 | |
138 temp_sgsnr_flag = cl_nwrl_get_sgsn_release(); /* TCS 4.0 */ | |
139 TRACE_1_OUT_PARA ("SGSNR_FLAG is >>>>: %x", temp_sgsnr_flag); /* TCS 4.0 */ | |
140 /* CL can return three values. SGSN release can be R98, | |
141 * R99 or unknown. In case of SGSN release unknown | |
142 * we assume the value R98 and proceed. | |
143 */ | |
144 if(PS_SGSN_99_ONWARDS != temp_sgsnr_flag) | |
145 { | |
146 temp_sgsnr_flag = PS_SGSN_98_OLDER; | |
147 } | |
148 | |
149 /*Store the flag in context*/ | |
150 gmm_data->sync.sig_cell_info.sgsnr_flag = temp_sgsnr_flag; /* TCS 4.0 */ | |
151 #endif | |
152 | |
153 gmm_data->sync.grr_cell_info = gmmrr_cell_ind->cell_info; | |
154 PFREE (gmmrr_cell_ind); | |
155 | |
156 GMM_TRACE_GMM_DATA(GMM_DEBUG_PRINT_MASK_CID); | |
157 | |
158 gmm_data->sync.mm_cell_info.gprs_indicator=MMGMM_GPRS_SUPP_YES; | |
159 gmm_data->sync.sig_cell_info.gmmrr_cell_ind_received = TRUE; | |
160 | |
161 switch( GET_STATE( SYNC ) ) | |
162 { | |
163 | |
164 case SYNC_IDLE: | |
165 /* | |
166 * | |
167 */ | |
168 if ( sync_is_cid_equal () ) | |
169 { | |
170 /* | |
171 * CELL IND in response to RESUME REQ | |
172 */ | |
173 sync_send_cell_info(); | |
174 } | |
175 else | |
176 { | |
177 /* | |
178 * Cell Info does not match, synchronize with ACTIVATE IND | |
179 */ | |
180 SET_STATE ( SYNC, SYNC_WAIT_FOR_GSM ); | |
181 /* | |
182 * Timer Supervision | |
183 */ | |
184 TRACE_EVENT ( "Info: START: TSYNC" ); | |
185 vsi_t_start ( GMM_handle , sync_TSYNC, TSYNC ); | |
186 } | |
187 break; | |
188 | |
189 case SYNC_WAIT_FOR_GPRS: | |
190 /* | |
191 * Stop Timer ACTIVATE SYNC | |
192 */ | |
193 TRACE_EVENT ( "Info: STOP: TSYNC" ); | |
194 vsi_t_stop ( GMM_handle, sync_TSYNC); | |
195 | |
196 if ( sync_is_cid_equal() ) | |
197 { | |
198 /* | |
199 * As expected | |
200 */ | |
201 SET_STATE ( SYNC, SYNC_IDLE ); | |
202 sync_send_cell_info(); | |
203 } | |
204 else | |
205 { | |
206 /* | |
207 * Cell Info does not match, wait for ACTIVATE IND | |
208 */ | |
209 SET_STATE ( SYNC, SYNC_WAIT_FOR_GSM ); | |
210 /* | |
211 * Timer Supervision | |
212 */ | |
213 TRACE_EVENT ( "Info: START: TSYNC" ); | |
214 vsi_t_start ( GMM_handle , sync_TSYNC, TSYNC ); | |
215 } | |
216 break; | |
217 case SYNC_WAIT_FOR_GSM: | |
218 /* | |
219 * CELL IND again? Should not happen; timer runs already... | |
220 */ | |
221 TRACE_ERROR (" CELL_IND repeatedly received "); | |
222 break; | |
223 | |
224 default: | |
225 TRACE_ERROR ("GMMRR_CELL_IND wrong SYNC state"); | |
226 break; | |
227 } | |
228 GMM_RETURN; | |
229 } /* sync_gmmrr_cell_ind */ | |
230 | |
231 /* | |
232 +------------------------------------------------------------------------------ | |
233 | Function : sync_mmgmm_activate_ind | |
234 +------------------------------------------------------------------------------ | |
235 | Description : Handles the primitive MMGMM_ACTIVATE_IND | |
236 | | |
237 | Parameters : *mmgmm_activate_ind - Ptr to primitive payload | |
238 | | |
239 +------------------------------------------------------------------------------ | |
240 */ | |
241 GLOBAL void sync_mmgmm_activate_ind (T_MMGMM_ACTIVATE_IND *mmgmm_activate_ind) | |
242 { | |
243 GMM_TRACE_FUNCTION( "sync_mmgmm_activate_ind" ); | |
244 | |
245 #ifndef NTRACE | |
246 switch (mmgmm_activate_ind->gprs_indicator) | |
247 { | |
248 case MMGMM_GPRS_SUPP_NO: | |
249 TRACE_EVENT("IPar: NO GPRS Service!"); | |
250 break; | |
251 case MMGMM_GPRS_SUPP_YES: | |
252 TRACE_EVENT("IPar: cell supports GPRS"); | |
253 break; | |
254 default: | |
255 TRACE_ERROR("indicator is out of range"); | |
256 break; | |
257 } | |
258 | |
259 switch (mmgmm_activate_ind->status) | |
260 { | |
261 case MMGMM_LIMITED_SERVICE: | |
262 | |
263 TRACE_EVENT("IPar: limited service"); | |
264 break; | |
265 case MMGMM_FULL_SERVICE: | |
266 TRACE_EVENT("IPar: full service"); | |
267 break; | |
268 case MMGMM_CELL_SELECTED: | |
269 TRACE_EVENT("IPar: cell changed"); | |
270 break; | |
271 case MMGMM_WAIT_FOR_UPDATE: | |
272 TRACE_EVENT("IPar: LUP REQ from MM"); | |
273 break; | |
274 default: | |
275 TRACE_ERROR("unknown MM status"); | |
276 } | |
277 #endif | |
278 | |
279 gmm_data->sync.mm_cell_info.cid = mmgmm_activate_ind->cid; | |
280 gmm_data->sync.mm_cell_info.gprs_indicator = mmgmm_activate_ind->gprs_indicator; | |
281 gmm_data->sync.mm_cell_info.lac = mmgmm_activate_ind->lac; | |
282 gmm_data->sync.mm_cell_info.plmn = mmgmm_activate_ind->plmn; | |
283 gmm_data->sync.mm_cell_info.status = mmgmm_activate_ind->status; | |
284 gmm_data->sync.sig_cell_info.mm_status = gmm_data->sync.mm_cell_info.status; | |
285 gmm_data->sync.mm_cell_info.t3212_val = mmgmm_activate_ind->t3212_val; | |
286 PFREE (mmgmm_activate_ind); | |
287 | |
288 GMM_TRACE_GMM_DATA(GMM_DEBUG_PRINT_MASK_CID); | |
289 | |
290 switch( GET_STATE( SYNC ) ) | |
291 { | |
292 case SYNC_IDLE: | |
293 | |
294 if (sync_is_cid_equal()) | |
295 { | |
296 /* | |
297 * signal cell info | |
298 */ | |
299 sync_send_cell_info(); | |
300 } | |
301 else | |
302 { | |
303 /* | |
304 * synchronize with CELL IND | |
305 */ | |
306 SET_STATE ( SYNC, SYNC_WAIT_FOR_GPRS ); | |
307 /* | |
308 * Timer Supervision | |
309 */ | |
310 TRACE_EVENT ( "Info: START: TSYNC" ); | |
311 vsi_t_start ( GMM_handle , sync_TSYNC, TSYNC ); | |
312 } | |
313 break; | |
314 | |
315 case SYNC_WAIT_FOR_GSM: | |
316 /* | |
317 * Stop Timer CELL SYNC | |
318 */ | |
319 TRACE_EVENT ( "Info: STOP: TSYNC" ); | |
320 vsi_t_stop ( GMM_handle, sync_TSYNC); | |
321 | |
322 if (sync_is_cid_equal()) | |
323 { | |
324 /* | |
325 * As expected | |
326 */ | |
327 SET_STATE ( SYNC, SYNC_IDLE ); | |
328 sync_send_cell_info(); | |
329 } | |
330 else | |
331 { | |
332 /* | |
333 * Cell Info does not match, wait for CELL IND | |
334 */ | |
335 SET_STATE ( SYNC, SYNC_WAIT_FOR_GPRS ); | |
336 /* | |
337 * Timer Supervision | |
338 */ | |
339 TRACE_EVENT ( "Info: START: TSYNC" ); | |
340 vsi_t_start ( GMM_handle , sync_TSYNC, TSYNC ); | |
341 } | |
342 break; | |
343 | |
344 case SYNC_WAIT_FOR_GPRS: | |
345 /* | |
346 * Again, should not happen! Timer runs already.. | |
347 */ | |
348 TRACE_ERROR (" ACTIVATE_IND repeatedly received "); | |
349 break; | |
350 | |
351 default: | |
352 TRACE_ERROR ("MMGMM_ACTIVATE_IND wrong SYNC state"); | |
353 break; | |
354 } | |
355 GMM_RETURN; | |
356 } /* sync_mmgmm_activate_ind */ | |
357 | |
358 /* | |
359 +------------------------------------------------------------------------------ | |
360 | Function : sync_mmgmm_nreg_ind | |
361 +------------------------------------------------------------------------------ | |
362 | Description : Handles the primitive MMGMM_NREG_IND | |
363 | | |
364 | Parameters : *mmgmm_nreg_ind - Ptr to primitive payload | |
365 | | |
366 +------------------------------------------------------------------------------ | |
367 */ | |
368 GLOBAL void sync_mmgmm_nreg_ind (T_MMGMM_NREG_IND *mmgmm_nreg_ind) | |
369 { | |
370 GMM_TRACE_FUNCTION( "sync_mmgmm_nreg_ind" ); | |
371 | |
372 switch( GET_STATE( SYNC ) ) | |
373 { | |
374 | |
375 case SYNC_WAIT_FOR_GSM: | |
376 /* | |
377 * NREG IND received while waiting for ACTIVATE IND | |
378 */ | |
379 TRACE_EVENT ( "Info: STOP: TSYNC" ); | |
380 vsi_t_stop ( GMM_handle , sync_TSYNC); | |
381 /* | |
382 * handle as if ACTIVATE IND received | |
383 */ | |
384 SET_STATE ( SYNC, SYNC_IDLE ); | |
385 /* | |
386 * | |
387 */ | |
388 switch (mmgmm_nreg_ind->service) /* TCS 2.1 */ | |
389 { | |
390 case NREG_NO_SERVICE: /* TCS 2.1 */ | |
391 gmm_data->sync.mm_cell_info.lac = GMMRR_LA_INVALID; | |
392 gmm_data->sync.mm_cell_info.status = MMGMM_LIMITED_SERVICE; | |
393 gmm_data->sync.mm_cell_info.gprs_indicator=MMGMM_GPRS_SUPP_NO; | |
394 break; | |
395 case NREG_LIMITED_SERVICE: | |
396 gmm_data->sync.mm_cell_info.status = MMGMM_LIMITED_SERVICE; | |
397 /* TCS 2.1 */ | |
398 /* TCS 2.1 */ | |
399 break; | |
400 default: | |
401 break; | |
402 } | |
403 /* | |
404 * SIGNAL CELL INFO | |
405 */ | |
406 sync_send_cell_info(); | |
407 /* | |
408 * SIGNAL NREG IND | |
409 */ | |
410 sig_sync_kern_mmgmm_nreg_ind(mmgmm_nreg_ind); | |
411 break; | |
412 | |
413 case SYNC_IDLE: | |
414 /* | |
415 * safe information: no or limited service | |
416 */ | |
417 switch (mmgmm_nreg_ind->service) /* TCS 2.1 */ | |
418 { | |
419 case NREG_NO_SERVICE: /* TCS 2.1 */ | |
420 gmm_data->sync.mm_cell_info.lac = GMMRR_LA_INVALID; | |
421 gmm_data->sync.mm_cell_info.status = MMGMM_LIMITED_SERVICE; | |
422 gmm_data->sync.mm_cell_info.gprs_indicator=MMGMM_GPRS_SUPP_NO; | |
423 break; | |
424 case NREG_LIMITED_SERVICE: | |
425 gmm_data->sync.mm_cell_info.status = MMGMM_LIMITED_SERVICE; | |
426 /* TCS 2.1 */ | |
427 /* TCS 2.1 */ | |
428 break; | |
429 default: | |
430 break; | |
431 } | |
432 /* | |
433 * synchronize | |
434 */ | |
435 if (sync_is_cid_equal()) | |
436 { | |
437 /* | |
438 * signal cell info | |
439 */ | |
440 sync_send_cell_info(); | |
441 } | |
442 else | |
443 { | |
444 /* | |
445 * synchronize with CELL IND | |
446 */ | |
447 SET_STATE ( SYNC, SYNC_WAIT_FOR_GPRS ); | |
448 /* | |
449 * Timer Supervision | |
450 */ | |
451 TRACE_EVENT ( "Info: START: TSYNC" ); | |
452 vsi_t_start ( GMM_handle , sync_TSYNC, TSYNC ); | |
453 } | |
454 /* | |
455 * handle nreg ind | |
456 */ | |
457 sig_sync_kern_mmgmm_nreg_ind(mmgmm_nreg_ind); | |
458 | |
459 break; | |
460 | |
461 case SYNC_WAIT_FOR_GPRS: | |
462 | |
463 TRACE_EVENT ( "Info: STOP: TSYNC" ); | |
464 vsi_t_stop ( GMM_handle , sync_TSYNC); | |
465 | |
466 SET_STATE ( SYNC, SYNC_IDLE); | |
467 | |
468 switch (mmgmm_nreg_ind->service) /* TCS 2.1 */ | |
469 { | |
470 case NREG_NO_SERVICE: /* TCS 2.1 */ | |
471 gmm_data->sync.mm_cell_info.lac = GMMRR_LA_INVALID; | |
472 gmm_data->sync.mm_cell_info.status = MMGMM_LIMITED_SERVICE; | |
473 gmm_data->sync.mm_cell_info.gprs_indicator=MMGMM_GPRS_SUPP_NO; | |
474 break; | |
475 case NREG_LIMITED_SERVICE: | |
476 gmm_data->sync.mm_cell_info.status = MMGMM_LIMITED_SERVICE; | |
477 /* TCS 2.1 */ | |
478 /* TCS 2.1 */ | |
479 break; | |
480 default: | |
481 break; | |
482 } | |
483 | |
484 sig_sync_kern_mmgmm_nreg_ind(mmgmm_nreg_ind); | |
485 break; | |
486 default: | |
487 TRACE_ERROR ("MMGMM_NREG_IND unexpected"); | |
488 PFREE(mmgmm_nreg_ind); | |
489 break; | |
490 } | |
491 GMM_RETURN; | |
492 } /* sync_mmgmm_nreg_ind */ | |
493 /* | |
494 +------------------------------------------------------------------------------ | |
495 | Function : sync_mmgmm_reg_rej | |
496 +------------------------------------------------------------------------------ | |
497 | Description : Handles the primitive MMGMM_REG_REJ | |
498 | | |
499 | Parameters : *mmgmm_nreg_ind - Ptr to primitive payload | |
500 | | |
501 +------------------------------------------------------------------------------ | |
502 */ | |
503 GLOBAL void sync_mmgmm_reg_rej (T_MMGMM_REG_REJ *mmgmm_reg_rej) | |
504 { | |
505 GMM_TRACE_FUNCTION( "sync_mmgmm_reg_rej" ); | |
506 | |
507 switch( GET_STATE( SYNC ) ) | |
508 { | |
509 case SYNC_IDLE: | |
510 case SYNC_WAIT_FOR_GSM: | |
511 case SYNC_WAIT_FOR_GPRS: | |
512 gmm_data->sync.mm_cell_info.status = MMGMM_LIMITED_SERVICE; | |
513 switch (mmgmm_reg_rej->service) /* TCS 2.1 */ | |
514 { | |
515 case NREG_NO_SERVICE: /* TCS 2.1 */ | |
516 gmm_data->sync.mm_cell_info.lac = GMMRR_LA_INVALID; | |
517 break; | |
518 case NREG_LIMITED_SERVICE: | |
519 /* TCS 2.1 */ | |
520 break; | |
521 default: | |
522 break; | |
523 } | |
524 sig_sync_kern_mmgmm_reg_rej(mmgmm_reg_rej); | |
525 break; | |
526 default: | |
527 TRACE_ERROR ("MMGMM_REG_REJ unexpected"); | |
528 break; | |
529 } | |
530 GMM_RETURN; | |
531 } /* sync_mmgmm_reg_rej */ | |
532 | |
533 /* | |
534 +------------------------------------------------------------------------------ | |
535 | Function : sync_mmgmm_reg_cnf | |
536 +------------------------------------------------------------------------------ | |
537 | Description : Handles the primitive MMGMM_REG_CNF | |
538 | | |
539 | Parameters : *mmgmm_reg_cnf - Ptr to primitive payload | |
540 | | |
541 +------------------------------------------------------------------------------ | |
542 */ | |
543 GLOBAL void sync_mmgmm_reg_cnf (T_MMGMM_REG_CNF *mmgmm_reg_cnf) | |
544 { | |
545 GMM_TRACE_FUNCTION( "sync_mmgmm_reg_cnf" ); | |
546 | |
547 switch( GET_STATE( SYNC ) ) | |
548 { | |
549 | |
550 case SYNC_IDLE: | |
551 case SYNC_WAIT_FOR_GSM: | |
552 case SYNC_WAIT_FOR_GPRS: | |
553 | |
554 /* Changes for Boot Time Speedup. GMM will get MMGMM_REG_CNF with | |
555 * bootup_cause = PWR_SCAN_START. | |
556 * No need to process this as it is response to dummy request. | |
557 * GMM need to send GMMREG_ATTACH_CNF indicating PWR_SCAN_START | |
558 */ | |
559 if (mmgmm_reg_cnf->bootup_cause EQ PWR_SCAN_START) | |
560 { | |
561 PALLOC ( gmmreg_attach_cnf, GMMREG_ATTACH_CNF ); | |
562 gmmreg_attach_cnf->attach_type = VAL_ATTACH_TYPE___DEF; | |
563 gmmreg_attach_cnf->plmn = mmgmm_reg_cnf->plmn; | |
564 gmmreg_attach_cnf->search_running = SEARCH_RUNNING; | |
565 gmmreg_attach_cnf->lac = mmgmm_reg_cnf->lac; | |
566 gmmreg_attach_cnf->rac = gmm_data->kern.sig_cell_info.env.rai.rac; | |
567 gmmreg_attach_cnf->cid = mmgmm_reg_cnf->cid; // #HM# | |
568 gmmreg_attach_cnf->gprs_indicator = gmm_data->kern.sig_cell_info.gmm_status; | |
569 gmmreg_attach_cnf->bootup_cause = PWR_SCAN_START; | |
570 #ifdef GMM_TCS4 | |
571 gmmreg_attach_cnf->rt = gmm_data->kern.sig_cell_info.rt; // TCS 4.0 | |
572 #endif | |
573 PSEND ( hCommMMI, gmmreg_attach_cnf ); | |
574 return; | |
575 } | |
576 gmm_data->sync.mm_cell_info.status = MMGMM_FULL_SERVICE; | |
577 sig_sync_kern_mmgmm_reg_cnf(mmgmm_reg_cnf); | |
578 break; | |
579 | |
580 default: | |
581 TRACE_ERROR ("MMGMM_REG_CNF unexpected"); | |
582 break; | |
583 } | |
584 GMM_RETURN; | |
585 } /* sync_mmgmm_nreg_ind */ | |
586 |