fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bsc/+/32540 )
Change subject: bts: st_op_enabled_on_enter(): resume C0 power reduction ......................................................................
bts: st_op_enabled_on_enter(): resume C0 power reduction
If power saving is enabled for a BTS, it should remain enabled even if the BTS is restarted for whatever reason. This persistence can be achieved by re-sending the configured power reduction value whenever the BTS NM FSM enters the ENABLED state again (i.e. reconnects).
Separate gsm_bts_send_c0_power_red() from gsm_bts_set_c0_power_red() and call the former from st_op_enabled_on_enter(). All we need to do is to send the value that was configured before, per-timeslot power reduction limits remain and need not to be updated.
Take a chance to move logging from BTS specific to the generic code.
Change-Id: Ic3f8a2ab0ffd049a8ed84361a3a588c1e1b23ac6 Related: SYS#6435 --- M include/osmocom/bsc/bts.h M src/osmo-bsc/bts.c M src/osmo-bsc/bts_osmobts.c M src/osmo-bsc/nm_bts_fsm.c 4 files changed, 47 insertions(+), 10 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/40/32540/1
diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h index 9b2aaab..78fc6a0 100644 --- a/include/osmocom/bsc/bts.h +++ b/include/osmocom/bsc/bts.h @@ -822,6 +822,7 @@
int gsm_bts_set_system_infos(struct gsm_bts *bts);
+int gsm_bts_send_c0_power_red(const struct gsm_bts *bts, const uint8_t red); int gsm_bts_set_c0_power_red(struct gsm_bts *bts, const uint8_t red);
void gsm_bts_stats_reset(struct gsm_bts *bts); diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c index f5936c7..a6fc4a4 100644 --- a/src/osmo-bsc/bts.c +++ b/src/osmo-bsc/bts.c @@ -978,21 +978,31 @@ return 0; }
+/* Send the given C0 power reduction value to the BTS */ +int gsm_bts_send_c0_power_red(const struct gsm_bts *bts, const uint8_t red) +{ + if (!osmo_bts_has_feature(&bts->features, BTS_FEAT_BCCH_POWER_RED)) + return -ENOTSUP; + if (bts->model->power_ctrl_send_c0_power_red == NULL) + return -ENOTSUP; + return bts->model->power_ctrl_send_c0_power_red(bts, red); +} + +/* Send the given C0 power reduction value to the BTS and update the internal state */ int gsm_bts_set_c0_power_red(struct gsm_bts *bts, const uint8_t red) { struct gsm_bts_trx *c0 = bts->c0; unsigned int tn; int rc;
- if (!osmo_bts_has_feature(&bts->features, BTS_FEAT_BCCH_POWER_RED)) - return -ENOTSUP; - if (bts->model->power_ctrl_send_c0_power_red == NULL) - return -ENOTSUP; - - rc = bts->model->power_ctrl_send_c0_power_red(bts, red); + rc = gsm_bts_send_c0_power_red(bts, red); if (rc != 0) return rc;
+ LOGP(DRSL, LOGL_NOTICE, "%sabling BCCH carrier power reduction " + "operation mode for BTS%u (maximum %u dB)\n", + red ? "En" : "Dis", bts->nr, red); + /* Timeslot 0 is always transmitting BCCH/CCCH */ c0->ts[0].c0_max_power_red_db = 0;
diff --git a/src/osmo-bsc/bts_osmobts.c b/src/osmo-bsc/bts_osmobts.c index 5f6f86f..ea0405b 100644 --- a/src/osmo-bsc/bts_osmobts.c +++ b/src/osmo-bsc/bts_osmobts.c @@ -168,10 +168,6 @@ if (msg == NULL) return -ENOMEM;
- LOGP(DRSL, LOGL_NOTICE, "%sabling BCCH carrier power reduction " - "operation mode for BTS%u (maximum %u dB)\n", - red ? "En" : "Dis", bts->nr, red); - /* Abuse the standard BS POWER CONTROL message by specifying 'Common Channel' * in the Protocol Discriminator field and 'BCCH' in the Channel Number IE. */ dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh)); diff --git a/src/osmo-bsc/nm_bts_fsm.c b/src/osmo-bsc/nm_bts_fsm.c index 92728dc..acd69a5 100644 --- a/src/osmo-bsc/nm_bts_fsm.c +++ b/src/osmo-bsc/nm_bts_fsm.c @@ -286,6 +286,14 @@ bts->mo.get_attr_rep_received = false; bts->mo.set_attr_sent = false; bts->mo.set_attr_ack_received = false; + + /* Resume power saving on the BCCH carrier, if was enabled */ + if (bts->c0_max_power_red_db > 0) { + LOGP(DRSL, LOGL_NOTICE, "Resuming BCCH carrier power reduction " + "operation mode for BTS%u (maximum %u dB)\n", + bts->nr, bts->c0_max_power_red_db); + gsm_bts_send_c0_power_red(bts, bts->c0_max_power_red_db); + } }
static void st_op_enabled(struct osmo_fsm_inst *fi, uint32_t event, void *data)