aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2019-11-20 18:39:27 +0100
committerPau Espin Pedrol <pespin@sysmocom.de>2019-11-20 19:35:08 +0100
commit522fc939e079c1dfd9b395548c75b52b92fc8adf (patch)
tree429533aa0413e2545afa74d10ceda35258042a6d
parent595eb576fc370d54f1a137616b16a5748389a427 (diff)
power_control.c: Don't use announced MS Power level as input for loop calculations
Use instead the received MS Power currently in use by the MS matching the measured signal. This way there's no need to wait for the MS to reach the announced MS power level or add checks in case the MS doesn't support that specific power level. Furthermore, more fine grained announced power level value can be obtained faster due to more input iterations not being dropped while waiting. osmo-bts-trx specific algo was not following this approach and using announced MS power instead because it's wowrking at a lower level and henche was not using the transmitted MS Power level value by the MS as input for the calculation. The "if (diff < 2 && diff > -2))" condition is dropped since equal signal strength may still result in a different MS power level announced (the one currently used by the MS during tx of last SACCH block). Related: OS#1851 Change-Id: I4494dc27a295a3dca1d3331d4ff712d486643e13
-rw-r--r--include/osmo-bts/gsm_data_shared.h1
-rw-r--r--src/common/l1sap.c1
-rw-r--r--src/common/power_control.c28
3 files changed, 4 insertions, 26 deletions
diff --git a/include/osmo-bts/gsm_data_shared.h b/include/osmo-bts/gsm_data_shared.h
index c19bb210..41998ad8 100644
--- a/include/osmo-bts/gsm_data_shared.h
+++ b/include/osmo-bts/gsm_data_shared.h
@@ -322,7 +322,6 @@ struct gsm_lchan {
uint8_t current;
uint8_t max;
bool fixed;
- int8_t last_received; /* last received MS Power in uplink L1 SACCH, -1 means not set */
} ms_power_ctrl;
/* Power levels for BTS */
uint8_t bs_power;
diff --git a/src/common/l1sap.c b/src/common/l1sap.c
index 4937d1e5..7bf0b09a 100644
--- a/src/common/l1sap.c
+++ b/src/common/l1sap.c
@@ -1647,7 +1647,6 @@ int l1sap_chan_act(struct gsm_bts_trx *trx, uint8_t chan_nr, struct tlv_parsed *
lchan->sacch_deact = 0;
lchan->s = lchan->ts->trx->bts->radio_link_timeout;
- lchan->ms_power_ctrl.last_received = -1; /* mark no ms power received yet */
rc = l1sap_chan_act_dact_modify(trx, chan_nr, PRIM_INFO_ACTIVATE, 0);
if (rc)
diff --git a/src/common/power_control.c b/src/common/power_control.c
index 129334e7..d08ed5e5 100644
--- a/src/common/power_control.c
+++ b/src/common/power_control.c
@@ -51,35 +51,15 @@ int lchan_ms_pwr_ctrl(struct gsm_lchan *lchan,
if (lchan->ms_power_ctrl.fixed)
return 0;
- /* The phone hasn't reached the power level yet.
- TODO: store .last and check if MS is trying to move towards current. */
- if (lchan->ms_power_ctrl.current != ms_power) {
- if (lchan->ms_power_ctrl.last_received == -1 ||
- lchan->ms_power_ctrl.last_received != ms_power) {
- /* MS Power still changing, keep current power level */
- lchan->ms_power_ctrl.last_received = ms_power;
- return 0;
- }
- /* else: we are stuck with some received MS Power level
- different than the one we announce, probably because the MS
- doesn't support that exact one so it picked the nearest one
- */
- lchan->ms_power_ctrl.last_received = ms_power;
- }
-
/* How many dBs measured power should be increased (+) or decreased (-)
to reach expected power. */
diff = bts->ul_power_target - rxLevel;
- /* power levels change in steps of 2 dB, so a smaller diff will end up in no change */
- if (diff < 2 && diff > -2)
- return 0;
-
- current_dbm = ms_pwr_dbm(band, lchan->ms_power_ctrl.current);
+ current_dbm = ms_pwr_dbm(band, ms_power);
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));
+ ms_power, gsm_band_name(band));
return 0;
}
bsc_max_dbm = ms_pwr_dbm(band, lchan->ms_power_ctrl.max);
@@ -110,13 +90,13 @@ int lchan_ms_pwr_ctrl(struct gsm_lchan *lchan,
}
if (lchan->ms_power_ctrl.current == new_power) {
- LOGPLCHAN(lchan, DLOOP, LOGL_INFO, "Keeping MS new_power at control level %d, %d dBm "
+ LOGPLCHAN(lchan, DLOOP, LOGL_INFO, "Keeping MS power at control level %d, %d dBm "
"(rx-ms-pwr-lvl %" PRIu8 ", rx-current %d dBm, rx-target %d dBm)\n",
new_power, ms_pwr_dbm(band, new_power), ms_power, rxLevel, bts->ul_power_target);
return 0;
}
- LOGPLCHAN(lchan, DLOOP, LOGL_INFO, "%s MS new_power from control level %d (%d dBm) to %d, %d dBm "
+ LOGPLCHAN(lchan, DLOOP, LOGL_INFO, "%s MS power from control level %d (%d dBm) to %d, %d dBm "
"(rx-ms-pwr-lvl %" PRIu8 ", rx-current %d dBm, rx-target %d dBm)\n",
(diff > 0) ? "Raising" : "Lowering",
lchan->ms_power_ctrl.current, ms_pwr_dbm(band, lchan->ms_power_ctrl.current),