comparison src/aci2/alr/alr_gprs.c @ 3:93999a60b835

src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Sep 2016 00:29:36 +0000
parents
children
comparison
equal deleted inserted replaced
2:c41a534f33c6 3:93999a60b835
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-PS
4 | Modul : ALR_GPRS
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 implements the necessary funtionality
18 | for switching to and from GPRS mode and also
19 | the handling if determining if GPRS is supported
20 | by the cell.
21 +-----------------------------------------------------------------------------
22 */
23 #ifndef ALR_GPRS_C
24 #define ALR_GPRS_C
25
26
27 #define ENTITY_PL
28
29 /*==== INCLUDES ===================================================*/
30 #include <string.h>
31 #include <stdlib.h>
32 #include <ctype.h>
33 #include "typedefs.h"
34 #include "pconst.cdg"
35 #include "mconst.cdg"
36 #include "message.h"
37 #include "ccdapi.h"
38 #include "vsi.h"
39 #include "custom.h"
40 #include "gsm.h"
41 #include "prim.h"
42 #include "cnf_alr.h"
43 #include "mon_alr.h"
44 #include "pei.h"
45 #include "tok.h"
46 #include "pcm.h"
47 #include "alr_gprs.h"
48 #define TRACING
49 #include "alr.h"
50 #define TRACING
51
52 #define TRACING
53
54 #if defined (TRACING)
55 #define ALR_TRACE_GPRS(a) ALR_TRACE(a)
56 #else
57 #define ALR_TRACE_GPRS(a)
58 #endif
59
60 LOCAL BOOL gprs_read_si13 (UBYTE si13_position);
61 LOCAL void gprs_alr_nc_enter_ptm (void);
62 LOCAL void gprs_alr_tb_meas_ind (T_TB_MEAS_IND* report);
63
64 LOCAL const T_FUNC tb_table[] = {
65 MAK_FUNC_0( gprs_alr_tb_meas_ind, TB_MEAS_IND ) /* 0 */
66 };
67
68 #define ONLY_BCC 7
69 static UBYTE gprs_support = 0;
70
71 /*
72 +--------------------------------------------------------------------+
73 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
74 | STATE : code ROUTINE : gprs_alr_get_table |
75 +--------------------------------------------------------------------+
76
77 PURPOSE :
78
79 */
80 void gprs_alr_get_table(const T_FUNC **tab, USHORT *n)
81 {
82 *tab = tb_table;
83 *n = TAB_SIZE (tb_table);
84 }
85
86 /*
87 +--------------------------------------------------------------------+
88 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
89 | STATE : code ROUTINE : gprs_alr_mon_ctrl_req |
90 +--------------------------------------------------------------------+
91
92 PURPOSE :
93
94 */
95 /*
96 * required for TESTMODE A/B
97 */
98 EXTERN UBYTE grlc_test_mode_active(void);
99 void gprs_alr_mon_ctrl_req(T_MPH_MON_CTRL_REQ* ctrl_req)
100 {
101 ALR_TRACE_GPRS("mon_ctrl_req");
102
103 switch(GET_STATE(STATE_MA))
104 {
105 case MA_CELL_SELECTION:
106 switch(ctrl_req->action)
107 {
108 case START_MON_EBCCH:
109 if(ctrl_req->si_to_read EQ UPDATE_SI13)
110 {
111 PALLOC(req, MPHC_SCELL_EBCCH_REQ);
112 req->schedule_array_size = 1;
113 req->schedule_array[0].modulus = 8;
114 req->schedule_array[0].relative_position = 0;
115
116 ma_scell_ebcch_req(req);
117 }
118 break;
119 default:
120 break;
121 }
122 break;
123 case MA_CELL_RESELECTION:
124 switch(ctrl_req->action)
125 {
126 case START_MON_EBCCH:
127 /*for SI13 reading control*/
128 if(ctrl_req->si_to_read EQ UPDATE_SI13)
129 {
130 PALLOC(req, MPHC_SCELL_EBCCH_REQ);
131 req->schedule_array_size = 1;
132 req->schedule_array[0].modulus = 8;
133 req->schedule_array[0].relative_position = 0;
134
135 ma_scell_ebcch_req(req);
136 }
137 break;
138 default:
139 break;
140 }
141 break;
142 case MA_IDLE:
143 switch(ctrl_req->action)
144 {
145 case START_MON_EBCCH:
146 /*for SI13 reading control*/
147 if(ctrl_req->si_to_read EQ UPDATE_SI13)
148 {
149 PALLOC(req, MPHC_SCELL_EBCCH_REQ);
150 req->schedule_array_size = 1;
151 req->schedule_array[0].modulus = 8;
152 req->schedule_array[0].relative_position = 0;
153
154 ma_scell_ebcch_req(req);
155 }
156 break;
157 case START_MON_NBCCH:
158 {
159 USHORT si_mask = 0;
160 UBYTE tc = 0; /* refer to GSM Spec 05.02, clause 6.3.1.3 Mapping of BCCH data */
161 UBYTE i,k;
162
163 switch(ctrl_req->si_to_read)
164 {
165 case UPDATE_SI13:
166 gprs_read_si13(SI13_ON_NBCCH);
167 break;
168
169 case UPDATE_SI13_GSM:
170 {
171 PALLOC(scell_bcch_req, MPHC_SCELL_NBCCH_REQ);
172
173 scell_bcch_req->schedule_array_size = 1;
174 scell_bcch_req->schedule_array[0].modulus = 8;
175 scell_bcch_req->schedule_array[0].relative_position = 4;
176 ma_scell_nbcch_req(scell_bcch_req);
177 }
178 break;
179
180 case UNSPECIFIED_SI:
181 case COMPLETE_SI:
182 ma_clean_sys_buffer (IND_ALL_IDLE_SI);
183 ma_scell_full_nbcch();
184 break;
185
186 case UPDATE_SI1:
187 si_mask = IND_SI_1;
188 tc = (1<<0);
189 break;
190 case UPDATE_SI2_SI2BIS_OR_SI2TER:
191 si_mask = IND_SI_2 | IND_SI_2BIS | IND_SI_2TER;
192 tc = (1<<1) | (1<<4) | (1<<5);
193 break;
194 case UPDATE_SI3_SI4_SI7_OR_SI8:
195 si_mask = IND_SI_3 | IND_SI_4;
196 tc = (1<<2) | (1<<3) | (1<<6) | (1<<7);
197 break;
198 case UPDATE_SI9:
199 break;
200 }
201
202 if ( si_mask )
203 {
204 PALLOC(scell_bcch_req, MPHC_SCELL_NBCCH_REQ);
205 k = 0;
206 scell_bcch_req->schedule_array_size = k;
207 for ( i = 0; i < 8; i++ )
208 {
209 if ( (tc & (1 << i)) != 0 )
210 {
211 scell_bcch_req->schedule_array[k].modulus = 8;
212 scell_bcch_req->schedule_array[k].relative_position = i;
213 k++;
214 scell_bcch_req->schedule_array_size = k;
215 }
216 }
217 ma_clean_sys_buffer ( si_mask );
218 ma_scell_nbcch_req ( scell_bcch_req );
219 }
220 }
221 break;
222 case STOP_MON_CCCH:
223 /* PBCCH is present, stop all activities */
224 /*ma_stop_active_procs(STOP_PCH_READING | STOP_MEASUREMENTS);*/
225 pch_stop();
226 /*alr_data->gprs_data.pbcch = 1;*/
227 break;
228 case START_MON_CCCH:
229 if(alr_data->gprs_data.pbcch EQ TRUE)
230 {
231 pch_configure (NULL, PGM_NORMAL);
232 pch_save_pgm(PGM_NORMAL); /* reset saved pgm to REORG_CS */
233 pch_start_ccch_req();
234 }
235 break;
236
237 case LEAVING_PIM_PBCCH:
238 /* we are about to enter PAM or PTM */
239 if(alr_data->gprs_data.pbcch EQ TRUE)
240 {
241 TRACE_EVENT("leave pim");
242 alr_data->gprs_data.pim = FALSE;
243 pch_stop();
244 cb_stop();
245 nc_suspend();
246 }
247 else
248 {
249 TRACE_EVENT("huch pim");
250 }
251 break;
252 case LEAVING_PAM_PBCCH:
253 /* we are about to enter PTM or PIM */
254 if(alr_data->gprs_data.pbcch EQ TRUE)
255 {
256 /* do nothing, nothing should be active */
257 alr_data->gprs_data.pim = FALSE;
258 TRACE_EVENT("leave pam");
259 }
260 else
261 {
262 TRACE_EVENT("huch pam");
263 }
264 break;
265 case LEAVING_PTM_PBCCH:
266 /* we are about to enter PIM */
267 if(alr_data->gprs_data.pbcch EQ TRUE)
268 {
269 TRACE_EVENT("leave ptm");
270 alr_data->gprs_data.pim = FALSE;
271 pch_stop();
272 nc_suspend();
273 alr_data->gprs_data.ptm = FALSE;
274 }
275 else
276 {
277 TRACE_EVENT("huch ptm");
278 }
279 break;
280 case ENTER_PTM_PBCCH:
281 if(alr_data->gprs_data.pbcch EQ TRUE)
282 {
283 alr_data->gprs_data.ptm = TRUE;
284 alr_data->gprs_data.pim = FALSE;
285 nc_start_pbcch();
286 }
287 break;
288 case ENTER_PIM_PBCCH:
289 if(alr_data->gprs_data.pbcch EQ TRUE)
290 {
291 alr_data->gprs_data.pim = TRUE;
292 alr_data->gprs_data.ptm = FALSE;
293 nc_start_pbcch();
294 cb_start();
295 }
296 break;
297 case ENTER_PTM_BCCH:
298 /*
299 * convert counters and set NC process to IDLE
300 */
301 alr_data->gprs_data.pim = FALSE;
302 gprs_alr_nc_enter_ptm();
303 break;
304 default:
305 break;
306 }
307 break;
308 case MA_PTM:
309 switch(ctrl_req->action)
310 {
311 case START_MON_EBCCH:
312 /*for SI13 reading control*/
313 if(ctrl_req->si_to_read EQ UPDATE_SI13)
314 {
315 PALLOC(req, MPHC_SCELL_EBCCH_REQ);
316 req->schedule_array_size = 1;
317 req->schedule_array[0].modulus = 8;
318 req->schedule_array[0].relative_position = 0;
319
320 ma_scell_ebcch_req(req);
321 }
322 break;
323 case START_MON_NBCCH:
324 gprs_read_si13(SI13_ON_NBCCH);
325 break;
326 case START_MON_CCCH:
327 pch_configure (NULL, PGM_NORMAL);
328 if(alr_data->gprs_data.pbcch EQ TRUE)
329 pch_save_pgm(PGM_NORMAL); /* reset saved pgm to REORG_CS */
330 else
331 {
332 pch_save_pgm(PGM_REORG_CS); /* reset saved pgm to REORG_CS */
333 alr_data->pch_data.last_start_ccch_req.bs_pa_mfrms = NOT_PRESENT_8BIT;
334 }
335
336 pch_start_ccch_req();
337 break;
338 /*
339 * This case is necessary to stop ccch monitoring in MA_PTM
340 * This is required for Testmode A/B
341 */
342 case STOP_MON_CCCH:
343 if(grlc_test_mode_active())
344 {
345 ma_stop_active_procs(STOP_PCH_READING | STOP_MEASUREMENTS);
346 TRACE_EVENT("STOP_MON_CCCH: TESTMODE A/B is running !!!!");
347 }
348 break;
349 case ENTER_PTM_BCCH:
350 /*
351 * convert counters and set NC process to IDLE
352 */
353 gprs_alr_nc_enter_ptm();
354 break;
355 default:
356 break;
357 }
358 break;
359
360 case MA_CON_EST:
361 switch(ctrl_req->action)
362 {
363 case ENTER_PTM_BCCH:
364 /*
365 * convert counters and set NC process to IDLE
366 */
367 gprs_alr_nc_enter_ptm();
368 break;
369 default:
370 break;
371 }
372 break;
373 default:
374 break;
375 }
376 PFREE (ctrl_req);
377
378 }
379 /*
380 +--------------------------------------------------------------------+
381 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
382 | STATE : code ROUTINE : gprs_alr_check_packet_paging
383 +--------------------------------------------------------------------+
384
385 PURPOSE :
386
387 */
388
389 #define P1_REST_OCTET_LEN 5
390 #define GSM408_SPARE_PADDING 0x2b
391
392 /*lint -e749 (Info -- local enumeration constant not referenced) */
393 enum t_p1_ie { NLN = 0,
394 PRIO1,
395 PRIO2,
396 GRCI,
397 PPI1,
398 PPI2
399 };
400 /*lint +e749 (Info -- local enumeration constant not referenced) */
401
402 #define NEXT_BIT(bit_pos,byte_pos) if( (bit_pos >>=1) == 0 ) { bit_pos=0x80; byte_pos++;}
403
404 LOCAL enum t_p1_ie p1_ie;
405 LOCAL UBYTE element_size[PPI2+1] = {
406 3,
407 3,
408 3,
409 0,
410 1,
411 1
412 };
413
414
415
416 BOOL gprs_alr_check_packet_paging(UBYTE* frame, UBYTE which)
417 {
418 UBYTE byte_pos = 0;
419 UBYTE bit = 0x80;
420 UBYTE *frame_ptr = frame;
421
422 ALR_TRACE_GPRS("check packet paging");
423 /* point after Mobile Identity 1 */
424 frame = frame + 4 + frame[4] + 1;
425 /* check if Mobile Identity 2 is present */
426 if (frame[0] EQ 0x17)
427 /* skip Mobile Identity 2 */
428 /* rest octets = start of mob 2 + len of mob 2 + TL */
429 frame= frame + frame[1] + 2;
430
431 if( frame - frame_ptr >= MAX_L2_FRAME_SIZE )
432 return FALSE;
433
434 /* decode packet paging */
435 for(p1_ie = NLN; p1_ie < PPI2+1;p1_ie++)
436 {
437 if((frame[byte_pos] & bit) EQ
438 (GSM408_SPARE_PADDING & bit))
439 {
440 /* L:
441 * - element is not used
442 * - check next bit for next element
443 */
444 if(p1_ie NEQ (which+GRCI))
445 {
446 NEXT_BIT(bit,byte_pos);/*lint!e720 (Info -- Boolean test of assignment) */
447 }
448 else
449 {
450 ALR_TRACE_GPRS("no packet");
451 return FALSE;
452 }
453 }
454 else
455 {
456 /* H:
457 * - element is used
458 * - skip the bits used by this element
459 * except PPIx
460 */
461 ALR_TRACE_GPRS("element used");
462 if(p1_ie NEQ (which+GRCI))
463 {
464 UBYTE i;
465 for(i=element_size[p1_ie]+1; i > 0; i--)
466 {
467 NEXT_BIT(bit,byte_pos);/*lint!e720 (Info -- Boolean test of assignment) */
468 }
469 }
470 else
471 {
472 ALR_TRACE_GPRS("packet paging");
473 return TRUE;
474 }
475 }
476 }
477 return FALSE;
478 }
479
480 /*
481 +--------------------------------------------------------------------+
482 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
483 | STATE : code ROUTINE : gprs_alr_check_packet_paging_2
484 +--------------------------------------------------------------------+
485
486 PURPOSE :
487
488 */
489
490 /*lint -e749 (Info -- local enumeration constant not referenced) */
491 enum t_p2_ie {
492 p2CN3 = 0,
493 p2NLN,
494 p2PRIO1,
495 p2PRIO2,
496 p2PRIO3,
497 p2PPI3
498 };
499 /*lint -e749 (Info -- local enumeration constant not referenced) */
500
501 LOCAL enum t_p2_ie p2_ie;
502 LOCAL UBYTE p2_element_size[p2PPI3+1] = {
503 2,
504 3,
505 3,
506 3,
507 3,
508 1
509 };
510
511 BOOL gprs_alr_check_packet_paging_2(UBYTE* frame, UBYTE which)
512 {
513 UBYTE byte_pos = 0;
514 UBYTE bit = 0x80;
515
516 if(which NEQ 3) return FALSE;
517 ALR_TRACE_GPRS("check packet paging 2");
518 frame += frame[13]+14;
519 /* decode packet paging */
520 for(p2_ie = p2CN3; p2_ie < p2PPI3+1;p2_ie++)
521 {
522 if((frame[byte_pos] & bit) EQ
523 (GSM408_SPARE_PADDING & bit))
524 {
525 /* L:
526 * - element is not used
527 * - check next bit for next element
528 */
529 if(p2_ie NEQ p2PPI3)
530 {
531 NEXT_BIT(bit,byte_pos);/*lint!e720 (Info -- Boolean test of assignment) */
532 }
533 else
534 {
535 ALR_TRACE_GPRS("no packet");
536 return FALSE;
537 }
538 }
539 else
540 {
541 /* H:
542 * - element is used
543 * - skip the bits used by this element
544 * except PPIx
545 */
546 ALR_TRACE_GPRS("element used");
547 if(p2_ie NEQ p2PPI3)
548 {
549 UBYTE i;
550 for(i=p2_element_size[p2_ie]+1; i > 0; i--)
551 {
552 NEXT_BIT(bit,byte_pos);/*lint!e720 (Info -- Boolean test of assignment) */
553 }
554 }
555 else
556 {
557 ALR_TRACE_GPRS("packet paging");
558 return TRUE;
559 }
560 }
561 }
562 return FALSE;
563 }
564
565 /*
566 +--------------------------------------------------------------------+
567 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
568 | STATE : code ROUTINE : gprs_alr_store_ptmsi |
569 +--------------------------------------------------------------------+
570
571 PURPOSE :
572
573 */
574 void gprs_alr_store_ptmsi(UBYTE indic, ULONG tmsi)
575 {
576 alr_data->gprs_data.v_ptmsi = indic;
577 alr_data->gprs_data.ptmsi = tmsi;
578 TRACE_EVENT_P2("v: %d ptmsi: %x", indic, tmsi);
579 }
580
581 /*
582 +--------------------------------------------------------------------+
583 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
584 | STATE : code ROUTINE : gprs_alr_store_ptmsi |
585 +--------------------------------------------------------------------+
586
587 PURPOSE : Store the candidate PTMSI
588
589 */
590 void gprs_alr_store_ptmsi2(UBYTE indic2, ULONG tmsi2)
591 {
592 alr_data->gprs_data.v_ptmsi2 = indic2;
593 alr_data->gprs_data.ptmsi2 = tmsi2;
594 TRACE_EVENT_P2("v: %d ptmsi: %x", indic2, tmsi2);
595 }
596
597 /*
598 +--------------------------------------------------------------------+
599 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
600 | STATE : code ROUTINE : gprs_alr_check_ptmsi |
601 +--------------------------------------------------------------------+
602
603 PURPOSE :
604
605 */
606 BOOL gprs_alr_check_ptmsi(ULONG ptmsi_pag)
607 {
608
609 if((alr_data->gprs_data.v_ptmsi AND
610 alr_data->gprs_data.ptmsi EQ ptmsi_pag) OR
611 (alr_data->gprs_data.v_ptmsi2 AND
612 alr_data->gprs_data.ptmsi2 EQ ptmsi_pag))
613 {
614 ALR_TRACE_GPRS("ptmsi match");
615 ma_pch_paging_ind (ID_PTMSI, CN_PACKET);
616 return TRUE;
617 }
618
619 return FALSE;
620 }
621
622 /*
623 +--------------------------------------------------------------------+
624 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
625 | STATE : code ROUTINE : gprs_alr_check_downlink_assign
626 +--------------------------------------------------------------------+
627
628 PURPOSE :
629
630 */
631 void gprs_alr_check_downlink_assign(T_MPHC_DATA_IND* data_ind)
632 {
633 /* check dl bit */
634 if(data_ind->l2_frame.content[3] & 0x20) {
635 ma_send_unitdata (data_ind);
636 }
637 }
638
639 /*
640 +--------------------------------------------------------------------+
641 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
642 | STATE : code ROUTINE : gprs_read_si13 |
643 +--------------------------------------------------------------------+
644
645 PURPOSE :
646
647 */
648 BOOL gprs_check_read_si13_only(UBYTE si13_position)
649 {
650 if(gprs_support AND
651 si13_position EQ SI13_ON_NBCCH)
652 return FALSE;
653 else
654 return TRUE;
655 }
656
657 LOCAL BOOL gprs_read_si13(UBYTE si13_position)
658 {
659 ALR_TRACE_GPRS("read si13");
660
661 if(gprs_support AND
662 si13_position EQ SI13_ON_NBCCH)
663 {
664 PALLOC(scell_bcch_req, MPHC_SCELL_NBCCH_REQ);
665 /*
666 * we want to read SI13 on TC=4 which has to be send at least
667 * on every 4th consecutive occurence of TC=4
668 */
669 scell_bcch_req->schedule_array_size = 1;
670 scell_bcch_req->schedule_array[0].modulus = 8;
671 scell_bcch_req->schedule_array[0].relative_position = 4;
672 ma_scell_nbcch_req(scell_bcch_req);
673 return FALSE;
674 }
675 else return TRUE;
676 }
677
678 /*
679 +--------------------------------------------------------------------+
680 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
681 | STATE : code ROUTINE : gprs_stop |
682 +--------------------------------------------------------------------+
683
684 PURPOSE :
685
686 */
687 void gprs_alr_init(void)
688 {
689 ALR_TRACE_GPRS("gprs_alr_init");
690 alr_data->gprs_data.ign_pgm = FALSE;
691 alr_data->gprs_data.pbcch = FALSE;
692 alr_data->gprs_data.ptm = FALSE;
693 alr_data->gprs_data.check_bsic = FALSE;
694 alr_data->gprs_data.sync_only = FALSE;
695 alr_data->gprs_data.pcco_active= FALSE;
696 alr_data->nc_sync_with_grr = FALSE;
697 gprs_support = FALSE;
698 }
699
700 /*
701 +--------------------------------------------------------------------+
702 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
703 | STATE : code ROUTINE : gprs_alr_tb_meas_ind |
704 +--------------------------------------------------------------------+
705
706 PURPOSE :
707
708 */
709 LOCAL void gprs_alr_tb_meas_ind (T_TB_MEAS_IND *report)
710 {
711 ALR_TRACE_GPRS("tb_meas_ind");
712 switch(GET_STATE(STATE_MA))
713 {
714 case MA_PTM:
715 /*Measurement Report in Packet Transfer Mode*/
716 {
717 USHORT temp;
718 USHORT index;
719 UBYTE diff;
720 UBYTE i,lim;
721 T_NC* pcell;
722
723 if(report->tb_meas_result[0].arfcn EQ NOT_PRESENT_16BIT)
724 {
725 lim = alr_data->nc_data.c_ba_arfcn;
726 }
727 else
728 {
729 lim = TB_BA_LIST_SIZE;
730 }
731
732 /*
733 * reduce the time for next sync
734 * Decrement the 10sec timer counter variable by 2
735 */
736 alr_data->nc_data.c_ncsync_tim = alr_data->nc_data.c_ncsync_tim-2;
737 if ((signed char)( alr_data->nc_data.c_ncsync_tim) < 0)
738 alr_data->nc_data.c_ncsync_tim = 0;
739
740 if( alr_data->nc_data.c_ncsync_tim==0 )
741 {
742 /* 10 sec have elapsed. Perform all requisite tasks */
743 nc_ncsync_tim_expiry();
744 }
745
746 for (pcell=&alr_data->nc_data.cell[0], i = 0; i < lim; i++,pcell++)
747 {
748 if(lim EQ alr_data->nc_data.c_ba_arfcn)
749 {
750 index = i;
751 }
752 else
753 {
754 /* For all cells look if it is in BA(BCCH) */
755 switch(index = nc_get_index(ARFCN_TO_G23(report->tb_meas_result[i].arfcn)))
756 {
757 case LAST_BSIC_REQ:
758 case NOT_PRESENT_16BIT:
759 continue;
760 default:
761 break;
762 }
763 }
764 /*
765 * the ncell is in the list
766 * so store the rxlev values
767 */
768
769 if (alr_data->nc_data.cell[index].c_rxlev EQ NOT_PRESENT_8BIT)
770 {
771 /*
772 * if it is a new cell, build an average from the first value
773 * to speed up fb sb read
774 */
775 if ((signed short) (report->tb_meas_result[i].rxlev) < 0)
776 {
777 report->tb_meas_result[i].rxlev = 0;
778 }
779
780 alr_data->nc_data.cell[index].rxlev[0] = report->tb_meas_result[i].rxlev / report->tb_meas_result[i].num_meas;
781 alr_data->nc_data.cell[index].rxlev[1] = report->tb_meas_result[i].rxlev / report->tb_meas_result[i].num_meas;
782 alr_data->nc_data.cell[index].rxlev[2] = report->tb_meas_result[i].rxlev / report->tb_meas_result[i].num_meas;
783 alr_data->nc_data.cell[index].rxlev[3] = report->tb_meas_result[i].rxlev / report->tb_meas_result[i].num_meas;
784 alr_data->nc_data.cell[index].rxlev[4] = report->tb_meas_result[i].rxlev / report->tb_meas_result[i].num_meas;
785 alr_data->nc_data.cell[index].c_rxlev = 0;
786 }
787 else
788 {
789 if ((signed short) (report->tb_meas_result[i].rxlev) < 0)
790 report->tb_meas_result[i].rxlev = 0;
791
792 alr_data->nc_data.cell[index].rxlev[alr_data->nc_data.cell[index].c_rxlev++] =
793 report->tb_meas_result[i].rxlev / report->tb_meas_result[i].num_meas;
794
795 if (alr_data->nc_data.cell[index].c_rxlev >= 5)
796 alr_data->nc_data.cell[index].c_rxlev = 0;
797 }
798
799 temp = (USHORT)(alr_data->nc_data.cell[index].rxlev[0] +
800 alr_data->nc_data.cell[index].rxlev[1] +
801 alr_data->nc_data.cell[index].rxlev[2] +
802 alr_data->nc_data.cell[index].rxlev[3] +
803 alr_data->nc_data.cell[index].rxlev[4]);
804
805 alr_data->nc_data.cell[index].rxlev_average = (UBYTE)(temp / 5);
806 /*
807 * store the results seperately for averaging when NC=1 or NC=2
808 */
809 #ifdef GPRS
810 if(alr_data->nwctrl_meas_active)
811 {
812 pcell->nc_rxlev += (report->tb_meas_result[i].rxlev / report->tb_meas_result[i].num_meas);
813 pcell->c_nc_rxlev++;
814 }
815 #endif
816
817 TRACE_EVENT_P3("%d %d rx: %d ",i, alr_data->nc_data.cell[i].ba_arfcn,
818 report->tb_meas_result[i].rxlev / report->tb_meas_result[i].num_meas);
819
820 switch (alr_data->nc_data.cell[index].status)
821 {
822 case INACTIVE:
823 nc_set_status (index, IDLE);
824 break;
825 case EXCLUDED:
826 diff = (UBYTE)(alr_data->nc_data.cell[index].rxlev_average -
827 alr_data->nc_data.cell[index].last_rxlev);
828
829 if (diff < 128 AND diff >= 6)
830 {
831 /* result is positive and more than 6 dBm */
832 nc_set_status (index, IDLE);
833 }
834 break;
835 default:
836 break;
837 }
838
839 } /* for all */
840 PFREE(report);
841
842 nc_check_activity();
843 }
844 break;
845 default:
846 PFREE(report);
847 break;
848 }
849 }
850
851
852 /*
853 +--------------------------------------------------------------------+
854 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
855 | STATE : code ROUTINE : gprs_alr_nc_enter_ptm |
856 +--------------------------------------------------------------------+
857
858 PURPOSE : After the Packet Access Phase we enter Packet Transfer
859 Mode and have to do Measurements and Cell Reselection like
860 in Idle Mode.
861 */
862
863 LOCAL void gprs_alr_nc_enter_ptm (void)
864 {
865 nc_resume(); /* set NC_STATE to IDLE */
866
867 alr_data->nc_data.c_reports = (alr_data->nc_data.c_reports*10)/alr_data->nc_data.max_reports;
868 alr_data->nc_data.max_reports = 10;
869 alr_data->nc_data.cell[LAST_BSIC_REQ].status = INACTIVE;
870
871 TRACE_EVENT_P2("glob reps: %d max_report: %d", alr_data->nc_data.c_reports, alr_data->nc_data.max_reports);
872 }
873
874 /*
875 +--------------------------------------------------------------------+
876 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
877 | STATE : code ROUTINE : gprs_check_page_mode |
878 +--------------------------------------------------------------------+
879
880 PURPOSE : Do not change the page mode configuration in L1
881 if ing_pgm is set. ie. we have to stay in REORG.
882
883 */
884 void gprs_check_page_mode(T_MPHC_DATA_IND* data_ind)
885 {
886 if(alr_data->gprs_data.ign_pgm EQ TRUE)
887 {
888 pch_check_page_mode_cr(data_ind);
889 }
890 else
891 {
892 pch_check_page_mode(data_ind);
893 }
894 }
895
896 /*
897 +--------------------------------------------------------------------+
898 | PROJECT : GSM-PS (6103) MODULE : ALR_GPRS |
899 | STATE : code ROUTINE : gprs_alr_is_supported |
900 +--------------------------------------------------------------------+
901
902 PURPOSE : This function returns whether GPRS is supported in
903 the cell.
904
905 */
906 GLOBAL BOOL gprs_alr_is_supported( void )
907 {
908 return( gprs_support EQ TRUE );
909 }
910
911 void set_gprs_support( UBYTE support )
912 {
913 gprs_support = support;
914 }
915
916 #endif /* ALR_GPRS_C */
917
918