aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2020-12-06 18:45:28 +0100
committerlaforge <laforge@osmocom.org>2020-12-09 21:39:52 +0000
commit675618b4f82ab2b47e84779fb167ac37faa9629c (patch)
tree66d931a21ba65900799cd8603de8cb387cf2f548
parent2b416d6d2b7b86fc04a8478f7a1a205d05349d24 (diff)
power_control: make raise/lower step limitation configurable
-rw-r--r--include/osmo-bts/bts.h4
-rw-r--r--include/osmo-bts/power_control.h4
-rw-r--r--src/common/bts.c3
-rw-r--r--src/common/power_control.c12
-rw-r--r--tests/power/bs_power_loop_test.c22
-rw-r--r--tests/power/bs_power_loop_test.err24
-rw-r--r--tests/power/bs_power_loop_test.ok22
-rw-r--r--tests/power/ms_power_loop_test.c9
8 files changed, 64 insertions, 36 deletions
diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h
index 48f404c9..2edc20ef 100644
--- a/include/osmo-bts/bts.h
+++ b/include/osmo-bts/bts.h
@@ -107,6 +107,10 @@ struct bts_power_ctrl_params {
int target_dbm;
/* Tolerated deviation from target */
int hysteresis_db;
+ /* How many dB do we raise power at maximum */
+ int raise_step_max_db;
+ /* How many dB do we lower power at maximum */
+ int lower_step_max_db;
/* RxLev filtering algorithm */
enum bts_pf_algo pf_algo;
/* (Optional) filtering parameters */
diff --git a/include/osmo-bts/power_control.h b/include/osmo-bts/power_control.h
index f2e14cfe..ab107b8d 100644
--- a/include/osmo-bts/power_control.h
+++ b/include/osmo-bts/power_control.h
@@ -3,6 +3,10 @@
#include <stdint.h>
#include <osmo-bts/gsm_data.h>
+/* How many dB do we raise/lower power as maximum */
+#define PWR_RAISE_MAX_DB 4
+#define PWR_LOWER_MAX_DB 8
+
int lchan_ms_pwr_ctrl(struct gsm_lchan *lchan,
const uint8_t ms_power_lvl,
const int8_t ul_rssi_dbm);
diff --git a/src/common/bts.c b/src/common/bts.c
index e021864b..ba244973 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -53,6 +53,7 @@
#include <osmo-bts/cbch.h>
#include <osmo-bts/bts_shutdown_fsm.h>
#include <osmo-bts/nm_common_fsm.h>
+#include <osmo-bts/power_control.h>
#define MIN_QUAL_RACH 50 /* minimum link quality (in centiBels) for Access Bursts */
#define MIN_QUAL_NORM -5 /* minimum link quality (in centiBels) for Normal Bursts */
@@ -334,6 +335,8 @@ int bts_init(struct gsm_bts *bts)
(struct bts_power_ctrl_params) {
.target_dbm = -75,
.hysteresis_db = 3, /* -78 .. -72 dBm */
+ .raise_step_max_db = PWR_RAISE_MAX_DB,
+ .lower_step_max_db = PWR_LOWER_MAX_DB,
.pf_algo = BTS_PF_ALGO_EWMA,
.pf = {
.ewma = {
diff --git a/src/common/power_control.c b/src/common/power_control.c
index d458a92b..a616f185 100644
--- a/src/common/power_control.c
+++ b/src/common/power_control.c
@@ -33,10 +33,6 @@
#include <osmo-bts/l1sap.h>
#include <osmo-bts/power_control.h>
-/* how many dB do we raise/lower as maximum (1 ms power level = 2 dB) */
-#define PWR_RAISE_MAX_DB 4
-#define PWR_LOWER_MAX_DB 8
-
/* We don't want to deal with floating point, so we scale up */
#define EWMA_SCALE_FACTOR 100
@@ -122,10 +118,10 @@ static int calc_delta(const struct bts_power_ctrl_params *params,
/* Don't ever change more than PWR_{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 (delta > PWR_RAISE_MAX_DB)
- delta = PWR_RAISE_MAX_DB;
- else if (delta < -PWR_LOWER_MAX_DB)
- delta = -PWR_LOWER_MAX_DB;
+ if (delta > params->raise_step_max_db)
+ delta = params->raise_step_max_db;
+ else if (delta < -params->lower_step_max_db)
+ delta = -params->lower_step_max_db;
return delta;
}
diff --git a/tests/power/bs_power_loop_test.c b/tests/power/bs_power_loop_test.c
index 2f60cc0a..fd931830 100644
--- a/tests/power/bs_power_loop_test.c
+++ b/tests/power/bs_power_loop_test.c
@@ -31,6 +31,15 @@
#define PWR_TEST_RXLEV_TARGET 30
+#define PWR_TEST_CFG_RXLEV_TARGET \
+ .target_dbm = -110 + PWR_TEST_RXLEV_TARGET
+
+/* NOTE: raise/lower values are intentionally swapped here,
+ * as it makes more sense in the context of BS Power Control. */
+#define PWR_TEST_CFG_RAISE_LOWER_MAX \
+ .raise_step_max_db = PWR_LOWER_MAX_DB, \
+ .lower_step_max_db = PWR_RAISE_MAX_DB
+
#define DL_MEAS_FULL(rxqual, rxlev) \
.rxqual_full = rxqual, \
.rxlev_full = rxlev
@@ -95,10 +104,15 @@ static void init_test(const char *name)
g_trx = gsm_bts_trx_alloc(g_bts);
OSMO_ASSERT(g_trx != NULL);
- g_bts->dl_power_ctrl.target_dbm = rxlev2dbm(PWR_TEST_RXLEV_TARGET);
g_bts->band = GSM_BAND_900;
g_bts->c0 = g_trx;
+ g_bts->dl_power_ctrl = g_bts->ul_power_ctrl = \
+ (struct bts_power_ctrl_params) {
+ PWR_TEST_CFG_RXLEV_TARGET,
+ PWR_TEST_CFG_RAISE_LOWER_MAX,
+ };
+
printf("\nStarting test case '%s'\n", name);
}
@@ -326,7 +340,8 @@ static const struct power_test_step TC_rxlev_hyst[] = {
/* Enable hysteresis */
{ .type = PWR_TEST_ST_SET_PARAMS,
.params = {
- .target_dbm = -110 + PWR_TEST_RXLEV_TARGET,
+ PWR_TEST_CFG_RXLEV_TARGET,
+ PWR_TEST_CFG_RAISE_LOWER_MAX,
.hysteresis_db = 3,
}
},
@@ -347,7 +362,8 @@ static const struct power_test_step TC_rxlev_pf_ewma[] = {
/* Enable EWMA based power filtering */
{ .type = PWR_TEST_ST_SET_PARAMS,
.params = {
- .target_dbm = -110 + PWR_TEST_RXLEV_TARGET, /* RxLev 30 */
+ PWR_TEST_CFG_RXLEV_TARGET,
+ PWR_TEST_CFG_RAISE_LOWER_MAX,
.pf_algo = BTS_PF_ALGO_EWMA,
.pf.ewma.alpha = 50,
}
diff --git a/tests/power/bs_power_loop_test.err b/tests/power/bs_power_loop_test.err
index 44d996e5..43063c09 100644
--- a/tests/power/bs_power_loop_test.err
+++ b/tests/power/bs_power_loop_test.err
@@ -7,29 +7,29 @@
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, target -80 dBm, delta 0 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 0 -> 8 dB (maximum 20 dB, target -80 dBm, delta -8 dB)
+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 0 -> 4 dB (maximum 20 dB, target -80 dBm, delta -4 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 8 -> 16 dB (maximum 20 dB, target -80 dBm, delta -8 dB)
+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 8 dB (maximum 20 dB, target -80 dBm, delta -4 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 16 -> 20 dB (maximum 20 dB, target -80 dBm, delta -8 dB)
+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 8 -> 12 dB (maximum 20 dB, target -80 dBm, delta -4 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 20 dB (maximum 20 dB, target -80 dBm, delta -8 dB)
+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 12 -> 16 dB (maximum 20 dB, target -80 dBm, delta -4 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 20 dB (maximum 20 dB, target -80 dBm, delta -8 dB)
+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 16 -> 20 dB (maximum 20 dB, target -80 dBm, delta -4 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 20 dB (maximum 20 dB, target -80 dBm, delta -8 dB)
+(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 20 dB (maximum 20 dB, target -80 dBm, delta -4 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 20 dB (maximum 20 dB, target -80 dBm, delta -8 dB)
+(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 20 dB (maximum 20 dB, target -80 dBm, delta -4 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 20 -> 16 dB (maximum 20 dB, target -80 dBm, delta 4 dB)
+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 20 -> 12 dB (maximum 20 dB, target -80 dBm, delta 8 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 16 -> 12 dB (maximum 20 dB, target -80 dBm, delta 4 dB)
+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 12 -> 4 dB (maximum 20 dB, target -80 dBm, delta 8 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 12 -> 8 dB (maximum 20 dB, target -80 dBm, delta 4 dB)
+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 0 dB (maximum 20 dB, target -80 dBm, delta 8 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 8 -> 4 dB (maximum 20 dB, target -80 dBm, delta 4 dB)
+(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, target -80 dBm, delta 8 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 0 dB (maximum 20 dB, target -80 dBm, delta 4 dB)
+(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, target -80 dBm, delta 8 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, target -80 dBm, delta 0 dB)
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
diff --git a/tests/power/bs_power_loop_test.ok b/tests/power/bs_power_loop_test.ok
index fe2eb78d..acaad824 100644
--- a/tests/power/bs_power_loop_test.ok
+++ b/tests/power/bs_power_loop_test.ok
@@ -39,19 +39,19 @@ Starting test case 'TC_rxlev_max_min'
#00 exec_power_step() <- State (re)set (current 0 dB, max 20 dB)
#01 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)
#01 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#01 lchan_bs_pwr_ctrl() -> BS power reduction: 0 -> 8 (expected 4)
+#01 lchan_bs_pwr_ctrl() -> BS power reduction: 0 -> 4 (expected 4)
#02 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)
#02 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#02 lchan_bs_pwr_ctrl() -> BS power reduction: 8 -> 16 (expected 8)
+#02 lchan_bs_pwr_ctrl() -> BS power reduction: 4 -> 8 (expected 8)
#03 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)
#03 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#03 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 20 (expected 12)
+#03 lchan_bs_pwr_ctrl() -> BS power reduction: 8 -> 12 (expected 12)
#04 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)
#04 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#04 lchan_bs_pwr_ctrl() -> BS power reduction: 20 -> 20 (expected 16)
+#04 lchan_bs_pwr_ctrl() -> BS power reduction: 12 -> 16 (expected 16)
#05 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)
#05 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#05 lchan_bs_pwr_ctrl() -> BS power reduction: 20 -> 20 (expected 20)
+#05 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 20 (expected 20)
#06 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)
#06 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00
#06 lchan_bs_pwr_ctrl() -> BS power reduction: 20 -> 20 (expected 20)
@@ -60,20 +60,20 @@ Starting test case 'TC_rxlev_max_min'
#07 lchan_bs_pwr_ctrl() -> BS power reduction: 20 -> 20 (expected 20)
#08 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0)
#08 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 0a 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#08 lchan_bs_pwr_ctrl() -> BS power reduction: 20 -> 16 (expected 12)
+#08 lchan_bs_pwr_ctrl() -> BS power reduction: 20 -> 12 (expected 12)
#09 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0)
#09 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 0a 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#09 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 12 (expected 4)
+#09 lchan_bs_pwr_ctrl() -> BS power reduction: 12 -> 4 (expected 4)
#10 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0)
#10 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 0a 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#10 lchan_bs_pwr_ctrl() -> BS power reduction: 12 -> 8 (expected 0)
+#10 lchan_bs_pwr_ctrl() -> BS power reduction: 4 -> 0 (expected 0)
#11 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0)
#11 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 0a 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#11 lchan_bs_pwr_ctrl() -> BS power reduction: 8 -> 4 (expected 0)
+#11 lchan_bs_pwr_ctrl() -> BS power reduction: 0 -> 0 (expected 0)
#12 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0)
#12 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 0a 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#12 lchan_bs_pwr_ctrl() -> BS power reduction: 4 -> 0 (expected 0)
-Test case verdict: FAIL
+#12 lchan_bs_pwr_ctrl() -> BS power reduction: 0 -> 0 (expected 0)
+Test case verdict: SUCCESS
Starting test case 'TC_dtxd_mode'
#00 exec_power_step() <- State (re)set (current 0 dB, max 20 dB)
diff --git a/tests/power/ms_power_loop_test.c b/tests/power/ms_power_loop_test.c
index 4f4f746b..ea3c2493 100644
--- a/tests/power/ms_power_loop_test.c
+++ b/tests/power/ms_power_loop_test.c
@@ -47,11 +47,16 @@ static void init_test(const char *name)
g_trx->ms_pwr_ctl_soft = true;
- g_bts->ul_power_ctrl.target_dbm = -75;
- g_bts->dl_power_ctrl.target_dbm = -75;
g_bts->band = GSM_BAND_1800;
g_bts->c0 = g_trx;
+ g_bts->ul_power_ctrl = g_bts->dl_power_ctrl = \
+ (struct bts_power_ctrl_params) {
+ .target_dbm = -75,
+ .raise_step_max_db = PWR_RAISE_MAX_DB,
+ .lower_step_max_db = PWR_LOWER_MAX_DB,
+ };
+
printf("\nStarting test case '%s'\n", name);
}