aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2020-06-18 19:36:12 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2020-06-23 14:53:37 +0200
commit8090df2a813a3cf174afb8acb9aba92b65d275fb (patch)
treecee14c7b8e18b81ea7542c0133c7bd6aa2ee1631
parentceb80fc6b6edcc701a423d6bfe8601b08ff3a10d (diff)
bts_model: Convert bts_model_trx_close() to return asynchronously
Some backends like osmo-bts-trx require exchanging messages like POWEROFF to close the TRX, and hence need some time. Switch the function to expect result asynchronously by calling a callback. This will be used later to wait until all TRX are really powered off before exiting the process. Change-Id: I7d76b600fc06e1114b35bf0c2d08eff5bbd1b69a
-rw-r--r--include/osmo-bts/bts_model.h10
-rw-r--r--src/common/bts_shutdown_fsm.c6
-rw-r--r--src/osmo-bts-litecell15/oml.c8
-rw-r--r--src/osmo-bts-oc2g/oml.c8
-rw-r--r--src/osmo-bts-octphy/l1_oml.c7
-rw-r--r--src/osmo-bts-omldummy/bts_model.c4
-rw-r--r--src/osmo-bts-sysmo/oml.c8
-rw-r--r--src/osmo-bts-trx/l1_if.c26
-rw-r--r--src/osmo-bts-virtual/bts_model.c4
-rw-r--r--tests/stubs.c5
10 files changed, 62 insertions, 24 deletions
diff --git a/include/osmo-bts/bts_model.h b/include/osmo-bts/bts_model.h
index be0480c1..f62291c8 100644
--- a/include/osmo-bts/bts_model.h
+++ b/include/osmo-bts/bts_model.h
@@ -30,7 +30,9 @@ int bts_model_chg_adm_state(struct gsm_bts *bts, struct gsm_abis_mo *mo,
void *obj, uint8_t adm_state);
int bts_model_trx_deact_rf(struct gsm_bts_trx *trx);
-int bts_model_trx_close(struct gsm_bts_trx *trx);
+
+/* Implementation should call bts_model_trx_close_cb when done */
+void bts_model_trx_close(struct gsm_bts_trx *trx);
int bts_model_vty_init(struct gsm_bts *bts);
@@ -62,4 +64,10 @@ void bts_model_phy_instance_set_defaults(struct phy_instance *pinst);
int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts);
void bts_model_ts_connect(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan);
+/* BTS model specific implementations are expected to call these functions as a
+ * response to some of the APIs above:
+ */
+
+void bts_model_trx_close_cb(struct gsm_bts_trx *trx, int rc);
+
#endif
diff --git a/src/common/bts_shutdown_fsm.c b/src/common/bts_shutdown_fsm.c
index e65fff42..81cd3489 100644
--- a/src/common/bts_shutdown_fsm.c
+++ b/src/common/bts_shutdown_fsm.c
@@ -170,3 +170,9 @@ void bts_shutdown(struct gsm_bts *bts, const char *reason)
LOGPFSML(fi, LOGL_NOTICE, "Shutting down BTS, reason: %s\n", reason);
osmo_fsm_inst_dispatch(fi, BTS_SHUTDOWN_EV_START, NULL);
}
+
+void bts_model_trx_close_cb(struct gsm_bts_trx *trx, int rc)
+{
+ struct osmo_fsm_inst *fi = trx->bts->shutdown_fi;
+ LOGPFSML(fi, LOGL_DEBUG, "%s Received TRX close cb rc=%d\n", gsm_trx_name(trx), rc);
+}
diff --git a/src/osmo-bts-litecell15/oml.c b/src/osmo-bts-litecell15/oml.c
index 2f462b61..60fd1e7d 100644
--- a/src/osmo-bts-litecell15/oml.c
+++ b/src/osmo-bts-litecell15/oml.c
@@ -441,20 +441,24 @@ static int trx_close_compl_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg,
void *data)
{
msgb_free(l1_msg);
+ bts_model_trx_close_cb(trx, 0);
return 0;
}
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
{
struct lc15l1_hdl *fl1h = trx_lc15l1_hdl(trx);
struct msgb *msg;
+ int rc;
msg = l1p_msgb_alloc();
prim_init(msgb_l1prim(msg), GsmL1_PrimId_MphCloseReq, fl1h,
l1p_handle_for_trx(trx));
LOGP(DL1C, LOGL_NOTICE, "Close TRX %u\n", trx->nr);
- return l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);
+ rc = l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);
+ if (rc < 0)
+ bts_model_trx_close_cb(trx, rc);
}
static int trx_rf_lock(struct gsm_bts_trx *trx, int locked, l1if_compl_cb *cb)
diff --git a/src/osmo-bts-oc2g/oml.c b/src/osmo-bts-oc2g/oml.c
index cc8d02d6..89ee0ace 100644
--- a/src/osmo-bts-oc2g/oml.c
+++ b/src/osmo-bts-oc2g/oml.c
@@ -457,20 +457,24 @@ static int trx_close_compl_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg,
void *data)
{
msgb_free(l1_msg);
+ bts_model_trx_close_cb(trx, 0);
return 0;
}
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
{
struct oc2gl1_hdl *fl1h = trx_oc2gl1_hdl(trx);
struct msgb *msg;
+ int rc;
msg = l1p_msgb_alloc();
prim_init(msgb_l1prim(msg), GsmL1_PrimId_MphCloseReq, fl1h,
l1p_handle_for_trx(trx));
LOGP(DL1C, LOGL_NOTICE, "Close TRX %u\n", trx->nr);
- return l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);
+ rc = l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);
+ if (rc < 0)
+ bts_model_trx_close_cb(trx, rc);
}
static int trx_rf_lock(struct gsm_bts_trx *trx, int locked, l1if_compl_cb *cb)
diff --git a/src/osmo-bts-octphy/l1_oml.c b/src/osmo-bts-octphy/l1_oml.c
index 61d56bb6..8cc078eb 100644
--- a/src/osmo-bts-octphy/l1_oml.c
+++ b/src/osmo-bts-octphy/l1_oml.c
@@ -1678,7 +1678,7 @@ int bts_model_chg_adm_state(struct gsm_bts *bts, struct gsm_abis_mo *mo,
bts_model_trx_deact_rf(trx);
/* Close TRX */
- rc = bts_model_trx_close(trx);
+ rc = trx_close(trx);
if (rc != 0) {
LOGP(DL1C, LOGL_ERROR,
"Cannot close TRX %d, it is already closed.\n",
@@ -1716,10 +1716,11 @@ int bts_model_trx_deact_rf(struct gsm_bts_trx *trx)
return l1if_activate_rf(trx, 0);
}
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
{
/* FIXME: close only one TRX */
- return trx_close(trx);
+ int rc = trx_close(trx);
+ bts_model_trx_close_cb(trx, rc);
}
diff --git a/src/osmo-bts-omldummy/bts_model.c b/src/osmo-bts-omldummy/bts_model.c
index a9683815..dc0e0417 100644
--- a/src/osmo-bts-omldummy/bts_model.c
+++ b/src/osmo-bts-omldummy/bts_model.c
@@ -50,10 +50,10 @@ int osmo_amr_rtp_dec(const uint8_t *rtppayload, int payload_len, uint8_t *cmr,
return -1;
}
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
{
LOGP(DL1C, LOGL_NOTICE, "Unimplemented %s\n", __func__);
- return 0;
+ bts_model_trx_close_cb(trx, 0);
}
int bts_model_adjst_ms_pwr(struct gsm_lchan *lchan)
diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c
index c3bf8b69..57eab120 100644
--- a/src/osmo-bts-sysmo/oml.c
+++ b/src/osmo-bts-sysmo/oml.c
@@ -437,20 +437,24 @@ static int trx_close_compl_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg,
void *data)
{
msgb_free(l1_msg);
+ bts_model_trx_close_cb(trx, 0);
return 0;
}
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
{
struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx);
struct msgb *msg;
+ int rc;
msg = l1p_msgb_alloc();
prim_init(msgb_l1prim(msg), GsmL1_PrimId_MphCloseReq, fl1h,
l1p_handle_for_trx(trx));
LOGP(DL1C, LOGL_NOTICE, "Close TRX %u\n", trx->nr);
- return l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);
+ rc = l1if_gsm_req_compl(fl1h, msg, trx_close_compl_cb, NULL);
+ if (rc < 0)
+ bts_model_trx_close_cb(trx, rc);
}
static int trx_rf_lock(struct gsm_bts_trx *trx, int locked, l1if_compl_cb *cb)
diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c
index 2aa27a74..22b590a5 100644
--- a/src/osmo-bts-trx/l1_if.c
+++ b/src/osmo-bts-trx/l1_if.c
@@ -214,17 +214,27 @@ static void l1if_poweronoff_cb(struct trx_l1h *l1h, bool poweronoff, int rc)
plink->u.osmotrx.poweronoff_sent = false;
if (poweronoff) {
- if (rc == 0 && pinst->phy_link->state != PHY_LINK_CONNECTED) {
+ if (rc == 0 && plink->state != PHY_LINK_CONNECTED) {
trx_sched_clock_started(pinst->trx->bts);
- phy_link_state_set(pinst->phy_link, PHY_LINK_CONNECTED);
+ phy_link_state_set(plink, PHY_LINK_CONNECTED);
/* Begin to ramp up the power on all TRX associated with this phy */
llist_for_each_entry(pinst, &plink->instances, list) {
l1if_trx_start_power_ramp(pinst->trx);
}
- } else if (rc != 0 && pinst->phy_link->state != PHY_LINK_SHUTDOWN) {
+ } else if (rc != 0 && plink->state != PHY_LINK_SHUTDOWN) {
trx_sched_clock_stopped(pinst->trx->bts);
- phy_link_state_set(pinst->phy_link, PHY_LINK_SHUTDOWN);
+ phy_link_state_set(plink, PHY_LINK_SHUTDOWN);
+ }
+ } else {
+ if (plink->state != PHY_LINK_SHUTDOWN) {
+ trx_sched_clock_stopped(pinst->trx->bts);
+ phy_link_state_set(plink, PHY_LINK_SHUTDOWN);
+
+ /* Notify TRX close on all TRX associated with this phy */
+ llist_for_each_entry(pinst, &plink->instances, list) {
+ bts_model_trx_close_cb(pinst->trx, rc);
+ }
}
}
}
@@ -422,7 +432,7 @@ int bts_model_trx_deact_rf(struct gsm_bts_trx *trx)
}
/* deactivate transceiver */
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
{
struct phy_instance *pinst = trx_phy_instance(trx);
struct trx_l1h *l1h = pinst->u.osmotrx.hdl;
@@ -431,12 +441,12 @@ int bts_model_trx_close(struct gsm_bts_trx *trx)
if (l1h->config.enabled) {
l1h->config.enabled = false;
l1if_provision_transceiver_trx(l1h);
- }
+ } else if (!pinst->phy_link->u.osmotrx.poweronoff_sent) {
+ bts_model_trx_close_cb(trx, 0);
+ } /* else: poweroff in progress, cb will be called upon TRXC RSP */
/* Set to Operational State: Disabled */
check_transceiver_availability_trx(l1h, 0);
-
- return 0;
}
/* on RSL failure, deactivate transceiver */
diff --git a/src/osmo-bts-virtual/bts_model.c b/src/osmo-bts-virtual/bts_model.c
index b971af5c..8db0201a 100644
--- a/src/osmo-bts-virtual/bts_model.c
+++ b/src/osmo-bts-virtual/bts_model.c
@@ -50,10 +50,10 @@ int osmo_amr_rtp_dec(const uint8_t *rtppayload, int payload_len, uint8_t *cmr,
return -1;
}
-int bts_model_trx_close(struct gsm_bts_trx *trx)
+void bts_model_trx_close(struct gsm_bts_trx *trx)
{
LOGP(DL1C, LOGL_NOTICE, "Unimplemented %s\n", __func__);
- return 0;
+ bts_model_trx_close_cb(trx, 0);
}
int bts_model_adjst_ms_pwr(struct gsm_lchan *lchan)
diff --git a/tests/stubs.c b/tests/stubs.c
index 20ce5129..4663a447 100644
--- a/tests/stubs.c
+++ b/tests/stubs.c
@@ -1,4 +1,5 @@
#include <osmo-bts/bts.h>
+#include <osmo-bts/bts_model.h>
struct femtol1_hdl;
struct bts_model_set_dyn_pdch_data;
@@ -23,8 +24,8 @@ int bts_model_apply_oml(struct gsm_bts *bts, struct msgb *msg,
int bts_model_trx_deact_rf(struct gsm_bts_trx *trx)
{ return 0; }
-int bts_model_trx_close(struct gsm_bts_trx *trx)
-{ return 0; }
+void bts_model_trx_close(struct gsm_bts_trx *trx)
+{ bts_model_trx_close_cb(trx, 0); }
int bts_model_check_oml(struct gsm_bts *bts, uint8_t msg_type,
struct tlv_parsed *old_attr, struct tlv_parsed *new_attr,
void *obj)