diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2020-06-18 19:36:12 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2020-06-23 14:53:37 +0200 |
commit | 8090df2a813a3cf174afb8acb9aba92b65d275fb (patch) | |
tree | cee14c7b8e18b81ea7542c0133c7bd6aa2ee1631 | |
parent | ceb80fc6b6edcc701a423d6bfe8601b08ff3a10d (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.h | 10 | ||||
-rw-r--r-- | src/common/bts_shutdown_fsm.c | 6 | ||||
-rw-r--r-- | src/osmo-bts-litecell15/oml.c | 8 | ||||
-rw-r--r-- | src/osmo-bts-oc2g/oml.c | 8 | ||||
-rw-r--r-- | src/osmo-bts-octphy/l1_oml.c | 7 | ||||
-rw-r--r-- | src/osmo-bts-omldummy/bts_model.c | 4 | ||||
-rw-r--r-- | src/osmo-bts-sysmo/oml.c | 8 | ||||
-rw-r--r-- | src/osmo-bts-trx/l1_if.c | 26 | ||||
-rw-r--r-- | src/osmo-bts-virtual/bts_model.c | 4 | ||||
-rw-r--r-- | tests/stubs.c | 5 |
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) |