summaryrefslogtreecommitdiffstats
path: root/src/target/firmware/layer1/prim_fbsb.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2010-06-20 17:05:01 +0200
committerHarald Welte <laforge@gnumonks.org>2010-06-20 17:28:21 +0200
commitc1168aaec27542c609bd79749006235340c67bc3 (patch)
treef77770126b98708f7c89864ba2b753aeec5b753b /src/target/firmware/layer1/prim_fbsb.c
parent7bde7938ae721845d9c0744852d35fecdf9afd9c (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.c15
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();