trxcon/scheduler: introduce TDMA frame math helpers
The 'normal' math operations, such as addition and substraction, are not applicable for TDMA frame numbers because they may result in out-of-range values. Having TDMA frame math helpers in a single place would allow one to avoid possible out-of-range result mistakes. Change-Id: Ibb66ba846cc3d6c2eaa88414569e5f3751128047
This commit is contained in:
parent
60da22a67b
commit
96419494d3
|
@ -83,8 +83,7 @@ static void sched_clck_tick(void *data)
|
|||
timespecadd(tv_clock, &frame_duration, tv_clock);
|
||||
elapsed_us -= FRAME_DURATION_uS;
|
||||
|
||||
sched->fn_counter_proc = (sched->fn_counter_proc + 1)
|
||||
% GSM_HYPERFRAME;
|
||||
sched->fn_counter_proc = TDMA_FN_INC(sched->fn_counter_proc);
|
||||
|
||||
/* Call frame callback */
|
||||
if (sched->clock_cb)
|
||||
|
@ -142,8 +141,7 @@ int sched_clck_handle(struct trx_sched *sched, uint32_t fn)
|
|||
/* Calculate elapsed time / frames since last processed fn */
|
||||
timespecsub(&tv_now, tv_clock, &elapsed);
|
||||
elapsed_us = (elapsed.tv_sec * 1000000) + (elapsed.tv_nsec / 1000);
|
||||
elapsed_fn = (fn + GSM_HYPERFRAME - sched->fn_counter_proc)
|
||||
% GSM_HYPERFRAME;
|
||||
elapsed_fn = TDMA_FN_SUB(fn, sched->fn_counter_proc);
|
||||
|
||||
if (elapsed_fn >= 135774)
|
||||
elapsed_fn -= GSM_HYPERFRAME;
|
||||
|
@ -181,8 +179,7 @@ int sched_clck_handle(struct trx_sched *sched, uint32_t fn)
|
|||
|
||||
/* Transmit what we still need to transmit */
|
||||
while (fn != sched->fn_counter_proc) {
|
||||
sched->fn_counter_proc = (sched->fn_counter_proc + 1)
|
||||
% GSM_HYPERFRAME;
|
||||
sched->fn_counter_proc = TDMA_FN_INC(sched->fn_counter_proc);
|
||||
|
||||
/* Call frame callback */
|
||||
if (sched->clock_cb)
|
||||
|
|
|
@ -65,8 +65,8 @@ static void sched_frame_clck_cb(struct trx_sched *sched)
|
|||
* Advance frame number, giving the transceiver more
|
||||
* time until a burst must be transmitted...
|
||||
*/
|
||||
fn = (sched->fn_counter_proc + sched->fn_counter_advance)
|
||||
% GSM_HYPERFRAME;
|
||||
fn = TDMA_FN_SUM(sched->fn_counter_proc,
|
||||
sched->fn_counter_advance);
|
||||
|
||||
/* Get frame from multiframe */
|
||||
offset = fn % ts->mf_layout->period;
|
||||
|
@ -608,15 +608,14 @@ int sched_trx_handle_rx_burst(struct trx_instance *trx, uint8_t tn,
|
|||
}
|
||||
|
||||
/* Calculate how many frames have been elapsed */
|
||||
elapsed = (burst_fn + GSM_HYPERFRAME - ts->mf_last_fn);
|
||||
elapsed %= GSM_HYPERFRAME;
|
||||
elapsed = TDMA_FN_SUB(burst_fn, ts->mf_last_fn);
|
||||
|
||||
/**
|
||||
* If not too many frames have been elapsed,
|
||||
* start counting from last fn + 1
|
||||
*/
|
||||
if (elapsed < 10)
|
||||
fn = (ts->mf_last_fn + 1) % GSM_HYPERFRAME;
|
||||
fn = TDMA_FN_INC(ts->mf_last_fn);
|
||||
else
|
||||
fn = burst_fn;
|
||||
|
||||
|
@ -658,7 +657,7 @@ next_frame:
|
|||
if (fn == burst_fn)
|
||||
break;
|
||||
|
||||
fn = (fn + 1) % GSM_HYPERFRAME;
|
||||
fn = TDMA_FN_INC(fn);
|
||||
}
|
||||
|
||||
/* Set last processed frame number */
|
||||
|
|
|
@ -10,6 +10,14 @@
|
|||
#define GSM_SUPERFRAME (26 * 51)
|
||||
#define GSM_HYPERFRAME (2048 * GSM_SUPERFRAME)
|
||||
|
||||
/* TDMA frame number arithmetics */
|
||||
#define TDMA_FN_SUM(a, b) \
|
||||
((a + b) % GSM_HYPERFRAME)
|
||||
#define TDMA_FN_SUB(a, b) \
|
||||
((a + GSM_HYPERFRAME - b) % GSM_HYPERFRAME)
|
||||
#define TDMA_FN_INC(fn) \
|
||||
TDMA_FN_SUM(fn, 1)
|
||||
|
||||
enum tdma_sched_clck_state {
|
||||
SCH_CLCK_STATE_WAIT,
|
||||
SCH_CLCK_STATE_OK,
|
||||
|
|
Loading…
Reference in New Issue