diff options
Diffstat (limited to 'src/osmo-bsc/acc.c')
-rw-r--r-- | src/osmo-bsc/acc.c | 153 |
1 files changed, 40 insertions, 113 deletions
diff --git a/src/osmo-bsc/acc.c b/src/osmo-bsc/acc.c index 06f96c625..80a35766c 100644 --- a/src/osmo-bsc/acc.c +++ b/src/osmo-bsc/acc.c @@ -73,9 +73,8 @@ static void acc_mgr_enable_rotation_cond(struct acc_mgr *acc_mgr) if (!osmo_timer_pending(&acc_mgr->rotate_timer)) osmo_timer_schedule(&acc_mgr->rotate_timer, acc_mgr->rotation_time_sec, 0); } else { - /* No rotation needed, disable rotation timer */ - if (osmo_timer_pending(&acc_mgr->rotate_timer)) - osmo_timer_del(&acc_mgr->rotate_timer); + /* No rotation needed, disable rotation timer (if pending) */ + osmo_timer_del(&acc_mgr->rotate_timer); } } @@ -411,122 +410,47 @@ static void do_acc_ramping_step(void *data) } /* Implements osmo_signal_cbfn() -- trigger or abort ACC ramping upon changes RF lock state. */ -static int acc_ramp_nm_sig_cb(unsigned int subsys, unsigned int signal, void *handler_data, void *signal_data) +static int acc_ramp_nm_sig_cb(unsigned int subsys, unsigned int signal, + void *handler_data, void *signal_data) { - struct nm_statechg_signal_data *nsd = signal_data; - struct acc_ramp *acc_ramp = handler_data; - struct gsm_bts_trx *trx = NULL; - bool trigger_ramping = false, abort_ramping = false; - - /* Handled signals map to an Administrative State Change ACK, or a State Changed Event Report. */ - if (signal != S_NM_STATECHG_ADM && signal != S_NM_STATECHG_OPER) + struct nm_running_chg_signal_data *nsd; + struct gsm_bts *bts; + struct gsm_bts_trx *trx; + if (signal != S_NM_RUNNING_CHG) return 0; - - if (nsd->obj_class != NM_OC_RADIO_CARRIER) + nsd = signal_data; + bts = nsd->bts; + switch (nsd->obj_class) { + case NM_OC_RADIO_CARRIER: + trx = (struct gsm_bts_trx *)nsd->obj; + break; + case NM_OC_BASEB_TRANSC: + trx = gsm_bts_bb_trx_get_trx((struct gsm_bts_bb_trx *)nsd->obj); + break; + default: return 0; - - trx = nsd->obj; - - LOG_TRX(trx, DRSL, LOGL_DEBUG, "ACC RAMP: administrative state %s -> %s\n", - get_value_string(abis_nm_adm_state_names, nsd->old_state->administrative), - get_value_string(abis_nm_adm_state_names, nsd->new_state->administrative)); - LOG_TRX(trx, DRSL, LOGL_DEBUG, "ACC RAMP: operational state %s -> %s\n", - abis_nm_opstate_name(nsd->old_state->operational), - abis_nm_opstate_name(nsd->new_state->operational)); + } /* We only care about state changes of the first TRX. */ - if (trx->nr != 0) + if (trx != trx->bts->c0) return 0; - /* RSL must already be up. We cannot send RACH system information to the BTS otherwise. */ - if (trx->rsl_link == NULL) { - LOG_TRX(trx, DRSL, LOGL_DEBUG, - "ACC RAMP: ignoring state change because RSL link is down\n"); - return 0; - } - - /* Trigger or abort ACC ramping based on the new state of this TRX. */ - if (nsd->old_state->administrative != nsd->new_state->administrative) { - switch (nsd->new_state->administrative) { - case NM_STATE_UNLOCKED: - if (nsd->old_state->operational != nsd->new_state->operational) { - /* - * Administrative and operational state have both changed. - * Trigger ramping only if TRX 0 will be both enabled and unlocked. - */ - if (nsd->new_state->operational == NM_OPSTATE_ENABLED) - trigger_ramping = true; - else - LOG_TRX(trx, DRSL, LOGL_DEBUG, - "ACC RAMP: ignoring state change because TRX is " - "transitioning into operational state '%s'\n", - abis_nm_opstate_name(nsd->new_state->operational)); - } else { - /* - * Operational state has not changed. - * Trigger ramping only if TRX 0 is already usable. - */ - if (trx_is_usable(trx)) - trigger_ramping = true; - else - LOG_TRX(trx, DRSL, LOGL_DEBUG, "ACC RAMP: ignoring state change " - "because TRX is not usable\n"); - } - break; - case NM_STATE_LOCKED: - case NM_STATE_SHUTDOWN: - abort_ramping = true; - break; - case NM_STATE_NULL: - default: - LOG_TRX(trx, DRSL, LOGL_ERROR, "ACC RAMP: unrecognized administrative state '0x%x' " - "reported for TRX 0\n", nsd->new_state->administrative); - break; - } - } - if (nsd->old_state->operational != nsd->new_state->operational) { - switch (nsd->new_state->operational) { - case NM_OPSTATE_ENABLED: - if (nsd->old_state->administrative != nsd->new_state->administrative) { - /* - * Administrative and operational state have both changed. - * Trigger ramping only if TRX 0 will be both enabled and unlocked. - */ - if (nsd->new_state->administrative == NM_STATE_UNLOCKED) - trigger_ramping = true; - else - LOG_TRX(trx, DRSL, LOGL_DEBUG, "ACC RAMP: ignoring state change " - "because TRX is transitioning into administrative state '%s'\n", - get_value_string(abis_nm_adm_state_names, nsd->new_state->administrative)); - } else { - /* - * Administrative state has not changed. - * Trigger ramping only if TRX 0 is already unlocked. - */ - if (trx->mo.nm_state.administrative == NM_STATE_UNLOCKED) - trigger_ramping = true; - else - LOG_TRX(trx, DRSL, LOGL_DEBUG, "ACC RAMP: ignoring state change " - "because TRX is in administrative state '%s'\n", - get_value_string(abis_nm_adm_state_names, trx->mo.nm_state.administrative)); - } - break; - case NM_OPSTATE_DISABLED: - abort_ramping = true; - break; - case NM_OPSTATE_NULL: - default: - LOG_TRX(trx, DRSL, LOGL_ERROR, "ACC RAMP: unrecognized operational state '0x%x' " - "reported for TRX 0\n", nsd->new_state->administrative); - break; + LOG_TRX(trx, DRSL, LOGL_DEBUG, "ACC RAMP: nm_obj=%s running=%u\n", + get_value_string(abis_nm_obj_class_names, nsd->obj_class), nsd->running); + if (nsd->running) { + /* Trigger ramping only if TRX 0 is already usable. That usually + * means RCARRIER+BBTRANSC NM objects are running (op=enabled + * adm=unlocked) */ + if (trx_is_usable(trx)) { + LOG_BTS(bts, DPAG, LOGL_INFO, "ACC RAMP: C0 becomes available\n"); + acc_ramp_trigger(&trx->bts->acc_ramp); + } else { + LOG_TRX(trx, DRSL, LOGL_DEBUG, "ACC RAMP: ignoring state change " + "because TRX is not usable\n"); } + } else { + acc_ramp_abort(&trx->bts->acc_ramp); } - - if (trigger_ramping) - acc_ramp_trigger(acc_ramp); - else if (abort_ramping) - acc_ramp_abort(acc_ramp); - return 0; } @@ -548,7 +472,6 @@ void acc_ramp_init(struct acc_ramp *acc_ramp, struct gsm_bts *bts) acc_ramp->chan_load_lower_threshold = ACC_RAMP_CHAN_LOAD_THRESHOLD_LOW; acc_ramp->chan_load_upper_threshold = ACC_RAMP_CHAN_LOAD_THRESHOLD_UP; osmo_timer_setup(&acc_ramp->step_timer, do_acc_ramping_step, acc_ramp); - osmo_signal_register_handler(SS_NM, acc_ramp_nm_sig_cb, acc_ramp); } /*! @@ -641,8 +564,12 @@ void acc_ramp_trigger(struct acc_ramp *acc_ramp) */ void acc_ramp_abort(struct acc_ramp *acc_ramp) { - if (osmo_timer_pending(&acc_ramp->step_timer)) - osmo_timer_del(&acc_ramp->step_timer); + osmo_timer_del(&acc_ramp->step_timer); acc_mgr_set_len_allowed_ramp(&acc_ramp->bts->acc_mgr, 10); } + +void acc_ramp_global_init(void) +{ + osmo_signal_register_handler(SS_NM, acc_ramp_nm_sig_cb, NULL); +} |