From bbe90fd6511c9a0abdb5f41d13c5ab0135b903f7 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Fri, 24 Mar 2017 10:41:04 +0100 Subject: 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 --- include/osmo-bts/tx_power.h | 2 ++ src/common/bts.c | 2 +- src/common/tx_power.c | 15 +++++++++++++++ src/osmo-bts-sysmo/oml.c | 6 ++++-- tests/tx_power/tx_power_test.c | 8 ++++++++ 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)); -- cgit v1.2.3