diff options
author | Harald Welte <laforge@gnumonks.org> | 2010-06-20 17:05:01 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2010-06-20 17:28:21 +0200 |
commit | c1168aaec27542c609bd79749006235340c67bc3 (patch) | |
tree | f77770126b98708f7c89864ba2b753aeec5b753b /src/target/firmware/layer1/prim_fbsb.c | |
parent | 7bde7938ae721845d9c0744852d35fecdf9afd9c (diff) |
[layer1] FBSB: re-try FB0/FB1 request up to 3 times
So far, we have aborted our FB acquisition if we didn't detect a
Frequency Burst in the first period of 12 TDMA timeslots. However,
this turns out to be giving up a bit too quickly. We now re-try
this three times before giving up, which hopefully gives better
results.
Diffstat (limited to 'src/target/firmware/layer1/prim_fbsb.c')
-rw-r--r-- | src/target/firmware/layer1/prim_fbsb.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/target/firmware/layer1/prim_fbsb.c b/src/target/firmware/layer1/prim_fbsb.c index 102235ff..e0236fd8 100644 --- a/src/target/firmware/layer1/prim_fbsb.c +++ b/src/target/firmware/layer1/prim_fbsb.c @@ -49,6 +49,8 @@ #include <l1a_l23_interface.h> +#define FB0_RETRY_COUNT 3 + extern uint16_t rf_arfcn; // TODO struct mon_state { @@ -72,6 +74,7 @@ struct l1a_fb_state { struct mon_state mon; struct l1ctl_fbsb_req req; int16_t initial_freq_err; + uint8_t fb_retries; }; static struct l1a_fb_state fbs; @@ -405,9 +408,14 @@ static int l1s_fbdet_resp(__unused uint8_t p1, uint8_t attempt, /* If we don't reset here, we get DSP DMA errors */ tdma_sched_reset(); - last_fb->attempt = 13; - - l1s_compl_sched(L1_COMPL_FB); + if (fbs.fb_retries < FB0_RETRY_COUNT) { + /* retry once more */ + tdma_schedule_set(1, fb_sched_set, 0); + fbs.fb_retries++; + } else { + last_fb->attempt = 13; + l1s_compl_sched(L1_COMPL_FB); + } return 0; } @@ -529,6 +537,7 @@ void l1s_fbsb_req(uint8_t base_fn, struct l1ctl_fbsb_req *req) /* clear initial frequency error */ fbs.initial_freq_err = 0; + fbs.fb_retries = 0; /* Make sure we start at a 'center' AFCDAC output value */ afc_reset(); |