diff options
Diffstat (limited to 'src')
-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 |
8 files changed, 50 insertions, 21 deletions
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) |