<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/19124">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Move struct gsm_bts_trx: gsm_data.* & bts.* => trx.*<br><br>Move all struct gsm_bts_trx references from bulky gsm_data to its own<br>file containing all related definitions and implementations. Also move a<br>few functions clearly related to that object which were placed in bts.*<br><br>Change-Id: Iebaf5b221c48b571f45408af867ce6f9c0cd9f4a<br>---<br>M include/osmo-bts/Makefile.am<br>M include/osmo-bts/bts.h<br>M include/osmo-bts/gsm_data.h<br>M include/osmo-bts/phy_link.h<br>A include/osmo-bts/trx.h<br>M src/common/Makefile.am<br>M src/common/abis.c<br>M src/common/bts.c<br>M src/common/bts_ctrl_lookup.c<br>M src/common/gsm_data.c<br>M src/common/sysinfo.c<br>A src/common/trx.c<br>M src/common/tx_power.c<br>13 files changed, 283 insertions(+), 237 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/19124/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/Makefile.am b/include/osmo-bts/Makefile.am</span><br><span>index 310fce2..6f6b133 100644</span><br><span>--- a/include/osmo-bts/Makefile.am</span><br><span>+++ b/include/osmo-bts/Makefile.am</span><br><span>@@ -26,4 +26,5 @@</span><br><span>    phy_link.h \</span><br><span>         dtx_dl_amr_fsm.h \</span><br><span>   ta_control.h \</span><br><span style="color: hsl(120, 100%, 40%);">+        trx.h \</span><br><span>      $(NULL)</span><br><span>diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h</span><br><span>index cb8787f..4e3e41a 100644</span><br><span>--- a/include/osmo-bts/bts.h</span><br><span>+++ b/include/osmo-bts/bts.h</span><br><span>@@ -3,6 +3,10 @@</span><br><span> </span><br><span> #include <osmocom/core/rate_ctr.h></span><br><span> #include <osmo-bts/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/trx.h></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%);">+struct gsm_bts_trx;</span><br><span> </span><br><span> enum bts_global_status {</span><br><span>    BTS_STATUS_RF_ACTIVE,</span><br><span>@@ -318,12 +322,9 @@</span><br><span> struct gsm_bts *gsm_bts_num(struct gsm_network *net, int num);</span><br><span> </span><br><span> int bts_init(struct gsm_bts *bts);</span><br><span style="color: hsl(0, 100%, 40%);">-int bts_trx_init(struct gsm_bts_trx *trx);</span><br><span> void bts_shutdown(struct gsm_bts *bts, const char *reason);</span><br><span> </span><br><span> int bts_link_estab(struct gsm_bts *bts);</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_link_estab(struct gsm_bts_trx *trx);</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_set_available(struct gsm_bts_trx *trx, int avail);</span><br><span> </span><br><span> int bts_agch_enqueue(struct gsm_bts *bts, struct msgb *msg);</span><br><span> struct msgb *bts_agch_dequeue(struct gsm_bts *bts);</span><br><span>@@ -337,11 +338,8 @@</span><br><span> int lchan_init_lapdm(struct gsm_lchan *lchan);</span><br><span> </span><br><span> void load_timer_start(struct gsm_bts *bts);</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t num_agch(struct gsm_bts_trx *trx, const char * arg);</span><br><span> void bts_update_status(enum bts_global_status which, int on);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bool trx_ms_pwr_ctrl_is_osmo(struct gsm_bts_trx *trx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> struct gsm_time *get_time(struct gsm_bts *bts);</span><br><span> </span><br><span> int bts_main(int argc, char **argv);</span><br><span>diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h</span><br><span>index 0bb7761..0402f11 100644</span><br><span>--- a/include/osmo-bts/gsm_data.h</span><br><span>+++ b/include/osmo-bts/gsm_data.h</span><br><span>@@ -43,7 +43,6 @@</span><br><span> #define GSM_BTS_AGCH_QUEUE_HIGH_LEVEL_DEFAULT 91</span><br><span> </span><br><span> #define LOGPLCHAN(lchan, ss, lvl, fmt, args...) LOGP(ss, lvl, "%s " fmt, gsm_lchan_name(lchan), ## args)</span><br><span style="color: hsl(0, 100%, 40%);">-#define LOGPTRX(trx, ss, lvl, fmt, args...) LOGP(ss, lvl, "%s " fmt, gsm_trx_name(trx), ## args)</span><br><span> </span><br><span> struct gsm_network {</span><br><span>        struct llist_head bts_list;</span><br><span>@@ -339,53 +338,6 @@</span><br><span>   struct gsm_lchan lchan[TS_MAX_LCHAN];</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* One TRX in a BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_trx {</span><br><span style="color: hsl(0, 100%, 40%);">-       /* list header in bts->trx_list */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct llist_head list;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-    /* number of this TRX in the BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t nr;</span><br><span style="color: hsl(0, 100%, 40%);">-     /* human readable name / description */</span><br><span style="color: hsl(0, 100%, 40%);">- char *description;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* how do we talk RSL with this TRX? */</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t rsl_tei;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct e1inp_sign_link *rsl_link;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Some BTS (specifically Ericsson RBS) have a per-TRX OML Link */</span><br><span style="color: hsl(0, 100%, 40%);">-      struct e1inp_sign_link *oml_link;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct tlv_parsed nm_attr;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-  } bb_transc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    uint16_t arfcn;</span><br><span style="color: hsl(0, 100%, 40%);">- int nominal_power;              /* in dBm */</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned int max_power_red;     /* in actual dB */</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t max_power_backoff_8psk; /* in actual dB OC-2G only */</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t c0_idle_power_red;      /* in actual dB OC-2G only */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    struct trx_power_params power_params;</span><br><span style="color: hsl(0, 100%, 40%);">-   bool ms_pwr_ctl_soft; /* is power control loop done by osmocom software? */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                void *l1h;</span><br><span style="color: hsl(0, 100%, 40%);">-      } role_bts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     union {</span><br><span style="color: hsl(0, 100%, 40%);">-         struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                        unsigned int test_state;</span><br><span style="color: hsl(0, 100%, 40%);">-                        uint8_t test_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-                        struct rxlev_stats rxlev_stat;</span><br><span style="color: hsl(0, 100%, 40%);">-          } ipaccess;</span><br><span style="color: hsl(0, 100%, 40%);">-     };</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_bts_trx_ts ts[TRX_NR_TS];</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #define GSM_LCHAN_SI(lchan, i) (void *)((lchan)->si.buf[i][0])</span><br><span> </span><br><span> enum gprs_rlc_par {</span><br><span>@@ -424,16 +376,12 @@</span><br><span>  * OML connection will cause a special warning to be logged. */</span><br><span> #define OSMO_BTS_OML_CONN_EARLY_DISCONNECT 10       /* in seconds */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts);</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> </span><br><span> extern const struct value_string gsm_pchant_names[13];</span><br><span> extern const struct value_string gsm_pchant_descs[13];</span><br><span> const char *gsm_pchan_name(enum gsm_phys_chan_config c);</span><br><span> enum gsm_phys_chan_config gsm_pchan_parse(const char *name);</span><br><span> const char *gsm_lchant_name(enum gsm_chan_t c);</span><br><span style="color: hsl(0, 100%, 40%);">-char *gsm_trx_name(const struct gsm_bts_trx *trx);</span><br><span> char *gsm_ts_name(const struct gsm_bts_trx_ts *ts);</span><br><span> char *gsm_ts_and_pchan_name(const struct gsm_bts_trx_ts *ts);</span><br><span> char *gsm_lchan_name_compute(const struct gsm_lchan *lchan);</span><br><span>@@ -458,7 +406,6 @@</span><br><span> enum gsm_phys_chan_config ts_pchan(struct gsm_bts_trx_ts *ts);</span><br><span> uint8_t ts_subslots(struct gsm_bts_trx_ts *ts);</span><br><span> bool ts_is_tch(struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(0, 100%, 40%);">-const char *gsm_trx_unit_id(struct gsm_bts_trx *trx);</span><br><span> </span><br><span> int lchan2ecu_codec(const struct gsm_lchan *lchan);</span><br><span> </span><br><span>diff --git a/include/osmo-bts/phy_link.h b/include/osmo-bts/phy_link.h</span><br><span>index 2a53d91..8e75342 100644</span><br><span>--- a/include/osmo-bts/phy_link.h</span><br><span>+++ b/include/osmo-bts/phy_link.h</span><br><span>@@ -5,11 +5,12 @@</span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> </span><br><span> #include <osmo-bts/scheduler.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/trx.h></span><br><span> </span><br><span> #include <linux/if_packet.h></span><br><span> #include "btsconfig.h"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_trx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct virt_um_inst;</span><br><span> </span><br><span> enum phy_link_type {</span><br><span>diff --git a/include/osmo-bts/trx.h b/include/osmo-bts/trx.h</span><br><span>new file mode 100644</span><br><span>index 0000000..ae87528</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmo-bts/trx.h</span><br><span>@@ -0,0 +1,65 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* One TRX in a BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* list header in bts->trx_list */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct llist_head list;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* number of this TRX in the BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t nr;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* human readable name / description */</span><br><span style="color: hsl(120, 100%, 40%);">+       char *description;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* how do we talk RSL with this TRX? */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t rsl_tei;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct e1inp_sign_link *rsl_link;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Some BTS (specifically Ericsson RBS) have a per-TRX OML Link */</span><br><span style="color: hsl(120, 100%, 40%);">+    struct e1inp_sign_link *oml_link;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct tlv_parsed nm_attr;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+        } bb_transc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t arfcn;</span><br><span style="color: hsl(120, 100%, 40%);">+       int nominal_power;              /* in dBm */</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int max_power_red;     /* in actual dB */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t max_power_backoff_8psk; /* in actual dB OC-2G only */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t c0_idle_power_red;      /* in actual dB OC-2G only */</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%);">+  struct trx_power_params power_params;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool ms_pwr_ctl_soft; /* is power control loop done by osmocom software? */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              void *l1h;</span><br><span style="color: hsl(120, 100%, 40%);">+    } role_bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ union {</span><br><span style="color: hsl(120, 100%, 40%);">+               struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                      unsigned int test_state;</span><br><span style="color: hsl(120, 100%, 40%);">+                      uint8_t test_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+                      struct rxlev_stats rxlev_stat;</span><br><span style="color: hsl(120, 100%, 40%);">+                } ipaccess;</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts_trx_ts ts[TRX_NR_TS];</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts);</span><br><span style="color: hsl(120, 100%, 40%);">+int bts_trx_init(struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num);</span><br><span style="color: hsl(120, 100%, 40%);">+char *gsm_trx_name(const struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+const char *gsm_trx_unit_id(struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_link_estab(struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_set_available(struct gsm_bts_trx *trx, int avail);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t num_agch(struct gsm_bts_trx *trx, const char * arg);</span><br><span style="color: hsl(120, 100%, 40%);">+bool trx_ms_pwr_ctrl_is_osmo(struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define LOGPTRX(trx, ss, lvl, fmt, args...) LOGP(ss, lvl, "%s " fmt, gsm_trx_name(trx), ## args)</span><br><span>diff --git a/src/common/Makefile.am b/src/common/Makefile.am</span><br><span>index 2fa5514..348dd97 100644</span><br><span>--- a/src/common/Makefile.am</span><br><span>+++ b/src/common/Makefile.am</span><br><span>@@ -36,6 +36,7 @@</span><br><span>        dtx_dl_amr_fsm.c \</span><br><span>   scheduler_mframe.c \</span><br><span>         ta_control.c \</span><br><span style="color: hsl(120, 100%, 40%);">+        trx.c \</span><br><span>      $(NULL)</span><br><span> </span><br><span> libl1sched_a_SOURCES = scheduler.c</span><br><span>diff --git a/src/common/abis.c b/src/common/abis.c</span><br><span>index ad6fddc..bac1179 100644</span><br><span>--- a/src/common/abis.c</span><br><span>+++ b/src/common/abis.c</span><br><span>@@ -49,6 +49,7 @@</span><br><span> #include <osmo-bts/rsl.h></span><br><span> #include <osmo-bts/oml.h></span><br><span> #include <osmo-bts/bts_model.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/trx.h></span><br><span> </span><br><span> static struct gsm_bts *g_bts;</span><br><span> </span><br><span>diff --git a/src/common/bts.c b/src/common/bts.c</span><br><span>index 2f6a700..983f61d 100644</span><br><span>--- a/src/common/bts.c</span><br><span>+++ b/src/common/bts.c</span><br><span>@@ -383,40 +383,6 @@</span><br><span>  return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Initialize the TRX data structures, called before config</span><br><span style="color: hsl(0, 100%, 40%);">- * file reading */</span><br><span style="color: hsl(0, 100%, 40%);">-int bts_trx_init(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      /* initialize bts data structure */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct trx_power_params *tpp = &trx->power_params;</span><br><span style="color: hsl(0, 100%, 40%);">-       int rc, i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               struct gsm_bts_trx_ts *ts = &trx->ts[i];</span><br><span style="color: hsl(0, 100%, 40%);">-         int k;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          for (k = 0; k < ARRAY_SIZE(ts->lchan); k++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     struct gsm_lchan *lchan = &ts->lchan[k];</span><br><span style="color: hsl(0, 100%, 40%);">-                 INIT_LLIST_HEAD(&lchan->dl_tch_queue);</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Default values for the power adjustments */</span><br><span style="color: hsl(0, 100%, 40%);">-  tpp->ramp.max_initial_pout_mdBm = to_mdB(0);</span><br><span style="color: hsl(0, 100%, 40%);">- tpp->ramp.step_size_mdB = to_mdB(2);</span><br><span style="color: hsl(0, 100%, 40%);">- tpp->ramp.step_interval_sec = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* IF BTS model doesn't DSP/HW support MS Power Control Loop, enable osmo algo by default: */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!bts_internal_flag_get(trx->bts, BTS_INTERNAL_FLAG_MS_PWR_CTRL_DSP))</span><br><span style="color: hsl(0, 100%, 40%);">-             trx->ms_pwr_ctl_soft = true;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bts_model_trx_init(trx);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_del(&trx->list);</span><br><span style="color: hsl(0, 100%, 40%);">-           return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* main link is established, send status report */</span><br><span> int bts_link_estab(struct gsm_bts *bts)</span><br><span> {</span><br><span>@@ -451,55 +417,6 @@</span><br><span>      return bts_model_oml_estab(bts);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* RSL link is established, send status report */</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_link_estab(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct e1inp_sign_link *link = trx->rsl_link;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t radio_state = link ?  NM_OPSTATE_ENABLED : NM_OPSTATE_DISABLED;</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DSUM, LOGL_INFO, "RSL link (TRX %02x) state changed to %s, sending Status'.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-              trx->nr, link ? "up" : "down");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  oml_mo_state_chg(&trx->mo, radio_state, NM_AVSTATE_OK);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (link)</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = rsl_tx_rf_res(trx);</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-            rc = bts_model_trx_deact_rf(trx);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                oml_tx_failure_event_rep(&trx->bb_transc.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_RSL_FAIL,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       link ?</span><br><span style="color: hsl(0, 100%, 40%);">-                                  "Failed to establish RSL link (%d)" :</span><br><span style="color: hsl(0, 100%, 40%);">-                                         "Failed to deactivate RF (%d)", rc);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* set the availability of the TRX (used by PHY driver) */</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_set_available(struct gsm_bts_trx *trx, int avail)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  int tn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DSUM, LOGL_INFO, "TRX(%d): Setting available = %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-            trx->nr, avail);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (avail) {</span><br><span style="color: hsl(0, 100%, 40%);">-            int op_state = trx->rsl_link ?  NM_OPSTATE_ENABLED : NM_OPSTATE_DISABLED;</span><br><span style="color: hsl(0, 100%, 40%);">-            oml_mo_state_chg(&trx->mo, op_state, NM_AVSTATE_OK);</span><br><span style="color: hsl(0, 100%, 40%);">-             oml_mo_state_chg(&trx->bb_transc.mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(0, 100%, 40%);">-         for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++)</span><br><span style="color: hsl(0, 100%, 40%);">-                      oml_mo_state_chg(&trx->ts[tn].mo, op_state, NM_AVSTATE_OK);</span><br><span style="color: hsl(0, 100%, 40%);">-      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                oml_mo_state_chg(&trx->mo,  NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);</span><br><span style="color: hsl(0, 100%, 40%);">-              oml_mo_state_chg(&trx->bb_transc.mo, -1, NM_AVSTATE_NOT_INSTALLED);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++)</span><br><span style="color: hsl(0, 100%, 40%);">-                      oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* prepare the per-SAPI T200 arrays for a given lchan */</span><br><span> static int t200_by_lchan(int *t200_ms_dcch, int *t200_ms_acch, struct gsm_lchan *lchan)</span><br><span> {</span><br><span>@@ -899,11 +816,6 @@</span><br><span>        return sup > 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bool trx_ms_pwr_ctrl_is_osmo(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       return trx->ms_pwr_ctl_soft;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> struct gsm_time *get_time(struct gsm_bts *bts)</span><br><span> {</span><br><span>      return &bts->gsm_time;</span><br><span>diff --git a/src/common/bts_ctrl_lookup.c b/src/common/bts_ctrl_lookup.c</span><br><span>index f0157e9..e9b06f4 100644</span><br><span>--- a/src/common/bts_ctrl_lookup.c</span><br><span>+++ b/src/common/bts_ctrl_lookup.c</span><br><span>@@ -28,6 +28,7 @@</span><br><span> #include <osmo-bts/logging.h></span><br><span> #include <osmo-bts/gsm_data.h></span><br><span> #include <osmo-bts/control_if.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/trx.h></span><br><span> </span><br><span> extern vector ctrl_node_vec;</span><br><span> </span><br><span>diff --git a/src/common/gsm_data.c b/src/common/gsm_data.c</span><br><span>index c63793c..d26cb1a 100644</span><br><span>--- a/src/common/gsm_data.c</span><br><span>+++ b/src/common/gsm_data.c</span><br><span>@@ -37,6 +37,7 @@</span><br><span> </span><br><span> #include <osmo-bts/gsm_data.h></span><br><span> #include <osmo-bts/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/trx.h></span><br><span> </span><br><span> const struct value_string gsm_pchant_names[13] = {</span><br><span>      { GSM_PCHAN_NONE,       "NONE" },</span><br><span>@@ -103,88 +104,8 @@</span><br><span>   return get_value_string(lchan_s_names, s);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_bts_trx *trx = talloc_zero(bts, struct gsm_bts_trx);</span><br><span style="color: hsl(0, 100%, 40%);">- int k;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!trx)</span><br><span style="color: hsl(0, 100%, 40%);">-               return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    trx->bts = bts;</span><br><span style="color: hsl(0, 100%, 40%);">-      trx->nr = bts->num_trx++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_mo_init(&trx->mo, bts, NM_OC_RADIO_CARRIER,</span><br><span style="color: hsl(0, 100%, 40%);">-              bts->nr, trx->nr, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      gsm_mo_init(&trx->bb_transc.mo, bts, NM_OC_BASEB_TRANSC,</span><br><span style="color: hsl(0, 100%, 40%);">-             bts->nr, trx->nr, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      for (k = 0; k < TRX_NR_TS; k++) {</span><br><span style="color: hsl(0, 100%, 40%);">-            struct gsm_bts_trx_ts *ts = &trx->ts[k];</span><br><span style="color: hsl(0, 100%, 40%);">-         int l;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          ts->trx = trx;</span><br><span style="color: hsl(0, 100%, 40%);">-               ts->nr = k;</span><br><span style="color: hsl(0, 100%, 40%);">-          ts->pchan = GSM_PCHAN_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">-          ts->dyn.pchan_is = GSM_PCHAN_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">-           ts->dyn.pchan_want = GSM_PCHAN_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">-         ts->tsc = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                gsm_mo_init(&ts->mo, bts, NM_OC_CHANNEL,</span><br><span style="color: hsl(0, 100%, 40%);">-                     bts->nr, trx->nr, ts->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         for (l = 0; l < TS_MAX_LCHAN; l++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 struct gsm_lchan *lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-                        char *name;</span><br><span style="color: hsl(0, 100%, 40%);">-                     lchan = &ts->lchan[l];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                   lchan->ts = ts;</span><br><span style="color: hsl(0, 100%, 40%);">-                      lchan->nr = l;</span><br><span style="color: hsl(0, 100%, 40%);">-                       lchan->type = GSM_LCHAN_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                        name = gsm_lchan_name_compute(lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-                   lchan->name = talloc_strdup(trx, name);</span><br><span style="color: hsl(0, 100%, 40%);">-                      INIT_LLIST_HEAD(&lchan->sapi_cmds);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (trx->nr != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            trx->nominal_power = bts->c0->nominal_power;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   llist_add_tail(&trx->list, &bts->trx_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return trx;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (num >= bts->num_trx)</span><br><span style="color: hsl(0, 100%, 40%);">-          return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (trx->nr == num)</span><br><span style="color: hsl(0, 100%, 40%);">-                  return trx;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static char ts2str[255];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-char *gsm_trx_name(const struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- if (!trx)</span><br><span style="color: hsl(0, 100%, 40%);">-               snprintf(ts2str, sizeof(ts2str), "(trx=NULL)");</span><br><span style="color: hsl(0, 100%, 40%);">-       else</span><br><span style="color: hsl(0, 100%, 40%);">-            snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d)",</span><br><span style="color: hsl(0, 100%, 40%);">-                    trx->bts->nr, trx->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return ts2str;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> </span><br><span> char *gsm_ts_name(const struct gsm_bts_trx_ts *ts)</span><br><span> {</span><br><span>@@ -459,15 +380,6 @@</span><br><span>        return pchan_is_tch(ts_pchan(ts));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-const char *gsm_trx_unit_id(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        static char buf[23];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    snprintf(buf, sizeof(buf), "%u/%u/%u", trx->bts->ip_access.site_id,</span><br><span style="color: hsl(0, 100%, 40%);">-             trx->bts->ip_access.bts_id, trx->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-  return buf;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> const struct value_string lchan_ciph_state_names[] = {</span><br><span>       { LCHAN_CIPH_NONE,      "NONE" },</span><br><span>  { LCHAN_CIPH_RX_REQ,    "RX_REQ" },</span><br><span>diff --git a/src/common/sysinfo.c b/src/common/sysinfo.c</span><br><span>index 4a86c4e..751fb12 100644</span><br><span>--- a/src/common/sysinfo.c</span><br><span>+++ b/src/common/sysinfo.c</span><br><span>@@ -26,6 +26,7 @@</span><br><span> #include <osmo-bts/gsm_data.h></span><br><span> #include <osmo-bts/pcu_if.h></span><br><span> #include <osmo-bts/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/trx.h></span><br><span> </span><br><span> /* properly increment SI2q index and return SI2q data for scheduling */</span><br><span> static inline uint8_t *get_si2q_inc_index(struct gsm_bts *bts)</span><br><span>diff --git a/src/common/trx.c b/src/common/trx.c</span><br><span>new file mode 100644</span><br><span>index 0000000..074cb95</span><br><span>--- /dev/null</span><br><span>+++ b/src/common/trx.c</span><br><span>@@ -0,0 +1,205 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2008-2010 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/trx.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/bts_model.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/rsl.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts_trx *trx = talloc_zero(bts, struct gsm_bts_trx);</span><br><span style="color: hsl(120, 100%, 40%);">+       int k;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!trx)</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        trx->bts = bts;</span><br><span style="color: hsl(120, 100%, 40%);">+    trx->nr = bts->num_trx++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     gsm_mo_init(&trx->mo, bts, NM_OC_RADIO_CARRIER,</span><br><span style="color: hsl(120, 100%, 40%);">+                    bts->nr, trx->nr, 0xff);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  gsm_mo_init(&trx->bb_transc.mo, bts, NM_OC_BASEB_TRANSC,</span><br><span style="color: hsl(120, 100%, 40%);">+                   bts->nr, trx->nr, 0xff);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  for (k = 0; k < TRX_NR_TS; k++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct gsm_bts_trx_ts *ts = &trx->ts[k];</span><br><span style="color: hsl(120, 100%, 40%);">+               int l;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              ts->trx = trx;</span><br><span style="color: hsl(120, 100%, 40%);">+             ts->nr = k;</span><br><span style="color: hsl(120, 100%, 40%);">+                ts->pchan = GSM_PCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+                ts->dyn.pchan_is = GSM_PCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+         ts->dyn.pchan_want = GSM_PCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+               ts->tsc = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            gsm_mo_init(&ts->mo, bts, NM_OC_CHANNEL,</span><br><span style="color: hsl(120, 100%, 40%);">+                           bts->nr, trx->nr, ts->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             for (l = 0; l < TS_MAX_LCHAN; l++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       struct gsm_lchan *lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+                      char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+                   lchan = &ts->lchan[l];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       lchan->ts = ts;</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan->nr = l;</span><br><span style="color: hsl(120, 100%, 40%);">+                     lchan->type = GSM_LCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                    name = gsm_lchan_name_compute(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                 lchan->name = talloc_strdup(trx, name);</span><br><span style="color: hsl(120, 100%, 40%);">+                    INIT_LLIST_HEAD(&lchan->sapi_cmds);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (trx->nr != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          trx->nominal_power = bts->c0->nominal_power;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       llist_add_tail(&trx->list, &bts->trx_list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return trx;</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%);">+/* Initialize the TRX data structures, called before config</span><br><span style="color: hsl(120, 100%, 40%);">+ * file reading */</span><br><span style="color: hsl(120, 100%, 40%);">+int bts_trx_init(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       /* initialize bts data structure */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct trx_power_params *tpp = &trx->power_params;</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc, i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             struct gsm_bts_trx_ts *ts = &trx->ts[i];</span><br><span style="color: hsl(120, 100%, 40%);">+               int k;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              for (k = 0; k < ARRAY_SIZE(ts->lchan); k++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   struct gsm_lchan *lchan = &ts->lchan[k];</span><br><span style="color: hsl(120, 100%, 40%);">+                       INIT_LLIST_HEAD(&lchan->dl_tch_queue);</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%);">+     /* Default values for the power adjustments */</span><br><span style="color: hsl(120, 100%, 40%);">+        tpp->ramp.max_initial_pout_mdBm = to_mdB(0);</span><br><span style="color: hsl(120, 100%, 40%);">+       tpp->ramp.step_size_mdB = to_mdB(2);</span><br><span style="color: hsl(120, 100%, 40%);">+       tpp->ramp.step_interval_sec = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* IF BTS model doesn't DSP/HW support MS Power Control Loop, enable osmo algo by default: */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!bts_internal_flag_get(trx->bts, BTS_INTERNAL_FLAG_MS_PWR_CTRL_DSP))</span><br><span style="color: hsl(120, 100%, 40%);">+           trx->ms_pwr_ctl_soft = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = bts_model_trx_init(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_del(&trx->list);</span><br><span style="color: hsl(120, 100%, 40%);">+         return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</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%);">+struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (num >= bts->num_trx)</span><br><span style="color: hsl(120, 100%, 40%);">+                return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (trx->nr == num)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return trx;</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%);">+   return NULL;</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%);">+static char ts2str[255];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+char *gsm_trx_name(const struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!trx)</span><br><span style="color: hsl(120, 100%, 40%);">+             snprintf(ts2str, sizeof(ts2str), "(trx=NULL)");</span><br><span style="color: hsl(120, 100%, 40%);">+     else</span><br><span style="color: hsl(120, 100%, 40%);">+          snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d)",</span><br><span style="color: hsl(120, 100%, 40%);">+                  trx->bts->nr, trx->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return ts2str;</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%);">+const char *gsm_trx_unit_id(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  static char buf[23];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        snprintf(buf, sizeof(buf), "%u/%u/%u", trx->bts->ip_access.site_id,</span><br><span style="color: hsl(120, 100%, 40%);">+           trx->bts->ip_access.bts_id, trx->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+        return buf;</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%);">+/* RSL link is established, send status report */</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_link_estab(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct e1inp_sign_link *link = trx->rsl_link;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t radio_state = link ?  NM_OPSTATE_ENABLED : NM_OPSTATE_DISABLED;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DSUM, LOGL_INFO, "RSL link (TRX %02x) state changed to %s, sending Status'.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+            trx->nr, link ? "up" : "down");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      oml_mo_state_chg(&trx->mo, radio_state, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (link)</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = rsl_tx_rf_res(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = bts_model_trx_deact_rf(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              oml_tx_failure_event_rep(&trx->bb_transc.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_RSL_FAIL,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     link ?</span><br><span style="color: hsl(120, 100%, 40%);">+                                        "Failed to establish RSL link (%d)" :</span><br><span style="color: hsl(120, 100%, 40%);">+                                       "Failed to deactivate RF (%d)", rc);</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%);">+   return 0;</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%);">+/* set the availability of the TRX (used by PHY driver) */</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_set_available(struct gsm_bts_trx *trx, int avail)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int tn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DSUM, LOGL_INFO, "TRX(%d): Setting available = %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+          trx->nr, avail);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (avail) {</span><br><span style="color: hsl(120, 100%, 40%);">+          int op_state = trx->rsl_link ?  NM_OPSTATE_ENABLED : NM_OPSTATE_DISABLED;</span><br><span style="color: hsl(120, 100%, 40%);">+          oml_mo_state_chg(&trx->mo, op_state, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+           oml_mo_state_chg(&trx->bb_transc.mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+               for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++)</span><br><span style="color: hsl(120, 100%, 40%);">+                    oml_mo_state_chg(&trx->ts[tn].mo, op_state, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              oml_mo_state_chg(&trx->mo,  NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);</span><br><span style="color: hsl(120, 100%, 40%);">+            oml_mo_state_chg(&trx->bb_transc.mo, -1, NM_AVSTATE_NOT_INSTALLED);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++)</span><br><span style="color: hsl(120, 100%, 40%);">+                    oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool trx_ms_pwr_ctrl_is_osmo(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return trx->ms_pwr_ctl_soft;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/common/tx_power.c b/src/common/tx_power.c</span><br><span>index 8292d9f..3714c99 100644</span><br><span>--- a/src/common/tx_power.c</span><br><span>+++ b/src/common/tx_power.c</span><br><span>@@ -29,6 +29,7 @@</span><br><span> #include <osmo-bts/gsm_data.h></span><br><span> #include <osmo-bts/bts_model.h></span><br><span> #include <osmo-bts/tx_power.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/trx.h></span><br><span> </span><br><span> static int get_pa_drive_level_mdBm(const struct power_amp *pa,</span><br><span>                     int desired_p_out_mdBm, unsigned int arfcn)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/19124">change 19124</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/+/19124"/><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: Iebaf5b221c48b571f45408af867ce6f9c0cd9f4a </div>
<div style="display:none"> Gerrit-Change-Number: 19124 </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>