Change in osmo-bts[master]: bts-trx: Drop low layer MS Power Control Loop algo

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/.

pespin gerrit-no-reply at lists.osmocom.org
Thu Nov 14 16:52:00 UTC 2019


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


Change subject: bts-trx: Drop low layer MS Power Control Loop algo
......................................................................

bts-trx: Drop low layer MS Power Control Loop algo

Let's drop it instead of having code duplication from common code in a
lower layer, and maintain only the one in l1sap for all BTS models.
As a result, osmo-bts-trx loses feature BTS_FEAT_MS_PWR_CTRL_DSP and
will only be able to use "ms-power-control osmo" in VTY, which will be
enabled by default (meaning: change of behavior, now MS Power Control is
enabled by default in osmo-bts-trx and can only by disabled by BSC).
Old bts-trx specific VTY command "(no) osmotrx ms-power-loop" is marked
as deprecated but still working for more usual case (1 TRX configured)
to avoid breaking backward compatibility.

TA low level loop is still kept in loops.c and will be moved to l1sap at
some point too.

Related: OS#1851
Change-Id: I0d8b0c981d9ead91d93999df6e45fb06e426aeb9
---
M include/osmo-bts/phy_link.h
M include/osmo-bts/scheduler.h
M src/osmo-bts-trx/loops.c
M src/osmo-bts-trx/loops.h
M src/osmo-bts-trx/main.c
M src/osmo-bts-trx/scheduler_trx.c
M src/osmo-bts-trx/trx_vty.c
7 files changed, 9 insertions(+), 214 deletions(-)



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

diff --git a/include/osmo-bts/phy_link.h b/include/osmo-bts/phy_link.h
index 316a1ba..b2e7c0e 100644
--- a/include/osmo-bts/phy_link.h
+++ b/include/osmo-bts/phy_link.h
@@ -45,8 +45,6 @@
 			uint16_t base_port_remote;
 			struct osmo_fd trx_ofd_clk;
 			bool trx_ta_loop;
-			bool trx_ms_power_loop;
-			int8_t trx_target_rssi;
 			uint32_t clock_advance;
 			uint32_t rts_advance;
 			bool use_legacy_setbsic;
diff --git a/include/osmo-bts/scheduler.h b/include/osmo-bts/scheduler.h
index 3100a1d..fed3f04 100644
--- a/include/osmo-bts/scheduler.h
+++ b/include/osmo-bts/scheduler.h
@@ -121,11 +121,6 @@
 
 	/* measurements */
 	struct {
-		uint8_t		clock;		/* cyclic clock counter */
-		int8_t		rssi[32];	/* last RSSI values */
-		int		rssi_count;	/* received RSSI values */
-		int		rssi_valid_count; /* number of stored value */
-		int		rssi_got_burst; /* any burst received so far */
 		int32_t		toa256_sum;	/* sum of TOA values (1/256 symbol) */
 		int		toa_num;	/* number of TOA value */
 	} meas;
diff --git a/src/osmo-bts-trx/loops.c b/src/osmo-bts-trx/loops.c
index e73d842..70e3ffc 100644
--- a/src/osmo-bts-trx/loops.c
+++ b/src/osmo-bts-trx/loops.c
@@ -36,162 +36,12 @@
 #include "loops.h"
 
 /*
- * MS Power loop
+ * Timing Advance loop
  */
 
-/*! 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.
- *  \param[in] diff input delta value (in dB). How many dBs measured power
- *  	       should be increased (+) or decreased (-) to reach expected power.
- */
-static void ms_power_diff(struct gsm_lchan *lchan, int8_t diff)
-{
-	struct gsm_bts_trx *trx = lchan->ts->trx;
-	enum gsm_band band = trx->bts->band;
-	int8_t new_power; /* TS 05.05 power level */
-	int8_t new_dbm, current_dbm, bsc_max_dbm;
-
-	/* power levels change in steps of 2 dB, so a smaller diff will end up in no change */
-	if (diff < 2 && diff > -2)
-		return;
-
-	current_dbm = ms_pwr_dbm(band, lchan->ms_power_ctrl.current);
-	if (current_dbm < 0) {
-		LOGPLCHAN(lchan, DLOOP, LOGL_NOTICE,
-			  "Failed to calculate dBm for power ctl level %" PRIu8 " on band %s\n",
-			  lchan->ms_power_ctrl.current, gsm_band_name(band));
-		return;
-	}
-	bsc_max_dbm = ms_pwr_dbm(band, lchan->ms_power_ctrl.max);
-	if (bsc_max_dbm < 0) {
-		LOGPLCHAN(lchan, DLOOP, LOGL_NOTICE,
-			  "Failed to calculate dBm for power ctl level %" PRIu8 " on band %s\n",
-			  lchan->ms_power_ctrl.max, gsm_band_name(band));
-		return;
-	}
-
-	/* 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
-	   cope with any unsigned dbm value, regardless of band minimal value. */
-	if (new_dbm < 0)
-		new_dbm = 0;
-
-	/* Don't ask for smaller ms power level than the one set by BSC upon RSL CHAN ACT */
-	if (new_dbm > bsc_max_dbm)
-		new_dbm = bsc_max_dbm;
-
-	new_power = ms_pwr_ctl_lvl(band, new_dbm);
-	if (new_power < 0) {
-		LOGPLCHAN(lchan, DLOOP, LOGL_NOTICE,
-			  "Failed to retrieve power level for %" PRId8 " dBm on band %d\n",
-			  new_dbm, band);
-		return;
-	}
-
-	if (lchan->ms_power_ctrl.current == new_power) {
-		LOGPLCHAN(lchan, DLOOP, LOGL_INFO, "Keeping MS new_power at control level %d (%d dBm)\n",
-			new_power, ms_pwr_dbm(band, new_power));
-	} else {
-		LOGPLCHAN(lchan, DLOOP, LOGL_INFO, "%s MS new_power from control level %d (%d dBm) to %d (%d dBm)\n",
-			(diff > 0) ? "Raising" : "Lowering",
-			lchan->ms_power_ctrl.current, ms_pwr_dbm(band, lchan->ms_power_ctrl.current),
-			new_power, ms_pwr_dbm(band, new_power));
-
-		/* store the resulting new MS power level in the lchan */
-		lchan->ms_power_ctrl.current = new_power;
-	}
-}
-
-/*! Input a new RSSI value into the MS power control loop for the given logical channel.
- *  \param lchan logical channel
- *  \param chan_state L1 channel state of the logical channel.
- *  \param rssi Received Signal Strength Indication (in dBm) */
-static void ms_power_val(struct gsm_lchan *lchan, struct l1sched_chan_state *chan_state, int8_t rssi)
-{
-	/* ignore inserted dummy frames, treat as lost frames */
-	if (rssi < -127)
-		return;
-
-	LOGPLCHAN(lchan, DLOOP, LOGL_DEBUG, "Got RSSI value of %d\n", rssi);
-
-	chan_state->meas.rssi_count++;
-
-	chan_state->meas.rssi_got_burst = 1;
-
-	/* store and process RSSI */
-	if (chan_state->meas.rssi_valid_count == ARRAY_SIZE(chan_state->meas.rssi))
-		return;
-	chan_state->meas.rssi[chan_state->meas.rssi_valid_count++] = rssi;
-}
-
-/*! Process a single clock tick of the MS power control loop.
- *  \param lchan Logical channel to which the clock tick applies */
-static void ms_power_clock(struct gsm_lchan *lchan, struct l1sched_chan_state *chan_state)
-{
-	struct gsm_bts_trx *trx = lchan->ts->trx;
-	struct phy_instance *pinst = trx_phy_instance(trx);
-	int rssi;
-	int i;
-
-	/* skip every second clock, to prevent oscillating due to roundtrip
-	 * delay */
-	if (!(chan_state->meas.clock & 1))
-		return;
-
-	LOGPLCHAN(lchan, DLOOP, LOGL_DEBUG, "Got SACCH master clock at RSSI count %d\n",
-		chan_state->meas.rssi_count);
-
-	/* wait for initial burst */
-	if (!chan_state->meas.rssi_got_burst)
-		return;
-
-	/* if no burst was received from MS at clock */
-	if (chan_state->meas.rssi_count == 0) {
-		LOGPLCHAN(lchan, DLOOP, LOGL_NOTICE, "LOST SACCH frame, so we raise MS power output\n");
-		ms_power_diff(lchan, MS_RAISE_MAX_DB);
-		return;
-	}
-
-	/* reset total counter */
-	chan_state->meas.rssi_count = 0;
-
-	/* check the minimum level received after MS acknowledged the ordered
-	 * power level */
-	if (chan_state->meas.rssi_valid_count == 0)
-		return;
-	for (rssi = 999, i = 0; i < chan_state->meas.rssi_valid_count; i++) {
-		if (rssi > chan_state->meas.rssi[i])
-			rssi = chan_state->meas.rssi[i];
-	}
-
-	/* reset valid counter */
-	chan_state->meas.rssi_valid_count = 0;
-
-	/* change RSSI */
-	LOGPLCHAN(lchan, DLOOP, LOGL_DEBUG, "Lowest RSSI: %d Target RSSI: %d Current "
-		"MS power: %d (%d dBm)\n", rssi,
-		pinst->phy_link->u.osmotrx.trx_target_rssi, lchan->ms_power_ctrl.current,
-		ms_pwr_dbm(trx->bts->band, lchan->ms_power_ctrl.current));
-	ms_power_diff(lchan, pinst->phy_link->u.osmotrx.trx_target_rssi - rssi);
-}
-
-
 /* 90% of one bit duration in 1/256 symbols: 256*0.9 */
 #define TOA256_9OPERCENT	230
 
-/*
- * Timing Advance loop
- */
-
 void ta_val(struct gsm_lchan *lchan, struct l1sched_chan_state *chan_state, int16_t toa256)
 {
 	/* check if the current L1 header acks to the current ordered TA */
@@ -231,42 +81,17 @@
  * \param[in] rssi Receive Signal Strength Indication
  * \param[in] toa256 Time of Arrival in 1/256 symbol periods */
 void trx_loop_sacch_input(struct l1sched_trx *l1t, uint8_t chan_nr,
-	struct l1sched_chan_state *chan_state, int8_t rssi, int16_t toa256)
+	struct l1sched_chan_state *chan_state, int16_t toa256)
 {
 	struct gsm_lchan *lchan = &l1t->trx->ts[L1SAP_CHAN2TS(chan_nr)]
 					.lchan[l1sap_chan2ss(chan_nr)];
 	struct phy_instance *pinst = trx_phy_instance(l1t->trx);
 
-	/* if common upper layer MS power control loop is disabled
-	   and lower layer MS power control loop is enabled, handle it */
-	if (!l1t->trx->ms_pwr_ctl_soft && pinst->phy_link->u.osmotrx.trx_ms_power_loop)
-		ms_power_val(lchan, chan_state, rssi);
-
 	/* if TA loop is enabled, handle it */
 	if (pinst->phy_link->u.osmotrx.trx_ta_loop)
 		ta_val(lchan, chan_state, toa256);
 }
 
-/*! Called once every downlink SACCH block needs to be sent. */
-void trx_loop_sacch_clock(struct l1sched_trx *l1t, uint8_t chan_nr,
-	struct l1sched_chan_state *chan_state)
-{
-	struct gsm_lchan *lchan = &l1t->trx->ts[L1SAP_CHAN2TS(chan_nr)]
-					.lchan[l1sap_chan2ss(chan_nr)];
-	struct phy_instance *pinst = trx_phy_instance(l1t->trx);
-
-	if (lchan->ms_power_ctrl.fixed)
-	        return;
-
-	/* if common upper layer MS power control loop is disabled
-	   and lower layer MS power control loop is enabled, handle it */
-	if (!l1t->trx->ms_pwr_ctl_soft && pinst->phy_link->u.osmotrx.trx_ms_power_loop)
-		ms_power_clock(lchan, chan_state);
-
-	/* count the number of SACCH clocks */
-	chan_state->meas.clock++;
-}
-
 void trx_loop_amr_input(struct l1sched_trx *l1t, uint8_t chan_nr,
 	struct l1sched_chan_state *chan_state, float ber)
 {
diff --git a/src/osmo-bts-trx/loops.h b/src/osmo-bts-trx/loops.h
index 7869903..1630acc 100644
--- a/src/osmo-bts-trx/loops.h
+++ b/src/osmo-bts-trx/loops.h
@@ -7,19 +7,12 @@
  * calibration of loops
  */
 
-/* how much power levels do we raise/lower as maximum (1 level = 2 dB) */
-#define MS_RAISE_MAX_DB 4
-#define MS_LOWER_MAX_DB 8
-
 /*
  * loops api
  */
 
 void trx_loop_sacch_input(struct l1sched_trx *l1t, uint8_t chan_nr,
-	struct l1sched_chan_state *chan_state, int8_t rssi, int16_t toa);
-
-void trx_loop_sacch_clock(struct l1sched_trx *l1t, uint8_t chan_nr,
-        struct l1sched_chan_state *chan_state);
+	struct l1sched_chan_state *chan_state, int16_t toa);
 
 void trx_loop_amr_input(struct l1sched_trx *l1t, uint8_t chan_nr,
         struct l1sched_chan_state *chan_state, float ber);
diff --git a/src/osmo-bts-trx/main.c b/src/osmo-bts-trx/main.c
index 9a29b3b..00280ce 100644
--- a/src/osmo-bts-trx/main.c
+++ b/src/osmo-bts-trx/main.c
@@ -116,7 +116,6 @@
 	gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_AMR);
 	gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_AMR);
 	gsm_bts_set_feature(bts, BTS_FEAT_CBCH);
-	gsm_bts_set_feature(bts, BTS_FEAT_MS_PWR_CTRL_DSP);
 
 	bts_model_vty_init(bts);
 
@@ -137,8 +136,6 @@
 	plink->u.osmotrx.clock_advance = 20;
 	plink->u.osmotrx.rts_advance = 5;
 	plink->u.osmotrx.trx_ta_loop = true;
-	plink->u.osmotrx.trx_ms_power_loop = false;
-	plink->u.osmotrx.trx_target_rssi = -10;
 	/* attempt use newest TRXD version by default: */
 	plink->u.osmotrx.trxd_hdr_ver_max = TRX_DATA_FORMAT_VER;
 }
diff --git a/src/osmo-bts-trx/scheduler_trx.c b/src/osmo-bts-trx/scheduler_trx.c
index 9945b2c..d39776b 100644
--- a/src/osmo-bts-trx/scheduler_trx.c
+++ b/src/osmo-bts-trx/scheduler_trx.c
@@ -148,8 +148,6 @@
 {
 	struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, tn);
 	struct gsm_bts_trx_ts *ts = &l1t->trx->ts[tn];
-	uint8_t link_id = trx_chan_desc[chan].link_id;
-	uint8_t chan_nr = trx_chan_desc[chan].chan_nr | tn;
 	struct msgb *msg = NULL; /* make GCC happy */
 	ubit_t *burst, **bursts_p = &l1ts->chan_state[chan].dl_bursts;
 	static ubit_t bits[GSM_BURST_LEN];
@@ -161,10 +159,6 @@
 		goto send_burst;
 	}
 
-	/* send clock information to loops process */
-	if (L1SAP_IS_LINK_SACCH(link_id))
-		trx_loop_sacch_clock(l1t, chan_nr, &l1ts->chan_state[chan]);
-
 	/* get mac block from queue */
 	msg = _sched_dequeue_prim(l1t, tn, fn, chan);
 	if (msg)
@@ -959,7 +953,7 @@
 	/* send burst information to loops process */
 	if (L1SAP_IS_LINK_SACCH(trx_chan_desc[chan].link_id)) {
 		trx_loop_sacch_input(l1t, trx_chan_desc[chan].chan_nr | bi->tn,
-			chan_state, bi->rssi, bi->toa256);
+			chan_state, bi->toa256);
 	}
 
 	/* wait until complete set of bursts */
diff --git a/src/osmo-bts-trx/trx_vty.c b/src/osmo-bts-trx/trx_vty.c
index 86f5712..5c5e477 100644
--- a/src/osmo-bts-trx/trx_vty.c
+++ b/src/osmo-bts-trx/trx_vty.c
@@ -160,26 +160,23 @@
 	return CMD_SUCCESS;
 }
 
-DEFUN(cfg_phy_ms_power_loop, cfg_phy_ms_power_loop_cmd,
+DEFUN_DEPRECATED(cfg_phy_ms_power_loop, cfg_phy_ms_power_loop_cmd,
 	"osmotrx ms-power-loop <-127-127>", OSMOTRX_STR
 	"Enable MS power control loop\nTarget RSSI value (transceiver specific, "
 	"should be 6dB or more above noise floor)\n")
 {
-	struct phy_link *plink = vty->index;
+	vty_out (vty, "'osmotrx ms-power-loop' is deprecated, use 'uplink-power-target' instead%s", VTY_NEWLINE);
 
-	plink->u.osmotrx.trx_target_rssi = atoi(argv[0]);
-	plink->u.osmotrx.trx_ms_power_loop = true;
+	vty_bts->ul_power_target = atoi(argv[0]);
 
 	return CMD_SUCCESS;
 }
 
-DEFUN(cfg_phy_no_ms_power_loop, cfg_phy_no_ms_power_loop_cmd,
+DEFUN_DEPRECATED(cfg_phy_no_ms_power_loop, cfg_phy_no_ms_power_loop_cmd,
 	"no osmotrx ms-power-loop",
 	NO_STR OSMOTRX_STR "Disable MS power control loop\n")
 {
-	struct phy_link *plink = vty->index;
-
-	plink->u.osmotrx.trx_ms_power_loop = false;
+	vty_out (vty, "'no osmotrx ms-power-loop' is deprecated, use of BTS control loop is managed by BSC%s", VTY_NEWLINE);
 
 	return CMD_SUCCESS;
 }
@@ -525,10 +522,6 @@
 		vty_out(vty, " osmotrx ip remote %s%s",
 			plink->u.osmotrx.remote_ip, VTY_NEWLINE);
 
-	if (plink->u.osmotrx.trx_ms_power_loop)
-		vty_out(vty, " osmotrx ms-power-loop %d%s", plink->u.osmotrx.trx_target_rssi, VTY_NEWLINE);
-	else
-		vty_out(vty, " no osmotrx ms-power-loop%s", VTY_NEWLINE);
 	vty_out(vty, " %sosmotrx timing-advance-loop%s", (plink->u.osmotrx.trx_ta_loop) ? "" : "no ", VTY_NEWLINE);
 
 	if (plink->u.osmotrx.base_port_local)

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

Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: I0d8b0c981d9ead91d93999df6e45fb06e426aeb9
Gerrit-Change-Number: 16072
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20191114/182ae264/attachment.htm>


More information about the gerrit-log mailing list