aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2019-11-14 16:58:10 +0100
committerlaforge <laforge@osmocom.org>2019-11-30 18:50:04 +0000
commite3a45309198a44322572dc136bcf4a3e6ed99523 (patch)
treed8c1634eeed95f0a55c60113e9446a62400d48ed /src
parent0d8cd8ce39557f1aeb8e4174cfc01194573fdb92 (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/osmo-bts-trx/loops.c179
-rw-r--r--src/osmo-bts-trx/loops.h9
-rw-r--r--src/osmo-bts-trx/main.c3
-rw-r--r--src/osmo-bts-trx/scheduler_trx.c8
-rw-r--r--src/osmo-bts-trx/trx_vty.c17
5 files changed, 9 insertions, 207 deletions
diff --git a/src/osmo-bts-trx/loops.c b/src/osmo-bts-trx/loops.c
index 47e9cf30..eb25f64e 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
- */
-
-/*! 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.
+ * Timing Advance loop
*/
-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 @@ void ta_val(struct gsm_lchan *lchan, struct l1sched_chan_state *chan_state, int1
* \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,
int n_errors, int n_bits_total)
diff --git a/src/osmo-bts-trx/loops.h b/src/osmo-bts-trx/loops.h
index 978cb7ec..bc87860f 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,
diff --git a/src/osmo-bts-trx/main.c b/src/osmo-bts-trx/main.c
index 9a29b3b2..00280ceb 100644
--- a/src/osmo-bts-trx/main.c
+++ b/src/osmo-bts-trx/main.c
@@ -116,7 +116,6 @@ int bts_model_init(struct gsm_bts *bts)
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 @@ void bts_model_phy_link_set_defaults(struct phy_link *plink)
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 07ee9da8..c3608bf5 100644
--- a/src/osmo-bts-trx/scheduler_trx.c
+++ b/src/osmo-bts-trx/scheduler_trx.c
@@ -148,8 +148,6 @@ ubit_t *tx_data_fn(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,
{
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 @@ ubit_t *tx_data_fn(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,
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 @@ int rx_data_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,
/* 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 86f57121..5c5e477c 100644
--- a/src/osmo-bts-trx/trx_vty.c
+++ b/src/osmo-bts-trx/trx_vty.c
@@ -160,26 +160,23 @@ DEFUN(show_phy, show_phy_cmd, "show phy",
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 @@ void bts_model_config_write_phy(struct vty *vty, struct phy_link *plink)
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)