From 6ca03ff7e6f72bf942111e52816bcf5515d91982 Mon Sep 17 00:00:00 2001 From: "Andreas.Eversberg" Date: Sat, 22 May 2010 09:27:33 +0000 Subject: [PATCH] Fixing cell selection, so it works with the current layer 1 API. --- src/host/layer23/src/gsm322.c | 29 +++++++++++++++++++++-------- src/host/layer23/src/gsm48_rr.c | 10 ++++++---- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/host/layer23/src/gsm322.c b/src/host/layer23/src/gsm322.c index 73ba60d84..fcf8979df 100644 --- a/src/host/layer23/src/gsm322.c +++ b/src/host/layer23/src/gsm322.c @@ -1421,9 +1421,8 @@ static int gsm322_cs_select(struct osmocom_ms *ms, int any) LOGP(DCS, LOGL_INFO, "Select using access class with Emergency " "class.\n"); } else { - acc_class = subscr->acc_class & 0xfbff; /* remove emergency */ - LOGP(DCS, LOGL_INFO, "Select using access class without " - "Emergency class\n"); + acc_class = subscr->acc_class; + LOGP(DCS, LOGL_INFO, "Select using access class \n"); } /* flags to match */ @@ -1595,7 +1594,7 @@ static int gsm322_cs_scan(struct osmocom_ms *ms) "%d).\n", cs->arfcn, cs->list[cs->arfcn].rxlev_db); cs->ccch_state = GSM322_CCCH_ST_INIT; l1ctl_tx_fbsb_req(ms, cs->arfcn, L1CTL_FBSB_F_FB01SB, 100, 0); - start_cs_timer(cs, ms->support.sync_to, 0); +// start_cs_timer(cs, ms->support.sync_to, 0); return 0; } @@ -1695,7 +1694,7 @@ static int gsm322_cs_scan(struct osmocom_ms *ms) cs->list[cs->arfcn].rxlev_db); cs->ccch_state = GSM322_CCCH_ST_INIT; l1ctl_tx_fbsb_req(ms, cs->arfcn, L1CTL_FBSB_F_FB01SB, 100, 0); - start_cs_timer(cs, ms->support.sync_to, 0); +// start_cs_timer(cs, ms->support.sync_to, 0); /* Allocate/clean system information. */ cs->list[cs->arfcn].flags &= ~GSM322_CS_FLAG_SYSINFO; @@ -1710,8 +1709,12 @@ static int gsm322_cs_scan(struct osmocom_ms *ms) cs->si = cs->list[cs->arfcn].sysinfo; /* increase scan counter for each maximum scan range */ - if (gsm_sup_smax[j].max) + if (gsm_sup_smax[j].max) { + LOGP(DCS, LOGL_INFO, "%d frequencies left in band %d..%d\n", + gsm_sup_smax[j].max - gsm_sup_smax[j].temp, + gsm_sup_smax[j].start, gsm_sup_smax[j].end); gsm_sup_smax[j].temp++; + } return 0; } @@ -2212,7 +2215,7 @@ static int gsm322_cs_powerscan(struct osmocom_ms *ms) cs->list[cs->arfcn].rxlev_db); cs->ccch_state = GSM322_CCCH_ST_INIT; l1ctl_tx_fbsb_req(ms, cs->arfcn, L1CTL_FBSB_F_FB01SB, 100, 0); - start_cs_timer(cs, ms->support.sync_to, 0); +// start_cs_timer(cs, ms->support.sync_to, 0); } else new_c_state(cs, GSM322_C0_NULL); @@ -2292,6 +2295,7 @@ static int gsm322_l1_signal(unsigned int subsys, unsigned int signal, /* in dedicated mode */ if (ms->rrlayer.state == GSM48_RR_ST_CONN_PEND) return gsm48_rr_tx_rand_acc(ms, NULL); +#endif /* set timer for reading BCCH */ if (cs->state == GSM322_C2_STORED_CELL_SEL @@ -2305,10 +2309,19 @@ static int gsm322_l1_signal(unsigned int subsys, unsigned int signal, || cs->state == GSM322_HPLMN_SEARCH) start_cs_timer(cs, ms->support.scan_to, 0); // TODO: timer depends on BCCH config -#endif } break; + case S_L1CTL_FBSB_ERR: + ms = signal_data; + cs = &ms->cellsel; + + LOGP(DCS, LOGL_INFO, "Sync error.\n"); + + /* tune to next cell */ + gsm322_cs_scan(ms); + break; } + return 0; } diff --git a/src/host/layer23/src/gsm48_rr.c b/src/host/layer23/src/gsm48_rr.c index d38c07195..ca98fb76d 100644 --- a/src/host/layer23/src/gsm48_rr.c +++ b/src/host/layer23/src/gsm48_rr.c @@ -896,7 +896,7 @@ int gsm48_rr_tx_rand_acc(struct osmocom_ms *ms, struct msgb *msg) { struct gsm48_rrlayer *rr = &ms->rrlayer; struct gsm322_cellsel *cs = &ms->cellsel; - struct gsm48_sysinfo *s = ms->cellsel.si; + struct gsm48_sysinfo *s = &ms->cellsel.sel_si; struct msgb *nmsg; struct l1ctl_info_ul *nul; struct l1ctl_rach_req *nra; @@ -907,7 +907,8 @@ int gsm48_rr_tx_rand_acc(struct osmocom_ms *ms, struct msgb *msg) LOGP(DRR, LOGL_INFO, "CCCH channel activation failed.\n"); if (rr->rr_est_req) { - struct msgb *msg = gsm48_rr_msgb_alloc(GSM48_RR_REL_IND); + struct msgb *msg = + gsm48_rr_msgb_alloc(GSM48_RR_REL_IND); struct gsm48_rr_hdr *rrh; if (!msg) @@ -3094,7 +3095,6 @@ static int gsm48_rr_unit_data_ind(struct osmocom_ms *ms, struct msgb *msg) { struct gsm322_cellsel *cs = &ms->cellsel; struct abis_rsl_rll_hdr *rllh = msgb_l2(msg); - struct gsm48_sysinfo *s = ms->cellsel.si; struct tlv_parsed tv; DEBUGP(DRSL, "RSLms UNIT DATA IND chan_nr=0x%02x link_id=0x%02x\n", @@ -3113,13 +3113,15 @@ static int gsm48_rr_unit_data_ind(struct osmocom_ms *ms, struct msgb *msg) /* when camping, start/reset loss timer */ if (cs->state == GSM322_C3_CAMPED_NORMALLY - || cs->state == GSM322_C7_CAMPED_ANY_CELL) + || cs->state == GSM322_C7_CAMPED_ANY_CELL) { + struct gsm48_sysinfo *s = &ms->cellsel.sel_si; #ifdef TODO set radio link timeout on layer 1 it is the number of subsequent BCCH blocks. (about 1/4 seconds) #else start_loss_timer(cs, s->bcch_radio_link_timeout / 4, 0); #endif + } /* temporary moved here until confirm is fixed */ if (cs->ccch_state != GSM322_CCCH_ST_DATA) {