From 1d9f6efccb2dfed52069910901ec8c8cc0d8de46 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Wed, 20 Nov 2019 19:02:25 +0100 Subject: power_control.c: Limit speed of announced MS Power Level value changes It's not a good idea to request big changes in MS Power based on sporadic bad signal received, let's instead change announced MS power levels more smoothly to avoid possible big signal strength fluctations, similar to what is already done in osmo-bts-trx specific loop (loops.c). Related: OS#1851 Change-Id: Iecc4ec7e21471ec853ad2d5659af4052aba5444c --- src/common/power_control.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/common/power_control.c b/src/common/power_control.c index d08ed5e5..d2a6c1dd 100644 --- a/src/common/power_control.c +++ b/src/common/power_control.c @@ -30,6 +30,11 @@ #include #include #include +#include + +/* how many dB do we raise/lower as maximum (1 ms power level = 2 dB) */ +#define MS_RAISE_MAX_DB 4 +#define MS_LOWER_MAX_DB 8 /*! compute the new MS POWER LEVEL communicated to the MS and store it in lchan. * \param lchan logical channel for which to compute (and in which to store) new power value. @@ -51,10 +56,6 @@ int lchan_ms_pwr_ctrl(struct gsm_lchan *lchan, if (lchan->ms_power_ctrl.fixed) return 0; - /* How many dBs measured power should be increased (+) or decreased (-) - to reach expected power. */ - diff = bts->ul_power_target - rxLevel; - current_dbm = ms_pwr_dbm(band, ms_power); if (current_dbm < 0) { LOGPLCHAN(lchan, DLOOP, LOGL_NOTICE, @@ -70,6 +71,18 @@ int lchan_ms_pwr_ctrl(struct gsm_lchan *lchan, return 0; } + /* How many dBs measured power should be increased (+) or decreased (-) + to reach expected power. */ + diff = bts->ul_power_target - rxLevel; + + /* don't ever change more than MS_{LOWER,RAISE}_MAX_DBM during one loop + iteration, i.e. reduce the speed at which the MS transmit power can + change. A higher value means a lower level (and vice versa) */ + if (diff > MS_RAISE_MAX_DB) + diff = MS_RAISE_MAX_DB; + else if (diff < -MS_LOWER_MAX_DB) + diff = -MS_LOWER_MAX_DB; + new_dbm = current_dbm + diff; /* Make sure new_dbm is never negative. ms_pwr_ctl_lvl() can later on -- cgit v1.2.3