Change in osmo-bts[master]: power_control: make raise/lower step limitation configurable

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

fixeria gerrit-no-reply at lists.osmocom.org
Sun Dec 6 23:39:24 UTC 2020


fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/21568 )


Change subject: power_control: make raise/lower step limitation configurable
......................................................................

power_control: make raise/lower step limitation configurable

Change-Id: Ic37742f46f533865043b3dbcf16ea702e1746f98
Related: SYS#4918
---
M include/osmo-bts/bts.h
M include/osmo-bts/power_control.h
M src/common/bts.c
M src/common/power_control.c
M tests/power/bs_power_loop_test.c
M tests/power/bs_power_loop_test.err
M tests/power/bs_power_loop_test.ok
M tests/power/ms_power_loop_test.c
8 files changed, 64 insertions(+), 36 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/68/21568/1

diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h
index 48f404c..8956c36 100644
--- a/include/osmo-bts/bts.h
+++ b/include/osmo-bts/bts.h
@@ -107,6 +107,10 @@
 	int target_dbm;
 	/* Tolerated deviation from target */
 	int hysteresis_db;
+	/* How many dB do we raise power as maximum */
+	int raise_max_db;
+	/* How many dB do we lower power as maximum */
+	int lower_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 f2e14cf..ab107b8 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 e021864..669bcdd 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 @@
 	(struct bts_power_ctrl_params) {
 		.target_dbm = -75,
 		.hysteresis_db = 3,	/* -78 .. -72 dBm */
+		.raise_max_db = PWR_RAISE_MAX_DB,
+		.lower_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 d458a92..f54db34 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 @@
 	/* 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_max_db)
+		delta = params->raise_max_db;
+	else if (delta < -params->lower_max_db)
+		delta = -params->lower_max_db;
 
 	return delta;
 }
diff --git a/tests/power/bs_power_loop_test.c b/tests/power/bs_power_loop_test.c
index 2f60cc0..5f1bf92 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_max_db = PWR_LOWER_MAX_DB, \
+	.lower_max_db = PWR_RAISE_MAX_DB
+
 #define DL_MEAS_FULL(rxqual, rxlev) \
 	.rxqual_full = rxqual, \
 	.rxlev_full = rxlev
@@ -95,10 +104,15 @@
 	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 @@
 	/* 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 @@
 	/* 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 44d996e..43063c0 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 fe2eb78..acaad82 100644
--- a/tests/power/bs_power_loop_test.ok
+++ b/tests/power/bs_power_loop_test.ok
@@ -39,19 +39,19 @@
 #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 @@
 #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 4f4f746..a804ad7 100644
--- a/tests/power/ms_power_loop_test.c
+++ b/tests/power/ms_power_loop_test.c
@@ -47,11 +47,16 @@
 
 	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_max_db = PWR_RAISE_MAX_DB,
+		.lower_max_db = PWR_LOWER_MAX_DB,
+	};
+
 	printf("\nStarting test case '%s'\n", name);
 }
 

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/21568
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: Ic37742f46f533865043b3dbcf16ea702e1746f98
Gerrit-Change-Number: 21568
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20201206/7b5491bc/attachment.htm>


More information about the gerrit-log mailing list