<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>