<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/24324">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">[VAMOS] osmo-bts-trx: implement and enable PDU batching for TRXDv2<br><br>This change implements TRXD PDU batching approach b), which is described<br>in section 25.3.4 of the user manual [1].  This approach is quite easy<br>to implement on the transceiver side, so we can enable it by default.<br><br>  .Example: datagram structure for combination b)<br>  ----<br>  +--------+----------------+---------+------------------------+<br>  | TRXN=N | TDMA FN=F TN=0 | BATCH=1 | Hard-/Soft-bits        |<br>  +--------+----------------+---------+------------------------+<br>  | TRXN=N | TDMA FN=F TN=1 | BATCH=1 | Hard-/Soft-bits        |<br>  +--------+----------------+---------+------------------------+<br>  | TRXN=N | TDMA FN=F TN=2 | BATCH=1 | Hard-/Soft-bits        |<br>  +--------+----------------+---------+------------------------+<br>  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>  +--------+----------------+---------+------------------------+<br>  | TRXN=N | TDMA FN=F TN=7 | BATCH=0 | Hard-/Soft-bits        |<br>  +--------+----------------+---------+------------------------+<br>  ----<br><br>Other PDU batching approaches can be introduced later.<br><br>[1] https://downloads.osmocom.org/docs/latest/osmobts-usermanual.pdf<br><br>Change-Id: I9b4cc8e10cd683b28d22e32890569484cd20372d<br>Related: SYS#4895, OS#4941<br>---<br>M include/osmo-bts/scheduler.h<br>M src/osmo-bts-trx/scheduler_trx.c<br>M src/osmo-bts-trx/trx_if.c<br>3 files changed, 23 insertions(+), 5 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/24/24324/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/scheduler.h b/include/osmo-bts/scheduler.h</span><br><span>index 3ea08d9..cf980bc 100644</span><br><span>--- a/include/osmo-bts/scheduler.h</span><br><span>+++ b/include/osmo-bts/scheduler.h</span><br><span>@@ -256,8 +256,6 @@</span><br><span>        size_t burst_len;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define TRX_BR_F_MORE_PDUS   (1 << 0)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /*! DL burst request with the corresponding meta info */</span><br><span> struct trx_dl_burst_req {</span><br><span>      uint8_t flags;          /*!< see TRX_BR_F_* */</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 2a37abb..fa5c719 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>@@ -143,6 +143,9 @@</span><br><span>                                 continue;</span><br><span>                    trx_if_send_burst(l1h, br);</span><br><span>          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Batch all timeslots into a single TRXD PDU */</span><br><span style="color: hsl(120, 100%, 40%);">+              trx_if_send_burst(l1h, NULL);</span><br><span>        }</span><br><span> }</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 8479d4c..13799d9 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>@@ -1071,6 +1071,7 @@</span><br><span> {</span><br><span>     uint8_t pdu_ver = l1h->config.trxd_pdu_ver_use;</span><br><span>   static uint8_t *buf = &trx_data_buf[0];</span><br><span style="color: hsl(120, 100%, 40%);">+   static uint8_t *last_pdu = NULL;</span><br><span>     static unsigned int pdu_num = 0;</span><br><span>     ssize_t snd_len, buf_len;</span><br><span> </span><br><span>@@ -1081,6 +1082,16 @@</span><br><span>               return -ENODEV;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Burst batching breaker */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (br == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (pdu_num > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                   goto sendall;</span><br><span style="color: hsl(120, 100%, 40%);">+         return -ENOMSG;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Pointer to the last encoded PDU */</span><br><span style="color: hsl(120, 100%, 40%);">+ last_pdu = &buf[0];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    switch (pdu_ver) {</span><br><span>   /* Both versions have the same PDU format */</span><br><span>         case 0: /* TRXDv0 */</span><br><span>@@ -1092,7 +1103,8 @@</span><br><span>                 break;</span><br><span>       case 2: /* TRXDv2 */</span><br><span>                 buf[0] = br->tn;</span><br><span style="color: hsl(0, 100%, 40%);">-             buf[1] = (br->trx_num & 0x3f) | (br->flags << 7);</span><br><span style="color: hsl(120, 100%, 40%);">+             /* BATCH.ind will be unset in the last PDU */</span><br><span style="color: hsl(120, 100%, 40%);">+         buf[1] = (br->trx_num & 0x3f) | (1 << 7);</span><br><span>               buf[2] = br->mts;</span><br><span>                 buf[3] = br->att;</span><br><span>                 buf[4] = (uint8_t) br->scpir;</span><br><span>@@ -1117,14 +1129,19 @@</span><br><span>   /* One more PDU in the buffer */</span><br><span>     pdu_num++;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* More PDUs to send? Batch them! */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (pdu_ver >= 2 && br->flags & TRX_BR_F_MORE_PDUS)</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TRXDv2: wait for the batching breaker */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (pdu_ver >= 2)</span><br><span>                 return 0;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+sendall:</span><br><span>      LOGPPHI(l1h->phy_inst, DTRX, LOGL_DEBUG,</span><br><span>          "Tx TRXDv%u datagram with %u PDU(s): fn=%u\n",</span><br><span>             pdu_ver, pdu_num, br->fn);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     /* TRXDv2: unset BATCH.ind in the last PDU */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (pdu_ver >= 2)</span><br><span style="color: hsl(120, 100%, 40%);">+          last_pdu[1] &= ~(1 << 7);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        buf_len = buf - &trx_data_buf[0];</span><br><span>        buf = &trx_data_buf[0];</span><br><span>  pdu_num = 0;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/24324">change 24324</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/+/24324"/><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: I9b4cc8e10cd683b28d22e32890569484cd20372d </div>
<div style="display:none"> Gerrit-Change-Number: 24324 </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>