<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/16668">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">radioInterfaceMulti: Fail to tune on freq not following multi-arfcn restrictions<br><br>multi-arfcn feature uses a hardcoded disposition of logical channels on<br>a physical channel. Logical channels in the phisical channel are<br>separated by MCBTS_SPACING Hz, that is 4 GSM ARFCNs.<br><br>As a result, multi-arfcn restricts the TRX ARFCN setup to the following:<br>ARFCN(TRX0)=N, ARFCN(TRX1)=N+1*4, ARFCN(TRX2)=N+2*4, ...<br><br>Let's make sure radioInterfaceMulti verifies the requested Rx/Tx<br>frequencies for each logical channel over TRXC match the restriction<br>explained above. It will check freq going to be set is indeed separated<br>by MCBTS_SPACING from already set channels, making sure the ARFCN series<br>is consistent.<br><br>Otherwise, before this patch, one could set in osmo-bsc:<br>ARFCN(TRX0)=N, ARFCN(TRX1)=N+2<br><br>and osmo-trx would silently ack the related Rx/TxTUNE TRXC commands, but<br>actually still transmit on ARFCN N+4 instead. As a result, in this<br>scenario TRX!=0 were unusable with multi-arfcn.<br><br>Related: OS#4207<br>Change-Id: I2f3d66a611d3a489b3e4d9431994f4ec77b4460f<br>---<br>M Transceiver52M/radioInterface.h<br>M Transceiver52M/radioInterfaceMulti.cpp<br>2 files changed, 59 insertions(+), 22 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/68/16668/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Transceiver52M/radioInterface.h b/Transceiver52M/radioInterface.h</span><br><span>index d9fa414..e62441b 100644</span><br><span>--- a/Transceiver52M/radioInterface.h</span><br><span>+++ b/Transceiver52M/radioInterface.h</span><br><span>@@ -156,16 +156,24 @@</span><br><span>   void close();</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct freq_cfg_state {</span><br><span style="color: hsl(120, 100%, 40%);">+  bool set;</span><br><span style="color: hsl(120, 100%, 40%);">+  double freq_hz;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> class RadioInterfaceMulti : public RadioInterface {</span><br><span> private:</span><br><span>   bool pushBuffer();</span><br><span>   int pullBuffer();</span><br><span style="color: hsl(120, 100%, 40%);">+  bool verify_arfcn_consistency(double freq, size_t chan, bool tx);</span><br><span>   virtual double setTxGain(double dB, size_t chan);</span><br><span> </span><br><span>   signalVector *outerSendBuffer;</span><br><span>   signalVector *outerRecvBuffer;</span><br><span>   std::vector<signalVector *> history;</span><br><span>   std::vector<bool> active;</span><br><span style="color: hsl(120, 100%, 40%);">+  std::vector<struct freq_cfg_state> rxtune_st;</span><br><span style="color: hsl(120, 100%, 40%);">+  std::vector<struct freq_cfg_state> txtune_st;</span><br><span> </span><br><span>   Resampler *dnsampler;</span><br><span>   Resampler *upsampler;</span><br><span>diff --git a/Transceiver52M/radioInterfaceMulti.cpp b/Transceiver52M/radioInterfaceMulti.cpp</span><br><span>index 668305c..81a7c77 100644</span><br><span>--- a/Transceiver52M/radioInterfaceMulti.cpp</span><br><span>+++ b/Transceiver52M/radioInterfaceMulti.cpp</span><br><span>@@ -73,6 +73,8 @@</span><br><span>       powerScaling.resize(0);</span><br><span>      history.resize(0);</span><br><span>   active.resize(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     rxtune_st.resize(0);</span><br><span style="color: hsl(120, 100%, 40%);">+  txtune_st.resize(0);</span><br><span> </span><br><span>     RadioInterface::close();</span><br><span> }</span><br><span>@@ -148,6 +150,8 @@</span><br><span>  mReceiveFIFO.resize(mChans);</span><br><span>         powerScaling.resize(mChans);</span><br><span>         history.resize(mChans);</span><br><span style="color: hsl(120, 100%, 40%);">+       rxtune_st.resize(mChans);</span><br><span style="color: hsl(120, 100%, 40%);">+     txtune_st.resize(mChans);</span><br><span>    active.resize(MCHANS, false);</span><br><span> </span><br><span>    inchunk = RESAMP_INRATE * 4;</span><br><span>@@ -362,42 +366,67 @@</span><br><span>         return fabs(a - b) < FREQ_DELTA_LIMIT ? true : false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+bool RadioInterfaceMulti::verify_arfcn_consistency(double freq, size_t chan, bool tx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   double freq_i;</span><br><span style="color: hsl(120, 100%, 40%);">+        std::string str_dir = tx ? "Tx" : "Rx";</span><br><span style="color: hsl(120, 100%, 40%);">+   std::vector<struct freq_cfg_state> &v = tx ? txtune_st : rxtune_st;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       for (size_t i = 0; i < mChans; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (i == chan)</span><br><span style="color: hsl(120, 100%, 40%);">+                        continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!v[i].set)</span><br><span style="color: hsl(120, 100%, 40%);">+                        continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           freq_i = v[i].freq_hz + (double) ((int)chan - (int)i) * MCBTS_SPACING;</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!fltcmp(freq, freq_i)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGCHAN(chan, DMAIN, ERROR)</span><br><span style="color: hsl(120, 100%, 40%);">+                           << "Setting " << str_dir << " frequency " << freq</span><br><span style="color: hsl(120, 100%, 40%);">+                         << " is incompatible: already configured channel "</span><br><span style="color: hsl(120, 100%, 40%);">+                            << i << " uses frequency " << v[i].freq_hz</span><br><span style="color: hsl(120, 100%, 40%);">+                                << " (expected " << freq_i << ")";</span><br><span style="color: hsl(120, 100%, 40%);">+                      return false;</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%);">+     v[chan].set = true;</span><br><span style="color: hsl(120, 100%, 40%);">+   v[chan].freq_hz = freq;</span><br><span style="color: hsl(120, 100%, 40%);">+       return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> bool RadioInterfaceMulti::tuneTx(double freq, size_t chan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  if (chan >= mChans)</span><br><span style="color: hsl(0, 100%, 40%);">-    return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ double shift;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  double shift = (double) getFreqShift(mChans);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (chan >= mChans)</span><br><span style="color: hsl(120, 100%, 40%);">+                return false;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (!chan)</span><br><span style="color: hsl(0, 100%, 40%);">-    return mDevice->setTxFreq(freq + shift * MCBTS_SPACING);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!verify_arfcn_consistency(freq, chan, true))</span><br><span style="color: hsl(120, 100%, 40%);">+              return false;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  double center = mDevice->getTxFreq();</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!fltcmp(freq, center + (double) (chan - shift) * MCBTS_SPACING)) {</span><br><span style="color: hsl(0, 100%, 40%);">-    LOG(NOTICE) << "Channel " << chan << " RF Tx frequency offset is "</span><br><span style="color: hsl(0, 100%, 40%);">-                << freq / 1e6 << " MHz";</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(120, 100%, 40%);">+      if (chan == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              shift = (double) getFreqShift(mChans);</span><br><span style="color: hsl(120, 100%, 40%);">+                return mDevice->setTxFreq(freq + shift * MCBTS_SPACING);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  return true;</span><br><span style="color: hsl(120, 100%, 40%);">+   return true;</span><br><span> }</span><br><span> </span><br><span> bool RadioInterfaceMulti::tuneRx(double freq, size_t chan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  if (chan >= mChans)</span><br><span style="color: hsl(0, 100%, 40%);">-    return false;</span><br><span style="color: hsl(120, 100%, 40%);">+     double shift;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  double shift = (double) getFreqShift(mChans);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (chan >= mChans)</span><br><span style="color: hsl(120, 100%, 40%);">+                return false;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (!chan)</span><br><span style="color: hsl(0, 100%, 40%);">-    return mDevice->setRxFreq(freq + shift * MCBTS_SPACING);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!verify_arfcn_consistency(freq, chan, false))</span><br><span style="color: hsl(120, 100%, 40%);">+             return false;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  double center = mDevice->getRxFreq();</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!fltcmp(freq, center + (double) (chan - shift) * MCBTS_SPACING)) {</span><br><span style="color: hsl(0, 100%, 40%);">-    LOG(NOTICE) << "Channel " << chan << " RF Rx frequency offset is "</span><br><span style="color: hsl(0, 100%, 40%);">-                << freq / 1e6 << " MHz";</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(120, 100%, 40%);">+      if (chan == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              shift = (double) getFreqShift(mChans);</span><br><span style="color: hsl(120, 100%, 40%);">+                return mDevice->setRxFreq(freq + shift * MCBTS_SPACING);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  return true;</span><br><span style="color: hsl(120, 100%, 40%);">+   return true;</span><br><span> }</span><br><span> </span><br><span> double RadioInterfaceMulti::setRxGain(double db, size_t chan)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/16668">change 16668</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-trx/+/16668"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I2f3d66a611d3a489b3e4d9431994f4ec77b4460f </div>
<div style="display:none"> Gerrit-Change-Number: 16668 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>