aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmo-bts/phy_link.h2
-rw-r--r--include/osmo-bts/scheduler.h5
-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
7 files changed, 9 insertions, 214 deletions
diff --git a/include/osmo-bts/phy_link.h b/include/osmo-bts/phy_link.h
index 316a1bad..b2e7c0e2 100644
--- a/include/osmo-bts/phy_link.h
+++ b/include/osmo-bts/phy_link.h
@@ -45,8 +45,6 @@ struct phy_link {
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 3100a1da..fed3f04e 100644
--- a/include/osmo-bts/scheduler.h
+++ b/include/osmo-bts/scheduler.h
@@ -121,11 +121,6 @@ struct l1sched_chan_state {
/* 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 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)