aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2013-11-04 18:13:52 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-11-05 15:51:19 +0100
commit5b69ec3e720d21753101c9a0e1a38d0926ba3854 (patch)
tree5b07ab53e6858ad895cc8041f3beae007647746a
parent08571b158835df3db09cc94686a8fe62d1845cc9 (diff)
sysmobts: Use status flags instead of direct LED access
Currently the LEDs are being accessed directly from within the l1_if.c file. So the handling of rf mute and activate/deactivate both access LED_RF_ACTIVE directly. This may lead to an inconsistent LED status. This patch replaces these calls to sysmobts_led_set() by an abstract equivalent bts_update_status(), that uses a set of independant status ids. The associated values can than be combined into a visible LED status. Currently LED_RF_ACTIVE is on iff BTS_STATUS_RF_ACTIVE is set and BTS_STATUS_RF_MUTE is not set. Sponsored-by: On-Waves ehf
-rw-r--r--include/osmo-bts/bts.h8
-rw-r--r--src/osmo-bts-sysmo/l1_if.c6
-rw-r--r--src/osmo-bts-sysmo/main.c25
3 files changed, 36 insertions, 3 deletions
diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h
index 583c1eb1..e2020350 100644
--- a/include/osmo-bts/bts.h
+++ b/include/osmo-bts/bts.h
@@ -3,6 +3,12 @@
#include <osmo-bts/gsm_data.h>
+enum bts_global_status {
+ BTS_STATUS_RF_ACTIVE,
+ BTS_STATUS_RF_MUTE,
+ BTS_STATUS_LAST,
+};
+
extern void *tall_bts_ctx;
int bts_init(struct gsm_bts *bts);
@@ -27,5 +33,7 @@ int lchan_init_lapdm(struct gsm_lchan *lchan);
void load_timer_start(struct gsm_bts *bts);
+void bts_update_status(enum bts_global_status which, int on);
+
#endif /* _BTS_H */
diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c
index 48d71b0d..c6f99885 100644
--- a/src/osmo-bts-sysmo/l1_if.c
+++ b/src/osmo-bts-sysmo/l1_if.c
@@ -1021,7 +1021,7 @@ static int activate_rf_compl_cb(struct gsm_bts_trx *trx, struct msgb *resp)
get_value_string(femtobts_l1status_names, status));
bts_shutdown(trx->bts, "RF-ACT failure");
} else
- sysmobts_led_set(LED_RF_ACTIVE, 1);
+ bts_update_status(BTS_STATUS_RF_ACTIVE, 1);
/* signal availability */
oml_mo_state_chg(&trx->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OK);
@@ -1032,7 +1032,7 @@ static int activate_rf_compl_cb(struct gsm_bts_trx *trx, struct msgb *resp)
for (i = 0; i < ARRAY_SIZE(trx->ts); i++)
oml_mo_state_chg(&trx->ts[i].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY);
} else {
- sysmobts_led_set(LED_RF_ACTIVE, 0);
+ bts_update_status(BTS_STATUS_RF_ACTIVE, 0);
oml_mo_state_chg(&trx->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE);
oml_mo_state_chg(&trx->bb_transc.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE);
}
@@ -1119,7 +1119,7 @@ static int mute_rf_compl_cb(struct gsm_bts_trx *trx, struct msgb *resp)
} else {
LOGP(DL1C, LOGL_INFO, "Rx RF-MUTE.conf with status=%s\n",
get_value_string(femtobts_l1status_names, status));
- sysmobts_led_set(LED_RF_ACTIVE, !fl1h->last_rf_mute[0]);
+ bts_update_status(BTS_STATUS_RF_MUTE, fl1h->last_rf_mute[0]);
oml_mo_rf_lock_chg(&trx->mo, fl1h->last_rf_mute, 1);
}
diff --git a/src/osmo-bts-sysmo/main.c b/src/osmo-bts-sysmo/main.c
index 5a7c8122..046326be 100644
--- a/src/osmo-bts-sysmo/main.c
+++ b/src/osmo-bts-sysmo/main.c
@@ -51,6 +51,7 @@
#include "utils.h"
#include "eeprom.h"
#include "l1_if.h"
+#include "hw_misc.h"
/* FIXME: read from real hardware */
const uint8_t abis_mac[6] = { 0,1,2,3,4,5 };
@@ -122,6 +123,30 @@ void clk_cal_use_eeprom(struct gsm_bts *bts)
"Read clock calibration(%d) from EEPROM.\n", hdl->clk_cal);
}
+void bts_update_status(enum bts_global_status which, int on)
+{
+ static uint64_t states = 0;
+ uint64_t old_states = states;
+ int led_rf_active_on;
+
+ if (on)
+ states |= (1ULL << which);
+ else
+ states &= ~(1ULL << which);
+
+ led_rf_active_on =
+ (states & (1ULL << BTS_STATUS_RF_ACTIVE)) &&
+ !(states & (1ULL << BTS_STATUS_RF_MUTE));
+
+ LOGP(DL1C, LOGL_INFO,
+ "Set global status #%d to %d (%04llx -> %04llx), LEDs: ACT %d\n",
+ which, on,
+ (long long)old_states, (long long)states,
+ led_rf_active_on);
+
+ sysmobts_led_set(LED_RF_ACTIVE, led_rf_active_on);
+}
+
static void print_help()
{
printf( "Some useful options:\n"