<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/18872">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trxcon: use libosmocore's TDMA frame number API<br><br>Depends: (libosmocore) Ic291fd3644f34964374227a191c7045d79d77e0d<br>Change-Id: I49a043d8483e116cf2d91820edb511846175173f<br>---<br>M src/host/trxcon/l1ctl.c<br>M src/host/trxcon/sched_clck.c<br>M src/host/trxcon/sched_lchan_tchh.c<br>M src/host/trxcon/sched_trx.c<br>M src/host/trxcon/scheduler.h<br>5 files changed, 22 insertions(+), 39 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/host/trxcon/l1ctl.c b/src/host/trxcon/l1ctl.c</span><br><span>index 192cdd1..aec304f 100644</span><br><span>--- a/src/host/trxcon/l1ctl.c</span><br><span>+++ b/src/host/trxcon/l1ctl.c</span><br><span>@@ -370,9 +370,9 @@</span><br><span>        /* Start FBSB expire timer */</span><br><span>        l1l->fbsb_timer.data = l1l;</span><br><span>       l1l->fbsb_timer.cb = fbsb_timer_cb;</span><br><span style="color: hsl(0, 100%, 40%);">-  LOGP(DL1C, LOGL_INFO, "Starting FBSB timer %u ms\n", timeout * FRAME_DURATION_uS / 1000);</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DL1C, LOGL_INFO, "Starting FBSB timer %u ms\n", timeout * GSM_TDMA_FN_DURATION_uS / 1000);</span><br><span>    osmo_timer_schedule(&l1l->fbsb_timer, 0,</span><br><span style="color: hsl(0, 100%, 40%);">-         timeout * FRAME_DURATION_uS);</span><br><span style="color: hsl(120, 100%, 40%);">+         timeout * GSM_TDMA_FN_DURATION_uS);</span><br><span> </span><br><span> exit:</span><br><span>     msgb_free(msg);</span><br><span>diff --git a/src/host/trxcon/sched_clck.c b/src/host/trxcon/sched_clck.c</span><br><span>index 7c814dc..9476ccd 100644</span><br><span>--- a/src/host/trxcon/sched_clck.c</span><br><span>+++ b/src/host/trxcon/sched_clck.c</span><br><span>@@ -50,7 +50,7 @@</span><br><span>     struct trx_sched *sched = (struct trx_sched *) data;</span><br><span>         struct timespec tv_now, *tv_clock, elapsed;</span><br><span>  int64_t elapsed_us;</span><br><span style="color: hsl(0, 100%, 40%);">-     const struct timespec frame_duration = { .tv_sec = 0, .tv_nsec = FRAME_DURATION_uS * 1000 };</span><br><span style="color: hsl(120, 100%, 40%);">+  const struct timespec frame_duration = { .tv_sec = 0, .tv_nsec = GSM_TDMA_FN_DURATION_nS };</span><br><span> </span><br><span>      /* Check if transceiver is still alive */</span><br><span>    if (sched->fn_counter_lost++ == TRX_LOSS_FRAMES) {</span><br><span>@@ -68,7 +68,7 @@</span><br><span>    elapsed_us = (elapsed.tv_sec * 1000000) + (elapsed.tv_nsec / 1000);</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(DSCH, LOGL_NOTICE, "PC clock skew: "</span><br><span>                  "elapsed uS %" PRId64 "\n", elapsed_us);</span><br><span> </span><br><span>@@ -78,11 +78,11 @@</span><br><span>       }</span><br><span> </span><br><span>        /* Schedule next FN clock */</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>                timespecadd(tv_clock, &frame_duration, tv_clock);</span><br><span style="color: hsl(0, 100%, 40%);">-           elapsed_us -= FRAME_DURATION_uS;</span><br><span style="color: hsl(120, 100%, 40%);">+              elapsed_us -= GSM_TDMA_FN_DURATION_uS;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              TDMA_FN_INC(&sched->fn_counter_proc);</span><br><span style="color: hsl(120, 100%, 40%);">+          GSM_TDMA_FN_INC(sched->fn_counter_proc);</span><br><span> </span><br><span>              /* Call frame callback */</span><br><span>            if (sched->clock_cb)</span><br><span>@@ -90,7 +90,7 @@</span><br><span>  }</span><br><span> </span><br><span>        osmo_timer_schedule(&sched->clock_timer, 0,</span><br><span style="color: hsl(0, 100%, 40%);">-              FRAME_DURATION_uS - elapsed_us);</span><br><span style="color: hsl(120, 100%, 40%);">+              GSM_TDMA_FN_DURATION_uS - elapsed_us);</span><br><span> }</span><br><span> </span><br><span> static void sched_clck_correct(struct trx_sched *sched,</span><br><span>@@ -108,7 +108,7 @@</span><br><span> </span><br><span>         sched->clock_timer.cb = sched_clck_tick;</span><br><span>  sched->clock_timer.data = sched;</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_timer_schedule(&sched->clock_timer, 0, FRAME_DURATION_uS);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_timer_schedule(&sched->clock_timer, 0, GSM_TDMA_FN_DURATION_uS);</span><br><span> }</span><br><span> </span><br><span> int sched_clck_handle(struct trx_sched *sched, uint32_t fn)</span><br><span>@@ -140,10 +140,10 @@</span><br><span>         /* Calculate elapsed time / frames since last processed fn */</span><br><span>        timespecsub(&tv_now, tv_clock, &elapsed);</span><br><span>    elapsed_us = (elapsed.tv_sec * 1000000) + (elapsed.tv_nsec / 1000);</span><br><span style="color: hsl(0, 100%, 40%);">-     elapsed_fn = TDMA_FN_SUB(fn, sched->fn_counter_proc);</span><br><span style="color: hsl(120, 100%, 40%);">+      elapsed_fn = GSM_TDMA_FN_SUB(fn, sched->fn_counter_proc);</span><br><span> </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> </span><br><span>       /* Check for max clock skew */</span><br><span>       if (elapsed_fn > MAX_FN_SKEW || elapsed_fn < -MAX_FN_SKEW) {</span><br><span>@@ -155,7 +155,7 @@</span><br><span>     }</span><br><span> </span><br><span>        LOGP(DSCH, LOGL_INFO, "GSM clock jitter: %" PRId64 "\n",</span><br><span style="color: hsl(0, 100%, 40%);">-            elapsed_fn * FRAME_DURATION_uS - elapsed_us);</span><br><span style="color: hsl(120, 100%, 40%);">+         elapsed_fn * GSM_TDMA_FN_DURATION_uS - elapsed_us);</span><br><span> </span><br><span>      /* Too many frames have been processed already */</span><br><span>    if (elapsed_fn < 0) {</span><br><span>@@ -164,21 +164,21 @@</span><br><span>              * Set clock to the time or last FN should</span><br><span>            * have been transmitted</span><br><span>              */</span><br><span style="color: hsl(0, 100%, 40%);">-             duration.tv_nsec = (0 - elapsed_fn) * FRAME_DURATION_uS * 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+               duration.tv_nsec = (0 - elapsed_fn) * GSM_TDMA_FN_DURATION_nS;</span><br><span>               duration.tv_sec = duration.tv_nsec / 1000000000;</span><br><span>             duration.tv_nsec = duration.tv_nsec % 1000000000;</span><br><span>            timespecadd(&tv_now, &duration, tv_clock);</span><br><span> </span><br><span>               /* Set time to the time our next FN has to be transmitted */</span><br><span>                 osmo_timer_schedule(&sched->clock_timer, 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                      FRAME_DURATION_uS * (1 - elapsed_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+                        GSM_TDMA_FN_DURATION_uS * (1 - elapsed_fn));</span><br><span> </span><br><span>             return 0;</span><br><span>    }</span><br><span> </span><br><span>        /* Transmit what we still need to transmit */</span><br><span>        while (fn != sched->fn_counter_proc) {</span><br><span style="color: hsl(0, 100%, 40%);">-               TDMA_FN_INC(&sched->fn_counter_proc);</span><br><span style="color: hsl(120, 100%, 40%);">+          GSM_TDMA_FN_INC(sched->fn_counter_proc);</span><br><span> </span><br><span>              /* Call frame callback */</span><br><span>            if (sched->clock_cb)</span><br><span>@@ -187,7 +187,7 @@</span><br><span> </span><br><span>    /* Schedule next FN to be transmitted */</span><br><span>     *tv_clock = tv_now;</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_timer_schedule(&sched->clock_timer, 0, FRAME_DURATION_uS);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_timer_schedule(&sched->clock_timer, 0, GSM_TDMA_FN_DURATION_uS);</span><br><span> </span><br><span>     return 0;</span><br><span> }</span><br><span>diff --git a/src/host/trxcon/sched_lchan_tchh.c b/src/host/trxcon/sched_lchan_tchh.c</span><br><span>index 5edbfcd..b6f0708 100644</span><br><span>--- a/src/host/trxcon/sched_lchan_tchh.c</span><br><span>+++ b/src/host/trxcon/sched_lchan_tchh.c</span><br><span>@@ -171,8 +171,8 @@</span><br><span> #define BLOCK_FIRST_FN(map) \</span><br><span>   do { \</span><br><span>               if (map[i][ARRAY_SIZE(map[i]) - 1] == fn_mf) { \</span><br><span style="color: hsl(0, 100%, 40%);">-                        fn_diff = TDMA_FN_DIFF(fn_mf, map[i][0]); \</span><br><span style="color: hsl(0, 100%, 40%);">-                     return TDMA_FN_SUB(last_fn, fn_diff); \</span><br><span style="color: hsl(120, 100%, 40%);">+                       fn_diff = GSM_TDMA_FN_DIFF(fn_mf, map[i][0]); \</span><br><span style="color: hsl(120, 100%, 40%);">+                       return GSM_TDMA_FN_SUB(last_fn, fn_diff); \</span><br><span>          } \</span><br><span>  } while (++i < ARRAY_SIZE(map))</span><br><span> </span><br><span>diff --git a/src/host/trxcon/sched_trx.c b/src/host/trxcon/sched_trx.c</span><br><span>index e172610..b6087ef 100644</span><br><span>--- a/src/host/trxcon/sched_trx.c</span><br><span>+++ b/src/host/trxcon/sched_trx.c</span><br><span>@@ -68,8 +68,7 @@</span><br><span>           * Advance frame number, giving the transceiver more</span><br><span>                  * time until a burst must be transmitted...</span><br><span>                  */</span><br><span style="color: hsl(0, 100%, 40%);">-             fn = TDMA_FN_SUM(sched->fn_counter_proc,</span><br><span style="color: hsl(0, 100%, 40%);">-                     sched->fn_counter_advance);</span><br><span style="color: hsl(120, 100%, 40%);">+                fn = GSM_TDMA_FN_SUM(sched->fn_counter_proc, sched->fn_counter_advance);</span><br><span> </span><br><span>           /* Get frame from multiframe */</span><br><span>              offset = fn % ts->mf_layout->period;</span><br><span>@@ -636,7 +635,7 @@</span><br><span>     mf = lchan->ts->mf_layout;</span><br><span> </span><br><span>         /* How many frames elapsed since the last one? */</span><br><span style="color: hsl(0, 100%, 40%);">-       elapsed = TDMA_FN_SUB(fn, lchan->tdma.last_proc);</span><br><span style="color: hsl(120, 100%, 40%);">+  elapsed = GSM_TDMA_FN_SUB(fn, lchan->tdma.last_proc);</span><br><span>     if (elapsed > mf->period) {</span><br><span>            LOGP(DSCHD, LOGL_NOTICE, "Too many (>%u) contiguous TDMA frames elapsed (%u) "</span><br><span>                                   "since the last processed fn=%u\n", mf->period,</span><br><span>@@ -656,7 +655,7 @@</span><br><span> </span><br><span>      /* Traverse from fp till the current frame */</span><br><span>        for (i = 0; i < elapsed - 1; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          fp = &mf->frames[TDMA_FN_INC(&fake_meas.fn) % mf->period];</span><br><span style="color: hsl(120, 100%, 40%);">+              fp = &mf->frames[GSM_TDMA_FN_INC(fake_meas.fn) % mf->period];</span><br><span>              if (fp->dl_chan != lchan->type)</span><br><span>                        continue;</span><br><span> </span><br><span>diff --git a/src/host/trxcon/scheduler.h b/src/host/trxcon/scheduler.h</span><br><span>index e3c0cb0..43127cc 100644</span><br><span>--- a/src/host/trxcon/scheduler.h</span><br><span>+++ b/src/host/trxcon/scheduler.h</span><br><span>@@ -4,23 +4,7 @@</span><br><span> #include <time.h></span><br><span> </span><br><span> #include <osmocom/core/timer.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define FRAME_DURATION_uS      4615</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSM_SUPERFRAME              (26 * 51)</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSM_HYPERFRAME         (2048 * GSM_SUPERFRAME)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* TDMA frame number arithmetics */</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 + b) % GSM_HYPERFRAME)</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%);">-#define TDMA_FN_INC(fn) \</span><br><span style="color: hsl(0, 100%, 40%);">-    (*fn = TDMA_FN_SUM(*fn, 1))</span><br><span style="color: hsl(0, 100%, 40%);">-#define TDMA_FN_MIN(a, b) \</span><br><span style="color: hsl(0, 100%, 40%);">-  (a < b ? a : b)</span><br><span style="color: hsl(0, 100%, 40%);">-#define TDMA_FN_DIFF(a, b) \</span><br><span style="color: hsl(0, 100%, 40%);">-  TDMA_FN_MIN(TDMA_FN_SUB(a, b), TDMA_FN_SUB(b, a))</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm0502.h></span><br><span> </span><br><span> enum tdma_sched_clck_state {</span><br><span>        SCH_CLCK_STATE_WAIT,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/18872">change 18872</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/osmocom-bb/+/18872"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I49a043d8483e116cf2d91820edb511846175173f </div>
<div style="display:none"> Gerrit-Change-Number: 18872 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>