diff options
Diffstat (limited to 'src/osmo-bts-trx')
-rw-r--r-- | src/osmo-bts-trx/l1_if.h | 10 | ||||
-rw-r--r-- | src/osmo-bts-trx/trx_if.c | 59 | ||||
-rw-r--r-- | src/osmo-bts-trx/trx_if.h | 11 | ||||
-rw-r--r-- | src/osmo-bts-trx/trx_provision_fsm.c | 229 | ||||
-rw-r--r-- | src/osmo-bts-trx/trx_provision_fsm.h | 6 |
5 files changed, 228 insertions, 87 deletions
diff --git a/src/osmo-bts-trx/l1_if.h b/src/osmo-bts-trx/l1_if.h index f35936e1..fb988a65 100644 --- a/src/osmo-bts-trx/l1_if.h +++ b/src/osmo-bts-trx/l1_if.h @@ -61,21 +61,27 @@ struct trx_config { uint8_t trxd_hdr_ver_req; /* requested TRXD header version */ uint8_t trxd_hdr_ver_use; /* actual TRXD header version in use */ bool setformat_sent; + bool setformat_acked; bool enabled; bool arfcn_valid; uint16_t arfcn; - bool arfcn_sent; + bool rxtune_sent; + bool rxtune_acked; + bool txtune_sent; + bool txtune_acked; bool tsc_valid; uint8_t tsc; bool tsc_sent; + bool tsc_acked; bool bsic_valid; uint8_t bsic; bool bsic_sent; + bool bsic_acked; bool rxgain_valid; uint8_t rxgain; @@ -84,6 +90,8 @@ struct trx_config { int forced_max_power_red; /* -1 if not forced by VTY config (default) */ bool nominal_power_set_by_vty; /* whether nominal trx power was enforced/retreived from VTY config "nominal-tx-power" */ + bool nomtxpower_sent; + bool nomtxpower_acked; bool maxdly_valid; int maxdly; diff --git a/src/osmo-bts-trx/trx_if.c b/src/osmo-bts-trx/trx_if.c index e650d794..ad6faad9 100644 --- a/src/osmo-bts-trx/trx_if.c +++ b/src/osmo-bts-trx/trx_if.c @@ -270,32 +270,24 @@ int trx_if_cmd_poweron(struct trx_l1h *l1h, trx_if_cmd_poweronoff_cb *cb) } /*! Send "SETFORMAT" command to TRX: change TRXD header format version */ -int trx_if_cmd_setformat(struct trx_l1h *l1h, uint8_t ver) +int trx_if_cmd_setformat(struct trx_l1h *l1h, uint8_t ver, trx_if_cmd_generic_cb *cb) { LOGPPHI(l1h->phy_inst, DTRX, LOGL_INFO, "Requesting TRXD header format version %u\n", ver); - return trx_ctrl_cmd(l1h, 0, "SETFORMAT", "%u", ver); + return trx_ctrl_cmd_cb(l1h, 0, cb, "SETFORMAT", "%u", ver); } /*! Send "SETTSC" command to TRX */ -int trx_if_cmd_settsc(struct trx_l1h *l1h, uint8_t tsc) +int trx_if_cmd_settsc(struct trx_l1h *l1h, uint8_t tsc, trx_if_cmd_generic_cb *cb) { - struct phy_instance *pinst = l1h->phy_inst; - if (pinst->phy_link->u.osmotrx.use_legacy_setbsic) - return 0; - - return trx_ctrl_cmd(l1h, 1, "SETTSC", "%d", tsc); + return trx_ctrl_cmd_cb(l1h, 1, cb, "SETTSC", "%d", tsc); } /*! Send "SETBSIC" command to TRX */ -int trx_if_cmd_setbsic(struct trx_l1h *l1h, uint8_t bsic) +int trx_if_cmd_setbsic(struct trx_l1h *l1h, uint8_t bsic, trx_if_cmd_generic_cb *cb) { - struct phy_instance *pinst = l1h->phy_inst; - if (!pinst->phy_link->u.osmotrx.use_legacy_setbsic) - return 0; - - return trx_ctrl_cmd(l1h, 1, "SETBSIC", "%d", bsic); + return trx_ctrl_cmd_cb(l1h, 1, cb, "SETBSIC", "%d", bsic); } /*! Send "SETRXGAIN" command to TRX */ @@ -335,7 +327,7 @@ int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, uint8_t type, trx_if_cmd } /*! Send "RXTUNE" command to TRX: Tune Receiver to given ARFCN */ -int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn) +int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn, trx_if_cmd_generic_cb *cb) { struct phy_instance *pinst = l1h->phy_inst; uint16_t freq10; @@ -350,11 +342,11 @@ int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn) return -ENOTSUP; } - return trx_ctrl_cmd(l1h, 1, "RXTUNE", "%d", freq10 * 100); + return trx_ctrl_cmd_cb(l1h, 1, cb, "RXTUNE", "%d", freq10 * 100); } /*! Send "TXTUNE" command to TRX: Tune Transmitter to given ARFCN */ -int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn) +int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn, trx_if_cmd_generic_cb *cb) { struct phy_instance *pinst = l1h->phy_inst; uint16_t freq10; @@ -369,7 +361,7 @@ int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn) return -ENOTSUP; } - return trx_ctrl_cmd(l1h, 1, "TXTUNE", "%d", freq10 * 100); + return trx_ctrl_cmd_cb(l1h, 1, cb, "TXTUNE", "%d", freq10 * 100); } /*! Send "HANDOVER" command to TRX: Enable handover RACH Detection on timeslot/sub-slot */ @@ -516,12 +508,17 @@ static int trx_ctrl_rx_rsp_setslot(struct trx_l1h *l1h, struct trx_ctrl_rsp *rsp static int trx_ctrl_rx_rsp_setformat(struct trx_l1h *l1h, struct trx_ctrl_rsp *rsp) { + trx_if_cmd_generic_cb *cb; + /* Old transceivers reject 'SETFORMAT' with 'RSP ERR 1' */ if (strcmp(rsp->cmd, "SETFORMAT") != 0) { LOGPPHI(l1h->phy_inst, DTRX, LOGL_NOTICE, "Transceiver rejected the format negotiation command, " "using legacy TRXD header format version (0)\n"); - l1h->config.trxd_hdr_ver_use = 0; + if (rsp->cb) { + cb = (trx_if_cmd_generic_cb*) rsp->cb; + cb(l1h, 0); + } return 0; } @@ -534,19 +531,9 @@ static int trx_ctrl_rx_rsp_setformat(struct trx_l1h *l1h, return -EINVAL; } - /* Transceiver may suggest a lower version (than requested) */ - if (rsp->status == l1h->config.trxd_hdr_ver_req) { - l1h->config.trxd_hdr_ver_use = rsp->status; - LOGPPHI(l1h->phy_inst, DTRX, LOGL_INFO, - "Using TRXD header format version %u\n", - l1h->config.trxd_hdr_ver_use); - } else { - LOGPPHI(l1h->phy_inst, DTRX, LOGL_DEBUG, - "Transceiver suggests TRXD header version %u (requested %u)\n", - rsp->status, l1h->config.trxd_hdr_ver_req); - /* Send another SETFORMAT with suggested version */ - l1h->config.trxd_hdr_ver_req = rsp->status; - trx_if_cmd_setformat(l1h, rsp->status); + if (rsp->cb) { + cb = (trx_if_cmd_generic_cb*) rsp->cb; + cb(l1h, rsp->status); } return 0; @@ -595,6 +582,8 @@ static int trx_ctrl_rx_rsp(struct trx_l1h *l1h, struct trx_ctrl_rsp *rsp, struct trx_ctrl_msg *tcm) { + trx_if_cmd_generic_cb *cb; + if (strcmp(rsp->cmd, "POWERON") == 0) { return trx_ctrl_rx_rsp_poweron(l1h, rsp); } else if (strcmp(rsp->cmd, "POWEROFF") == 0) { @@ -611,6 +600,12 @@ static int trx_ctrl_rx_rsp(struct trx_l1h *l1h, return trx_ctrl_rx_rsp_setpower(l1h, rsp); } + /* Generic callback if available */ + if (rsp->cb) { + cb = (trx_if_cmd_generic_cb*) rsp->cb; + cb(l1h, rsp->status); + } + if (rsp->status) { LOGPPHI(l1h->phy_inst, DTRX, tcm->critical ? LOGL_FATAL : LOGL_NOTICE, "transceiver rejected TRX command with response: '%s%s%s %d'\n", diff --git a/src/osmo-bts-trx/trx_if.h b/src/osmo-bts-trx/trx_if.h index b2fc326c..6b417cff 100644 --- a/src/osmo-bts-trx/trx_if.h +++ b/src/osmo-bts-trx/trx_if.h @@ -14,6 +14,7 @@ struct trx_ctrl_msg { void *cb; }; +typedef void trx_if_cmd_generic_cb(struct trx_l1h *l1h, int rc); typedef void trx_if_cmd_poweronoff_cb(struct trx_l1h *l1h, bool poweronoff, int rc); typedef void trx_if_cmd_setslot_cb(struct trx_l1h *l1h, uint8_t tn, uint8_t type, int rc); typedef void trx_if_cmd_getnompower_cb(struct trx_l1h *l1h, int nominal_power, int rc); @@ -22,16 +23,16 @@ typedef void trx_if_cmd_setpower_att_cb(struct trx_l1h *l1h, int power_att_db, i void trx_if_init(struct trx_l1h *l1h); int trx_if_cmd_poweroff(struct trx_l1h *l1h, trx_if_cmd_poweronoff_cb *cb); int trx_if_cmd_poweron(struct trx_l1h *l1h, trx_if_cmd_poweronoff_cb *cb); -int trx_if_cmd_settsc(struct trx_l1h *l1h, uint8_t tsc); -int trx_if_cmd_setbsic(struct trx_l1h *l1h, uint8_t bsic); +int trx_if_cmd_settsc(struct trx_l1h *l1h, uint8_t tsc, trx_if_cmd_generic_cb *cb); +int trx_if_cmd_setbsic(struct trx_l1h *l1h, uint8_t bsic, trx_if_cmd_generic_cb *cb); int trx_if_cmd_setrxgain(struct trx_l1h *l1h, int db); int trx_if_cmd_getnompower(struct trx_l1h *l1h, trx_if_cmd_getnompower_cb *cb); int trx_if_cmd_setpower_att(struct trx_l1h *l1h, int power_att_db, trx_if_cmd_setpower_att_cb *cb); int trx_if_cmd_setmaxdly(struct trx_l1h *l1h, int dly); int trx_if_cmd_setmaxdlynb(struct trx_l1h *l1h, int dly); int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, uint8_t type, trx_if_cmd_setslot_cb *cb); -int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn); -int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn); +int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn, trx_if_cmd_generic_cb *cb); +int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn, trx_if_cmd_generic_cb *cb); int trx_if_cmd_handover(struct trx_l1h *l1h, uint8_t tn, uint8_t ss); int trx_if_cmd_nohandover(struct trx_l1h *l1h, uint8_t tn, uint8_t ss); int trx_if_send_burst(struct trx_l1h *l1h, const struct trx_dl_burst_req *br); @@ -41,6 +42,6 @@ int trx_if_powered(struct trx_l1h *l1h); #define TRX_DATA_FORMAT_VER 1 /* Format negotiation command */ -int trx_if_cmd_setformat(struct trx_l1h *l1h, uint8_t ver); +int trx_if_cmd_setformat(struct trx_l1h *l1h, uint8_t ver, trx_if_cmd_generic_cb *cb); #endif /* TRX_IF_H */ diff --git a/src/osmo-bts-trx/trx_provision_fsm.c b/src/osmo-bts-trx/trx_provision_fsm.c index fbeee371..611ec69b 100644 --- a/src/osmo-bts-trx/trx_provision_fsm.c +++ b/src/osmo-bts-trx/trx_provision_fsm.c @@ -56,14 +56,37 @@ static void l1if_poweronoff_cb(struct trx_l1h *l1h, bool poweronoff, int rc) osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_POWEROFF_CNF, (void*)(intptr_t)rc); } + +void l1if_rxtune_cb(struct trx_l1h *l1h, int rc) +{ + osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_RXTUNE_CNF, (void*)(intptr_t)rc); +} + +void l1if_txtune_cb(struct trx_l1h *l1h, int rc) +{ + osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_TXTUNE_CNF, (void*)(intptr_t)rc); +} + +void l1if_settsc_cb(struct trx_l1h *l1h, int rc) +{ + osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_SETTSC_CNF, (void*)(intptr_t)rc); +} + +void l1if_setbsic_cb(struct trx_l1h *l1h, int rc) +{ + osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_SETBSIC_CNF, (void*)(intptr_t)rc); +} + static void l1if_getnompower_cb(struct trx_l1h *l1h, int nominal_power, int rc) { struct phy_instance *pinst = l1h->phy_inst; - struct gsm_bts_trx *trx = pinst->trx; - LOGPPHI(pinst, DL1C, LOGL_DEBUG, "l1if_getnompower_cb(nominal_power=%d, rc=%d)\n", nominal_power, rc); + osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_NOMTXPOWER_CNF, (void*)(intptr_t)nominal_power); +} - l1if_trx_set_nominal_power(trx, nominal_power); +void l1if_setformat_cb(struct trx_l1h *l1h, int rc) +{ + osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_SETFORMAT_CNF, (void*)(intptr_t)rc); } /* @@ -87,59 +110,58 @@ int l1if_provision_transceiver_trx(struct trx_l1h *l1h) return -EIO; } - if (l1h->config.enabled - && l1h->config.tsc_valid - && l1h->config.bsic_valid - && l1h->config.arfcn_valid) { - /* before power on */ - if (!l1h->config.arfcn_sent) { - trx_if_cmd_rxtune(l1h, l1h->config.arfcn); - trx_if_cmd_txtune(l1h, l1h->config.arfcn); + /* before power on */ + if (l1h->config.arfcn_valid) { + if (!l1h->config.rxtune_sent) { + trx_if_cmd_rxtune(l1h, l1h->config.arfcn, l1if_rxtune_cb); + l1h->config.rxtune_sent = true; + l1h->config.rxtune_acked = false; + } + if (!l1h->config.txtune_sent) { + trx_if_cmd_txtune(l1h, l1h->config.arfcn, l1if_txtune_cb); + l1h->config.txtune_sent = true; + l1h->config.txtune_acked = false; + } + if (l1h->config.txtune_acked) { /* After TXTUNE is sent to TRX, get the tx nominal power * (which may vary precisly on band/arfcn. Avoid sending * it if we are forced by VTY to use a specific nominal * power (because TRX may not support the command or * provide broken values) */ - if (!l1h->config.nominal_power_set_by_vty) + if (!l1h->config.nominal_power_set_by_vty && !l1h->config.nomtxpower_sent) { trx_if_cmd_getnompower(l1h, l1if_getnompower_cb); - l1h->config.arfcn_sent = true; - } - if (!l1h->config.tsc_sent) { - trx_if_cmd_settsc(l1h, l1h->config.tsc); - l1h->config.tsc_sent = true; - } - if (!l1h->config.bsic_sent) { - trx_if_cmd_setbsic(l1h, l1h->config.bsic); - l1h->config.bsic_sent = true; - } - - /* Ask transceiver to use the newest TRXD header version if not using it yet */ - if (!l1h->config.setformat_sent) { - if (l1h->config.trxd_hdr_ver_use != plink->u.osmotrx.trxd_hdr_ver_max) { - trx_if_cmd_setformat(l1h, plink->u.osmotrx.trxd_hdr_ver_max); - l1h->config.trxd_hdr_ver_req = plink->u.osmotrx.trxd_hdr_ver_max; - } else { - LOGPPHI(pinst, DL1C, LOGL_INFO, - "No need to negotiate TRXD version, " - "already using maximum configured one: %" PRIu8 "\n", - l1h->config.trxd_hdr_ver_use); + l1h->config.nomtxpower_sent = true; + l1h->config.nomtxpower_acked = false; } - l1h->config.setformat_sent = true; } + } + if (!pinst->phy_link->u.osmotrx.use_legacy_setbsic && + l1h->config.tsc_valid && !l1h->config.tsc_sent) { + trx_if_cmd_settsc(l1h, l1h->config.tsc, l1if_settsc_cb); + l1h->config.tsc_sent = true; + l1h->config.tsc_acked = false; + } + if (pinst->phy_link->u.osmotrx.use_legacy_setbsic && + l1h->config.bsic_valid && !l1h->config.bsic_sent) { + trx_if_cmd_setbsic(l1h, l1h->config.bsic, l1if_setbsic_cb); + l1h->config.bsic_sent = true; + l1h->config.bsic_acked = false; + } - if (pinst->num == 0 && !plink->u.osmotrx.powered && !plink->u.osmotrx.poweronoff_sent) { - trx_if_cmd_poweron(l1h, l1if_poweronoff_cb); - plink->u.osmotrx.poweronoff_sent = true; + /* Ask transceiver to use the newest TRXD header version if not using it yet */ + if (!l1h->config.setformat_sent) { + l1h->config.setformat_sent = true; + if (plink->u.osmotrx.trxd_hdr_ver_max == 0) { + LOGPPHI(pinst, DL1C, LOGL_INFO, + "No need to negotiate max TRXD version 0"); + l1h->config.trxd_hdr_ver_use = 0; + l1h->config.setformat_acked = true; + } else { + trx_if_cmd_setformat(l1h, l1h->config.trxd_hdr_ver_req, l1if_setformat_cb); + l1h->config.setformat_acked = false; } - - return 0; } - LOGPPHI(pinst, DL1C, LOGL_INFO, "Delaying provision, TRX attributes not yet received from BSC:%s%s%s%s\n", - l1h->config.enabled ? "" :" enable", - l1h->config.tsc_valid ? "" : " tsc", - l1h->config.bsic_valid ? "" : " bsic", - l1h->config.arfcn_valid ? "" : " arfcn"); - return 1; + return 0; } static void l1if_setslot_cb(struct trx_l1h *l1h, uint8_t tn, uint8_t type, int rc) @@ -182,6 +204,20 @@ static bool update_ts_data(struct trx_l1h *l1h, struct trx_prov_ev_cfg_ts_data* return false; } +/* Whether a given TRX is fully configured and can be powered on */ +static bool trx_can_be_powered_on(struct trx_l1h *l1h) +{ + struct phy_instance *pinst = l1h->phy_inst; + if (l1h->config.enabled && l1h->config.rxtune_acked && l1h->config.txtune_acked && + (l1h->config.bsic_acked || !pinst->phy_link->u.osmotrx.use_legacy_setbsic) && + (l1h->config.tsc_acked || pinst->phy_link->u.osmotrx.use_legacy_setbsic) && + (l1h->config.nomtxpower_acked || l1h->config.nominal_power_set_by_vty) && + (l1h->config.setformat_acked)) { + return true; + } + return false; +} + ////////////////////////// // FSM STATE ACTIONS @@ -202,12 +238,24 @@ static void st_closed(struct osmo_fsm_inst *fi, uint32_t event, void *data) } } +static void st_open_poweroff_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) +{ + struct trx_l1h *l1h = (struct trx_l1h *)fi->priv; + struct phy_instance *pinst = l1h->phy_inst; + + l1h->config.trxd_hdr_ver_req = pinst->phy_link->u.osmotrx.trxd_hdr_ver_max; +} + static void st_open_poweroff(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct trx_l1h *l1h = (struct trx_l1h *)fi->priv; + struct phy_instance *pinst = l1h->phy_inst; + struct gsm_bts_trx *trx = pinst->trx; uint8_t bsic; uint16_t arfcn; uint16_t tsc; + int nominal_power; + int status; switch(event) { case TRX_PROV_EV_CFG_ENABLE: @@ -226,7 +274,9 @@ static void st_open_poweroff(struct osmo_fsm_inst *fi, uint32_t event, void *dat if (l1h->config.arfcn != arfcn || !l1h->config.arfcn_valid) { l1h->config.arfcn = arfcn; l1h->config.arfcn_valid = true; - l1h->config.arfcn_sent = false; + l1h->config.txtune_sent = false; + l1h->config.rxtune_sent = false; + l1h->config.nomtxpower_sent = false; } break; case TRX_PROV_EV_CFG_TSC: @@ -240,17 +290,84 @@ static void st_open_poweroff(struct osmo_fsm_inst *fi, uint32_t event, void *dat case TRX_PROV_EV_CFG_TS: update_ts_data(l1h, (struct trx_prov_ev_cfg_ts_data*)data); break; + + /* CONFIRMATIONS FROM TRXC */ + case TRX_PROV_EV_RXTUNE_CNF: + if (l1h->config.rxtune_sent) + l1h->config.rxtune_acked = true; + break; + case TRX_PROV_EV_TXTUNE_CNF: + if (l1h->config.txtune_sent) + l1h->config.txtune_acked = true; + break; + case TRX_PROV_EV_NOMTXPOWER_CNF: + nominal_power = (int)(intptr_t)data; + if (l1h->config.nomtxpower_sent) + l1h->config.nomtxpower_acked = true; + l1if_trx_set_nominal_power(trx, nominal_power); + break; + case TRX_PROV_EV_SETBSIC_CNF: + if (l1h->config.bsic_sent) + l1h->config.bsic_acked = true; + break; + case TRX_PROV_EV_SETTSC_CNF: + if (l1h->config.tsc_sent) + l1h->config.tsc_acked = true; + break; + case TRX_PROV_EV_SETFORMAT_CNF: + status = (int)(intptr_t)data; + /* Transceiver may suggest a lower version (than requested) */ + if (status == l1h->config.trxd_hdr_ver_req) { + l1h->config.trxd_hdr_ver_use = status; + l1h->config.setformat_acked = true; + LOGPPHI(l1h->phy_inst, DTRX, LOGL_INFO, + "Using TRXD header format version %u\n", + l1h->config.trxd_hdr_ver_use); + } else { + LOGPPHI(l1h->phy_inst, DTRX, LOGL_DEBUG, + "Transceiver suggests TRXD header version %u (requested %u)\n", + status, l1h->config.trxd_hdr_ver_req); + /* Send another SETFORMAT with suggested version */ + l1h->config.trxd_hdr_ver_req = status; + l1h->config.setformat_sent = false; + } + break; + default: + OSMO_ASSERT(0); } - /* 0 = if we gathered all date and could go forward :*/ - if (l1if_provision_transceiver_trx(l1h) == 0) { + l1if_provision_transceiver_trx(l1h); + + /* if we gathered all data and could go forward :*/ + if (trx_can_be_powered_on(l1h)) { if (l1h->phy_inst->num == 0) trx_prov_fsm_state_chg(fi, TRX_PROV_ST_OPEN_WAIT_POWERON_CNF); else trx_prov_fsm_state_chg(fi, TRX_PROV_ST_OPEN_POWERON); + } else { + LOGPPHI(pinst, DL1C, LOGL_INFO, "Delaying poweron, TRX attributes not yet configured:%s%s%s%s%s%s\n", + l1h->config.enabled ? "" :" enable", + pinst->phy_link->u.osmotrx.use_legacy_setbsic ? + (l1h->config.bsic_valid ? (l1h->config.bsic_acked ? "" : " bsic-ack") : " bsic") : + (l1h->config.tsc_valid ? (l1h->config.tsc_acked ? "" : " tsc-ack") : " tsc"), + l1h->config.arfcn_valid ? "" : " arfcn", + l1h->config.rxtune_acked ? "" : " rxtune-ack", + l1h->config.nominal_power_set_by_vty ? "" : (l1h->config.nomtxpower_acked ? "" : " nomtxpower-ack"), + l1h->config.setformat_acked ? "" : " setformat-ack" + ); } } + +static void st_open_wait_power_cnf_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) +{ + struct trx_l1h *l1h = (struct trx_l1h *)fi->priv; + struct phy_instance *pinst = l1h->phy_inst; + + trx_if_cmd_poweron(l1h, l1if_poweronoff_cb); + pinst->phy_link->u.osmotrx.poweronoff_sent = true; +} + static void st_open_wait_power_cnf(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct trx_l1h *l1h = (struct trx_l1h *)fi->priv; @@ -392,11 +509,18 @@ static struct osmo_fsm_state trx_prov_fsm_states[] = { X(TRX_PROV_EV_CFG_BSIC) | X(TRX_PROV_EV_CFG_ARFCN) | X(TRX_PROV_EV_CFG_TSC) | - X(TRX_PROV_EV_CFG_TS), + X(TRX_PROV_EV_CFG_TS) | + X(TRX_PROV_EV_RXTUNE_CNF) | + X(TRX_PROV_EV_TXTUNE_CNF) | + X(TRX_PROV_EV_NOMTXPOWER_CNF) | + X(TRX_PROV_EV_SETBSIC_CNF) | + X(TRX_PROV_EV_SETTSC_CNF) | + X(TRX_PROV_EV_SETFORMAT_CNF), .out_state_mask = X(TRX_PROV_ST_OPEN_WAIT_POWERON_CNF) | X(TRX_PROV_ST_OPEN_POWERON), .name = "OPEN_POWEROFF", + .onenter = st_open_poweroff_on_enter, .action = st_open_poweroff, }, [TRX_PROV_ST_OPEN_WAIT_POWERON_CNF] = { @@ -406,6 +530,7 @@ static struct osmo_fsm_state trx_prov_fsm_states[] = { .out_state_mask = X(TRX_PROV_ST_OPEN_POWERON), .name = "OPEN_WAIT_POWERON_CNF", + .onenter = st_open_wait_power_cnf_on_enter, .action = st_open_wait_power_cnf, }, [TRX_PROV_ST_OPEN_POWERON] = { @@ -438,6 +563,12 @@ const struct value_string trx_prov_fsm_event_names[] = { OSMO_VALUE_STRING(TRX_PROV_EV_CFG_TS), OSMO_VALUE_STRING(TRX_PROV_EV_CFG_RXGAIN), OSMO_VALUE_STRING(TRX_PROV_EV_CFG_SETMAXDLY), + OSMO_VALUE_STRING(TRX_PROV_EV_RXTUNE_CNF), + OSMO_VALUE_STRING(TRX_PROV_EV_TXTUNE_CNF), + OSMO_VALUE_STRING(TRX_PROV_EV_NOMTXPOWER_CNF), + OSMO_VALUE_STRING(TRX_PROV_EV_SETBSIC_CNF), + OSMO_VALUE_STRING(TRX_PROV_EV_SETTSC_CNF), + OSMO_VALUE_STRING(TRX_PROV_EV_SETFORMAT_CNF), OSMO_VALUE_STRING(TRX_PROV_EV_POWERON_CNF), OSMO_VALUE_STRING(TRX_PROV_EV_POWEROFF), OSMO_VALUE_STRING(TRX_PROV_EV_POWEROFF_CNF), diff --git a/src/osmo-bts-trx/trx_provision_fsm.h b/src/osmo-bts-trx/trx_provision_fsm.h index 7fede35c..24eb2687 100644 --- a/src/osmo-bts-trx/trx_provision_fsm.h +++ b/src/osmo-bts-trx/trx_provision_fsm.h @@ -46,6 +46,12 @@ enum trx_provision_fsm_events { TRX_PROV_EV_CFG_TS, TRX_PROV_EV_CFG_RXGAIN, TRX_PROV_EV_CFG_SETMAXDLY, + TRX_PROV_EV_RXTUNE_CNF, + TRX_PROV_EV_TXTUNE_CNF, + TRX_PROV_EV_NOMTXPOWER_CNF, + TRX_PROV_EV_SETBSIC_CNF, + TRX_PROV_EV_SETTSC_CNF, + TRX_PROV_EV_SETFORMAT_CNF, TRX_PROV_EV_POWERON_CNF, TRX_PROV_EV_POWEROFF, TRX_PROV_EV_POWEROFF_CNF, |