<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/18874">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Use libosmocore's TDMA frame number API (constatns & arithmetic)<br><br>Depends: (libosmocore) Ic291fd3644f34964374227a191c7045d79d77e0d<br>Change-Id: I61c97a62bd5dbbb4a984921ebdfc10ad6ed00f2a<br>---<br>M include/osmo-bts/gsm_data.h<br>M src/common/l1sap.c<br>M src/common/scheduler.c<br>M src/osmo-bts-trx/scheduler_trx.c<br>M src/osmo-bts-trx/trx_if.c<br>M src/osmo-bts-virtual/scheduler_virtbts.c<br>6 files changed, 30 insertions(+), 48 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/74/18874/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h</span><br><span>index 1de5edd..155cd9b 100644</span><br><span>--- a/include/osmo-bts/gsm_data.h</span><br><span>+++ b/include/osmo-bts/gsm_data.h</span><br><span>@@ -5,6 +5,7 @@</span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/gsm/lapdm.h></span><br><span> #include <osmocom/gsm/gsm23003.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm0502.h></span><br><span> </span><br><span> #include <osmo-bts/paging.h></span><br><span> #include <osmo-bts/tx_power.h></span><br><span>@@ -16,9 +17,6 @@</span><br><span> #define GSM_HR_BYTES 14 /* TS 101318 Chapter 5.2: 112 bits, no sig */</span><br><span> #define GSM_EFR_BYTES 31 /* TS 101318 Chapter 5.3: 244 bits + 4bit sig */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define GSM_SUPERFRAME (26*51) /* 1326 TDMA frames */</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSM_HYPERFRAME (2048*GSM_SUPERFRAME) /* GSM_HYPERFRAME frames */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #define GSM_BTS_AGCH_QUEUE_THRESH_LEVEL_DEFAULT 41</span><br><span> #define GSM_BTS_AGCH_QUEUE_THRESH_LEVEL_DISABLE 999999</span><br><span> #define GSM_BTS_AGCH_QUEUE_LOW_LEVEL_DEFAULT 41</span><br><span>diff --git a/src/common/l1sap.c b/src/common/l1sap.c</span><br><span>index dad1b49..17a6c5d 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -621,7 +621,7 @@</span><br><span> /* increment number of RACH slots that have passed by since the</span><br><span> * last time indication */</span><br><span> for (i = 0; i < frames_expired; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t fn = (info_time_ind->fn + GSM_HYPERFRAME - i) % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t fn = GSM_TDMA_FN_SUB(info_time_ind->fn, i);</span><br><span> bts->load.rach.total += calc_exprd_rach_frames(bts, fn);</span><br><span> }</span><br><span> </span><br><span>@@ -891,7 +891,7 @@</span><br><span> </span><br><span> static void l1sap_update_fnstats(struct gsm_bts *bts, uint32_t rts_fn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- int32_t delta = (rts_fn + GSM_HYPERFRAME - bts->gsm_time.fn) % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+ int32_t delta = GSM_TDMA_FN_SUB(rts_fn, bts->gsm_time.fn);</span><br><span> </span><br><span> if (delta < bts->fn_stats.min)</span><br><span> bts->fn_stats.min = delta;</span><br><span>diff --git a/src/common/scheduler.c b/src/common/scheduler.c</span><br><span>index ed7d412..93b0526 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -661,7 +661,7 @@</span><br><span> LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "Prim has wrong type.\n");</span><br><span> goto free_msg;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- prim_fn = ((l1sap_fn + GSM_HYPERFRAME - fn) % GSM_HYPERFRAME);</span><br><span style="color: hsl(120, 100%, 40%);">+ prim_fn = GSM_TDMA_FN_SUB(l1sap_fn, fn);</span><br><span> if (prim_fn > 100) { /* l1sap_fn < fn */</span><br><span> LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn,</span><br><span> "Prim %u is out of range (%u vs exp %u), or channel %s with "</span><br><span>@@ -1225,12 +1225,6 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define TDMA_FN_SUM(a, b) \</span><br><span style="color: hsl(0, 100%, 40%);">- ((a + GSM_HYPERFRAME + b) % GSM_HYPERFRAME)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define TDMA_FN_SUB(a, b) \</span><br><span style="color: hsl(0, 100%, 40%);">- ((a + GSM_HYPERFRAME - b) % GSM_HYPERFRAME)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int trx_sched_calc_frame_loss(struct l1sched_trx *l1t,</span><br><span> struct l1sched_chan_state *l1cs, uint8_t tn, uint32_t fn)</span><br><span> {</span><br><span>@@ -1268,7 +1262,7 @@</span><br><span> }</span><br><span> </span><br><span> /* How many frames elapsed since the last one? */</span><br><span style="color: hsl(0, 100%, 40%);">- elapsed_fs = TDMA_FN_SUB(fn, l1cs->last_tdma_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ elapsed_fs = GSM_TDMA_FN_SUB(fn, l1cs->last_tdma_fn);</span><br><span> if (elapsed_fs > l1ts->mf_period) { /* Too many! */</span><br><span> LOGL1S(DL1P, LOGL_ERROR, l1t, tn, frame_head->ul_chan, fn,</span><br><span> "Too many (>%u) contiguous TDMA frames=%u elapsed "</span><br><span>@@ -1287,7 +1281,7 @@</span><br><span> * Start counting from the last_fn + 1.</span><br><span> */</span><br><span> for (i = 1; i < elapsed_fs; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- fn_i = TDMA_FN_SUM(l1cs->last_tdma_fn, i);</span><br><span style="color: hsl(120, 100%, 40%);">+ fn_i = GSM_TDMA_FN_SUM(l1cs->last_tdma_fn, i);</span><br><span> offset = fn_i % l1ts->mf_period;</span><br><span> frame = l1ts->mf_frames + offset;</span><br><span> </span><br><span>@@ -1320,7 +1314,7 @@</span><br><span> };</span><br><span> </span><br><span> for (i = 1; i < elapsed_fs; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- fn_i = TDMA_FN_SUM(l1cs->last_tdma_fn, i);</span><br><span style="color: hsl(120, 100%, 40%);">+ fn_i = GSM_TDMA_FN_SUM(l1cs->last_tdma_fn, i);</span><br><span> offset = fn_i % l1ts->mf_period;</span><br><span> frame = l1ts->mf_frames + offset;</span><br><span> func = trx_chan_desc[frame->ul_chan].ul_fn;</span><br><span>diff --git a/src/osmo-bts-trx/scheduler_trx.c b/src/osmo-bts-trx/scheduler_trx.c</span><br><span>index d4a38b6..233c0b9 100644</span><br><span>--- a/src/osmo-bts-trx/scheduler_trx.c</span><br><span>+++ b/src/osmo-bts-trx/scheduler_trx.c</span><br><span>@@ -74,7 +74,7 @@</span><br><span> </span><br><span> /* advance frame number, so the transceiver has more</span><br><span> * time until it must be transmitted. */</span><br><span style="color: hsl(0, 100%, 40%);">- fn = (fn + plink->u.osmotrx.clock_advance) % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+ fn = GSM_TDMA_FN_SUM(fn, plink->u.osmotrx.clock_advance);</span><br><span> </span><br><span> /* we don't schedule, if power is off */</span><br><span> if (!trx_if_powered(l1h))</span><br><span>@@ -83,8 +83,7 @@</span><br><span> /* process every TS of TRX */</span><br><span> for (tn = 0; tn < ARRAY_SIZE(l1t->ts); tn++) {</span><br><span> /* ready-to-send */</span><br><span style="color: hsl(0, 100%, 40%);">- _sched_rts(l1t, tn,</span><br><span style="color: hsl(0, 100%, 40%);">- (fn + plink->u.osmotrx.rts_advance) % GSM_HYPERFRAME);</span><br><span style="color: hsl(120, 100%, 40%);">+ _sched_rts(l1t, tn, GSM_TDMA_FN_SUM(fn, plink->u.osmotrx.rts_advance));</span><br><span> </span><br><span> /* All other parameters to be set by _sched_dl_burst() */</span><br><span> br = (struct trx_dl_burst_req) {</span><br><span>@@ -105,10 +104,6 @@</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! duration of a GSM frame in nano-seconds. (120ms/26) */</span><br><span style="color: hsl(0, 100%, 40%);">-#define FRAME_DURATION_nS 4615384</span><br><span style="color: hsl(0, 100%, 40%);">-/*! duration of a GSM frame in micro-seconds (120s/26) */</span><br><span style="color: hsl(0, 100%, 40%);">-#define FRAME_DURATION_uS (FRAME_DURATION_nS/1000)</span><br><span> /*! maximum number of 'missed' frame periods we can tolerate of OS doesn't schedule us*/</span><br><span> #define MAX_FN_SKEW 50</span><br><span> /*! maximum number of frame periods we can tolerate without TRX Clock Indication*/</span><br><span>@@ -126,9 +121,9 @@</span><br><span> /*! compute the number of frame number intervals elapsed between \a last and \a now */</span><br><span> static inline int compute_elapsed_fn(const uint32_t last, const uint32_t now)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- int elapsed_fn = (now + GSM_HYPERFRAME - last) % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+ int elapsed_fn = GSM_TDMA_FN_SUB(now, last);</span><br><span> if (elapsed_fn >= 135774)</span><br><span style="color: hsl(0, 100%, 40%);">- elapsed_fn -= GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+ elapsed_fn -= GSM_TDMA_HYPERFRAME;</span><br><span> return elapsed_fn;</span><br><span> }</span><br><span> </span><br><span>@@ -139,9 +134,6 @@</span><br><span> ts->tv_nsec = ts->tv_nsec % 1000000000;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! Increment a GSM frame number modulo GSM_HYPERFRAME */</span><br><span style="color: hsl(0, 100%, 40%);">-#define INCREMENT_FN(fn) (fn) = (((fn) + 1) % GSM_HYPERFRAME)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> extern int quit;</span><br><span> </span><br><span> /*! this is the timerfd-callback firing for every FN to be processed */</span><br><span>@@ -178,7 +170,7 @@</span><br><span> /* compute actual elapsed time and resulting OS scheduling error */</span><br><span> clock_gettime(CLOCK_MONOTONIC, &tv_now);</span><br><span> elapsed_us = compute_elapsed_us(&tcs->last_fn_timer.tv, &tv_now);</span><br><span style="color: hsl(0, 100%, 40%);">- error_us = elapsed_us - FRAME_DURATION_uS;</span><br><span style="color: hsl(120, 100%, 40%);">+ error_us = elapsed_us - GSM_TDMA_FN_DURATION_uS;</span><br><span> #ifdef DEBUG_CLOCK</span><br><span> printf("%s(): %09ld, elapsed_us=%05" PRId64 ", error_us=%-d: fn=%d\n", __func__,</span><br><span> tv_now.tv_nsec, elapsed_us, error_us, tcs->last_fn_timer.fn+1);</span><br><span>@@ -186,7 +178,7 @@</span><br><span> tcs->last_fn_timer.tv = tv_now;</span><br><span> </span><br><span> /* if someone played with clock, or if the process stalled */</span><br><span style="color: hsl(0, 100%, 40%);">- if (elapsed_us > FRAME_DURATION_uS * MAX_FN_SKEW || elapsed_us < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (elapsed_us > GSM_TDMA_FN_DURATION_uS * MAX_FN_SKEW || elapsed_us < 0) {</span><br><span> LOGP(DL1C, LOGL_ERROR, "PC clock skew: elapsed_us=%" PRId64 ", error_us=%" PRId64 "\n",</span><br><span> elapsed_us, error_us);</span><br><span> goto no_clock;</span><br><span>@@ -194,7 +186,7 @@</span><br><span> </span><br><span> /* call trx_sched_fn() for all expired FN */</span><br><span> for (i = 0; i < expire_count; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- INCREMENT_FN(tcs->last_fn_timer.fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM_TDMA_FN_INC(tcs->last_fn_timer.fn);</span><br><span> trx_sched_fn(bts, tcs->last_fn_timer.fn);</span><br><span> }</span><br><span> </span><br><span>@@ -281,7 +273,7 @@</span><br><span> int elapsed_fn;</span><br><span> int64_t elapsed_us, elapsed_us_since_clk, elapsed_fn_since_clk, error_us_since_clk;</span><br><span> unsigned int fn_caught_up = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- const struct timespec interval = { .tv_sec = 0, .tv_nsec = FRAME_DURATION_nS };</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct timespec interval = { .tv_sec = 0, .tv_nsec = GSM_TDMA_FN_DURATION_nS };</span><br><span> </span><br><span> if (quit)</span><br><span> return 0;</span><br><span>@@ -307,7 +299,7 @@</span><br><span> elapsed_us_since_clk = compute_elapsed_us(&tcs->last_clk_ind.tv, &tv_now);</span><br><span> elapsed_fn_since_clk = compute_elapsed_fn(tcs->last_clk_ind.fn, fn);</span><br><span> /* error (delta) between local clock since last CLK and CLK based on FN clock at TRX */</span><br><span style="color: hsl(0, 100%, 40%);">- error_us_since_clk = elapsed_us_since_clk - (FRAME_DURATION_uS * elapsed_fn_since_clk);</span><br><span style="color: hsl(120, 100%, 40%);">+ error_us_since_clk = elapsed_us_since_clk - (GSM_TDMA_FN_DURATION_uS * elapsed_fn_since_clk);</span><br><span> LOGP(DL1C, LOGL_INFO, "TRX Clock Ind: elapsed_us=%7"PRId64", "</span><br><span> "elapsed_fn=%3"PRId64", error_us=%+5"PRId64"\n",</span><br><span> elapsed_us_since_clk, elapsed_fn_since_clk, error_us_since_clk);</span><br><span>@@ -328,14 +320,14 @@</span><br><span> }</span><br><span> </span><br><span> LOGP(DL1C, LOGL_INFO, "GSM clock jitter: %" PRId64 "us (elapsed_fn=%d)\n",</span><br><span style="color: hsl(0, 100%, 40%);">- elapsed_fn * FRAME_DURATION_uS - elapsed_us, elapsed_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ elapsed_fn * GSM_TDMA_FN_DURATION_uS - elapsed_us, elapsed_fn);</span><br><span> </span><br><span> /* too many frames have been processed already */</span><br><span> if (elapsed_fn < 0) {</span><br><span> struct timespec first = interval;</span><br><span> /* set clock to the time or last FN should have been</span><br><span> * transmitted. */</span><br><span style="color: hsl(0, 100%, 40%);">- first.tv_nsec += (0 - elapsed_fn) * FRAME_DURATION_nS;</span><br><span style="color: hsl(120, 100%, 40%);">+ first.tv_nsec += (0 - elapsed_fn) * GSM_TDMA_FN_DURATION_nS;</span><br><span> normalize_timespec(&first);</span><br><span> LOGP(DL1C, LOGL_NOTICE, "We were %d FN faster than TRX, compensating\n", -elapsed_fn);</span><br><span> /* set time to the time our next FN has to be transmitted */</span><br><span>@@ -345,7 +337,7 @@</span><br><span> </span><br><span> /* transmit what we still need to transmit */</span><br><span> while (fn != tcs->last_fn_timer.fn) {</span><br><span style="color: hsl(0, 100%, 40%);">- INCREMENT_FN(tcs->last_fn_timer.fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM_TDMA_FN_INC(tcs->last_fn_timer.fn);</span><br><span> trx_sched_fn(bts, tcs->last_fn_timer.fn);</span><br><span> fn_caught_up++;</span><br><span> }</span><br><span>diff --git a/src/osmo-bts-trx/trx_if.c b/src/osmo-bts-trx/trx_if.c</span><br><span>index 1953f71..a148f6a 100644</span><br><span>--- a/src/osmo-bts-trx/trx_if.c</span><br><span>+++ b/src/osmo-bts-trx/trx_if.c</span><br><span>@@ -121,8 +121,8 @@</span><br><span> </span><br><span> LOGPPHI(pinst, DTRX, LOGL_INFO, "Clock indication: fn=%u\n", fn);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (fn >= GSM_HYPERFRAME) {</span><br><span style="color: hsl(0, 100%, 40%);">- fn %= GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (fn >= GSM_TDMA_HYPERFRAME) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fn %= GSM_TDMA_HYPERFRAME;</span><br><span> LOGPPHI(pinst, DTRX, LOGL_ERROR, "Indicated clock's FN is not "</span><br><span> "wrapping correctly, correcting to fn=%u\n", fn);</span><br><span> }</span><br><span>@@ -734,7 +734,7 @@</span><br><span> bi->rssi = -(int8_t)buf[5];</span><br><span> bi->toa256 = (int16_t) osmo_load16be(buf + 6);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (bi->fn >= GSM_HYPERFRAME) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bi->fn >= GSM_TDMA_HYPERFRAME) {</span><br><span> LOGPPHI(l1h->phy_inst, DTRX, LOGL_ERROR,</span><br><span> "Illegal TDMA fn=%u\n", bi->fn);</span><br><span> return -EINVAL;</span><br><span>diff --git a/src/osmo-bts-virtual/scheduler_virtbts.c b/src/osmo-bts-virtual/scheduler_virtbts.c</span><br><span>index d3fdf1a..1c2b057 100644</span><br><span>--- a/src/osmo-bts-virtual/scheduler_virtbts.c</span><br><span>+++ b/src/osmo-bts-virtual/scheduler_virtbts.c</span><br><span>@@ -532,7 +532,6 @@</span><br><span> ***********************************************************************/</span><br><span> </span><br><span> #define RTS_ADVANCE 5 /* about 20ms */</span><br><span style="color: hsl(0, 100%, 40%);">-#define FRAME_DURATION_uS 4615</span><br><span> </span><br><span> static int vbts_sched_fn(struct gsm_bts *bts, uint32_t fn)</span><br><span> {</span><br><span>@@ -558,7 +557,7 @@</span><br><span> * --> Handle and process non-transparent RSL-Messages (activate channel, )</span><br><span> * --> Forward transparent RSL-DATA-Messages to the ms by appending them to</span><br><span> * the l1-dl-queue */</span><br><span style="color: hsl(0, 100%, 40%);">- _sched_rts(l1t, br.tn, (fn + RTS_ADVANCE) % GSM_HYPERFRAME);</span><br><span style="color: hsl(120, 100%, 40%);">+ _sched_rts(l1t, br.tn, GSM_TDMA_FN_SUM(fn, RTS_ADVANCE));</span><br><span> /* schedule transmit backend functions */</span><br><span> /* Process data in the l1-dlqueue and forward it</span><br><span> * to MS */</span><br><span>@@ -587,28 +586,27 @@</span><br><span> + (tv_now.tv_usec - tv_clock->tv_usec);</span><br><span> </span><br><span> /* not so good somehow a lot of time passed between two timer callbacks */</span><br><span style="color: hsl(0, 100%, 40%);">- if (elapsed_us > 2 *FRAME_DURATION_uS)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (elapsed_us > 2 *GSM_TDMA_FN_DURATION_uS)</span><br><span> LOGP(DL1P, LOGL_NOTICE, "vbts_fn_timer_cb after %d us\n", elapsed_us);</span><br><span> </span><br><span> /* schedule the current frame/s (fn = frame number)</span><br><span> * this loop will be called at least once, but can also be executed</span><br><span> * multiple times if more than one frame duration (4615us) passed till the last callback */</span><br><span style="color: hsl(0, 100%, 40%);">- while (elapsed_us > FRAME_DURATION_uS / 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+ while (elapsed_us > GSM_TDMA_FN_DURATION_uS / 2) {</span><br><span> const struct timeval tv_frame = {</span><br><span> .tv_sec = 0,</span><br><span style="color: hsl(0, 100%, 40%);">- .tv_usec = FRAME_DURATION_uS,</span><br><span style="color: hsl(120, 100%, 40%);">+ .tv_usec = GSM_TDMA_FN_DURATION_uS,</span><br><span> };</span><br><span> timeradd(tv_clock, &tv_frame, tv_clock);</span><br><span> /* increment the frame number in the BTS model instance */</span><br><span style="color: hsl(0, 100%, 40%);">- bts_virt->last_fn = (bts_virt->last_fn + 1) % GSM_HYPERFRAME;</span><br><span style="color: hsl(0, 100%, 40%);">- vbts_sched_fn(bts, bts_virt->last_fn);</span><br><span style="color: hsl(0, 100%, 40%);">- elapsed_us -= FRAME_DURATION_uS;</span><br><span style="color: hsl(120, 100%, 40%);">+ vbts_sched_fn(bts, GSM_TDMA_FN_INC(bts_virt->last_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+ elapsed_us -= GSM_TDMA_FN_DURATION_uS;</span><br><span> }</span><br><span> </span><br><span> /* re-schedule the timer */</span><br><span> /* timer is set to frame duration - elapsed time to guarantee that this cb method will be</span><br><span> * periodically executed every 4.615ms */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_schedule(&bts_virt->fn_timer, 0, FRAME_DURATION_uS - elapsed_us);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_schedule(&bts_virt->fn_timer, 0, GSM_TDMA_FN_DURATION_uS - elapsed_us);</span><br><span> }</span><br><span> </span><br><span> int vbts_sched_start(struct gsm_bts *bts)</span><br><span>@@ -622,7 +620,7 @@</span><br><span> </span><br><span> gettimeofday(&bts_virt->tv_clock, NULL);</span><br><span> /* trigger the first timer after 4615us (a frame duration) */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_schedule(&bts_virt->fn_timer, 0, FRAME_DURATION_uS);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_schedule(&bts_virt->fn_timer, 0, GSM_TDMA_FN_DURATION_uS);</span><br><span> </span><br><span> return 0;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/18874">change 18874</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bts/+/18874"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I61c97a62bd5dbbb4a984921ebdfc10ad6ed00f2a </div>
<div style="display:none"> Gerrit-Change-Number: 18874 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>