diff options
-rw-r--r-- | include/osmo-bts/phy_link.h | 2 | ||||
-rw-r--r-- | include/osmo-bts/scheduler.h | 5 | ||||
-rw-r--r-- | src/osmo-bts-trx/loops.c | 179 | ||||
-rw-r--r-- | src/osmo-bts-trx/loops.h | 9 | ||||
-rw-r--r-- | src/osmo-bts-trx/main.c | 3 | ||||
-rw-r--r-- | src/osmo-bts-trx/scheduler_trx.c | 8 | ||||
-rw-r--r-- | src/osmo-bts-trx/trx_vty.c | 17 |
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) |