aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-03-24 10:41:04 +0100
committerHarald Welte <laforge@gnumonks.org>2017-04-06 18:41:01 +0200
commitbbe90fd6511c9a0abdb5f41d13c5ab0135b903f7 (patch)
tree70b1f03f31d9b84b1b1bf5f00787bc7cf2cadc6b
parente16b59357411ffa4903ac110ac4ce46d343e878d (diff)
sysmobts: Don't start with 0dBm TRX output power before ramping
In case a system has a high-gain external PA (like a 40dB PA) connected externally, we cannot simply switch the transceiver to 0 dBm in trx_init() only to then start the ramping at much lower levels once the PHJ completes in trx_init_compl_cb(). The result would be a short 0 + 40 dBm spike followed by later ramping. We want to avoid that spike, particularly its associated inrush current, so let's bring up the board with smething very conservative like -50 dBm, and then ramp from there. Change-Id: I0ad91fce64f65e0213c9fcfde3390ace519055db Fixes: SYS#3259
-rw-r--r--include/osmo-bts/tx_power.h2
-rw-r--r--src/common/bts.c2
-rw-r--r--src/common/tx_power.c15
-rw-r--r--src/osmo-bts-sysmo/oml.c6
-rw-r--r--tests/tx_power/tx_power_test.c8
5 files changed, 30 insertions, 3 deletions
diff --git a/include/osmo-bts/tx_power.h b/include/osmo-bts/tx_power.h
index 8d099bca..21887c7c 100644
--- a/include/osmo-bts/tx_power.h
+++ b/include/osmo-bts/tx_power.h
@@ -74,3 +74,5 @@ int get_p_trxout_actual_mdBm_lchan(struct gsm_lchan *lchan);
int power_ramp_start(struct gsm_bts_trx *trx, int p_total_tgt_mdBm, int bypass);
void power_trx_change_compl(struct gsm_bts_trx *trx, int p_trxout_cur_mdBm);
+
+int power_ramp_initial_power_mdBm(struct gsm_bts_trx *trx);
diff --git a/src/common/bts.c b/src/common/bts.c
index 9915e1ca..540caaa1 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -153,7 +153,7 @@ int bts_init(struct gsm_bts *bts)
}
}
/* Default values for the power adjustments */
- tpp->ramp.max_initial_pout_mdBm = to_mdB(23);
+ tpp->ramp.max_initial_pout_mdBm = to_mdB(0);
tpp->ramp.step_size_mdB = to_mdB(2);
tpp->ramp.step_interval_sec = 1;
}
diff --git a/src/common/tx_power.c b/src/common/tx_power.c
index c5179181..3dfe1f7e 100644
--- a/src/common/tx_power.c
+++ b/src/common/tx_power.c
@@ -289,3 +289,18 @@ int power_ramp_start(struct gsm_bts_trx *trx, int p_total_tgt_mdBm, int bypass)
return 0;
}
+
+/* determine the initial transceiver output power at start-up time */
+int power_ramp_initial_power_mdBm(struct gsm_bts_trx *trx)
+{
+ struct trx_power_params *tpp = &trx->power_params;
+ int pout_mdBm;
+
+ /* this is the maximum initial output on the antenna connector
+ * towards the antenna */
+ pout_mdBm = tpp->ramp.max_initial_pout_mdBm;
+
+ /* use this as input to compute transceiver board power
+ * (reflecting gains in internal/external amplifiers */
+ return get_p_trxout_eff_mdBm(trx, pout_mdBm);
+}
diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c
index 01752d18..776a50c4 100644
--- a/src/osmo-bts-sysmo/oml.c
+++ b/src/osmo-bts-sysmo/oml.c
@@ -389,6 +389,7 @@ static int trx_init(struct gsm_bts_trx *trx)
GsmL1_MphInitReq_t *mi_req;
GsmL1_DeviceParam_t *dev_par;
int femto_band;
+ int initial_mdBm = power_ramp_initial_power_mdBm(trx);
if (!gsm_abis_mo_check_attr(&trx->mo, trx_rqd_attr,
ARRAY_SIZE(trx_rqd_attr))) {
@@ -416,11 +417,12 @@ static int trx_init(struct gsm_bts_trx *trx)
dev_par->fRxPowerLevel = trx_ms_pwr_ctrl_is_osmo(trx)
? 0.0 : btsb->ul_power_target;
- dev_par->fTxPowerLevel = 0.0;
+ dev_par->fTxPowerLevel = ((float) initial_mdBm) / 1000;
LOGP(DL1C, LOGL_NOTICE, "Init TRX (ARFCN %u, TSC %u, RxPower % 2f dBm, "
"TxPower % 2.2f dBm\n", dev_par->u16Arfcn, dev_par->u8NbTsc,
dev_par->fRxPowerLevel, dev_par->fTxPowerLevel);
-
+ trx->power_params.p_total_cur_mdBm = trx->power_params.ramp.max_initial_pout_mdBm;
+
/* send MPH-INIT-REQ, wait for MPH-INIT-CNF */
return l1if_gsm_req_compl(fl1h, msg, trx_init_compl_cb, NULL);
}
diff --git a/tests/tx_power/tx_power_test.c b/tests/tx_power/tx_power_test.c
index d6573620..fb234095 100644
--- a/tests/tx_power/tx_power_test.c
+++ b/tests/tx_power/tx_power_test.c
@@ -44,6 +44,7 @@ static const struct trx_power_params tpp_1002 = {
.nominal_gain_mdB = 0,
},
.ramp = {
+ .max_initial_pout_mdBm = to_mdB(23),
.step_size_mdB = to_mdB(2),
.step_interval_sec = 1,
},
@@ -62,6 +63,7 @@ static const struct trx_power_params tpp_1020 = {
.nominal_gain_mdB = 0,
},
.ramp = {
+ .max_initial_pout_mdBm = to_mdB(0),
.step_size_mdB = to_mdB(2),
.step_interval_sec = 1,
},
@@ -80,6 +82,7 @@ static const struct trx_power_params tpp_1100 = {
.nominal_gain_mdB = 0,
},
.ramp = {
+ .max_initial_pout_mdBm = to_mdB(0),
.step_size_mdB = to_mdB(2),
.step_interval_sec = 1,
},
@@ -98,6 +101,7 @@ static const struct trx_power_params tpp_2050 = {
.nominal_gain_mdB = 0,
},
.ramp = {
+ .max_initial_pout_mdBm = to_mdB(0),
.step_size_mdB = to_mdB(2),
.step_interval_sec = 1,
},
@@ -108,6 +112,7 @@ static void test_sbts1002(struct gsm_bts_trx *trx)
printf("Testing tx_power calculation for sysmoBTS 1002\n");
trx->power_params = tpp_1002;
trx->max_power_red = 0;
+ OSMO_ASSERT(power_ramp_initial_power_mdBm(trx) == to_mdB(23));
OSMO_ASSERT(get_p_max_out_mdBm(trx) == to_mdB(23));
/* at max_power_red = 0, we expect full 23dBm */
OSMO_ASSERT(get_p_nominal_mdBm(trx) == to_mdB(23));
@@ -125,6 +130,7 @@ static void test_sbts1020(struct gsm_bts_trx *trx)
printf("Testing tx_power calculation for sysmoBTS 1020\n");
trx->power_params = tpp_1020;
trx->max_power_red = 0;
+ OSMO_ASSERT(power_ramp_initial_power_mdBm(trx) == to_mdB(-10));
OSMO_ASSERT(get_p_max_out_mdBm(trx) == to_mdB(33));
/* at max_power_red = 0, we expect full 33dBm */
OSMO_ASSERT(get_p_nominal_mdBm(trx) == to_mdB(33));
@@ -143,6 +149,7 @@ static void test_sbts1100(struct gsm_bts_trx *trx)
printf("Testing tx_power calculation for sysmoBTS 1100\n");
trx->power_params = tpp_1100;
trx->max_power_red = 0;
+ OSMO_ASSERT(power_ramp_initial_power_mdBm(trx) == to_mdB(-17));
OSMO_ASSERT(get_p_max_out_mdBm(trx) == to_mdB(40));
/* at max_power_red = 0, we expect full 33dBm */
OSMO_ASSERT(get_p_nominal_mdBm(trx) == to_mdB(40));
@@ -160,6 +167,7 @@ static void test_sbts2050(struct gsm_bts_trx *trx)
printf("Testing tx_power calculation for sysmoBTS 2050\n");
trx->power_params = tpp_2050;
trx->max_power_red = 0;
+ OSMO_ASSERT(power_ramp_initial_power_mdBm(trx) == to_mdB(0));
OSMO_ASSERT(get_p_max_out_mdBm(trx) == to_mdB(37));
/* at max_power_red = 0, we expect full 37dBm */
OSMO_ASSERT(get_p_nominal_mdBm(trx) == to_mdB(37));