aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo-bts-litecell15/misc/lc15bts_mgr_temp.c
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2020-10-29 06:40:58 +0700
committerVadim Yanitskiy <vyanitskiy@sysmocom.de>2020-11-05 03:39:50 +0700
commitef1671c6ed3362958b95a7074c8d2242b756c6cf (patch)
tree1c80d546d39abcee29b0924e251a58b451c20369 /src/osmo-bts-litecell15/misc/lc15bts_mgr_temp.c
parent44d25af9cd1288feda867ce60c636d9334521c4f (diff)
osmo-bts-lc15: use consistent name for containing directory
The binary is called 'osmo-bts-lc15', while the containing folder is named 'osmo-bts-litecell15'. This inconsistency complicates automatic generation of the XML VTY reference - fix it. Change-Id: I55c073fbd01aee42871101401d76d87e7c91832e Related: SYS#4937, OS#3036
Diffstat (limited to 'src/osmo-bts-litecell15/misc/lc15bts_mgr_temp.c')
-rw-r--r--src/osmo-bts-litecell15/misc/lc15bts_mgr_temp.c378
1 files changed, 0 insertions, 378 deletions
diff --git a/src/osmo-bts-litecell15/misc/lc15bts_mgr_temp.c b/src/osmo-bts-litecell15/misc/lc15bts_mgr_temp.c
deleted file mode 100644
index 9665e1db..00000000
--- a/src/osmo-bts-litecell15/misc/lc15bts_mgr_temp.c
+++ /dev/null
@@ -1,378 +0,0 @@
-/* Temperature control for NuRAN Litecell 1.5 BTS management daemon */
-
-/* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com>
- *
- * Based on sysmoBTS:
- * sysmobts_mgr_temp.c
- * (C) 2014 by Holger Hans Peter Freyther
- *
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-#include <inttypes.h>
-#include "misc/lc15bts_mgr.h"
-#include "misc/lc15bts_misc.h"
-#include "misc/lc15bts_temp.h"
-#include "misc/lc15bts_power.h"
-#include "misc/lc15bts_led.h"
-#include "misc/lc15bts_swd.h"
-#include "limits.h"
-
-#include <osmo-bts/logging.h>
-
-#include <osmocom/core/timer.h>
-#include <osmocom/core/utils.h>
-#include <osmocom/core/linuxlist.h>
-
-struct lc15bts_mgr_instance *s_mgr;
-static struct osmo_timer_list sensor_ctrl_timer;
-
-static const struct value_string state_names[] = {
- { STATE_NORMAL, "NORMAL" },
- { STATE_WARNING_HYST, "WARNING (HYST)" },
- { STATE_WARNING, "WARNING" },
- { STATE_CRITICAL, "CRITICAL" },
- { 0, NULL }
-};
-
-const char *lc15bts_mgr_sensor_get_state(enum lc15bts_sensor_state state)
-{
- return get_value_string(state_names, state);
-}
-
-static int next_state(enum lc15bts_sensor_state current_state, int critical, int warning)
-{
- int next_state = -1;
- switch (current_state) {
- case STATE_NORMAL:
- if (critical)
- next_state = STATE_CRITICAL;
- else if (warning)
- next_state = STATE_WARNING;
- break;
- case STATE_WARNING_HYST:
- if (critical)
- next_state = STATE_CRITICAL;
- else if (warning)
- next_state = STATE_WARNING;
- else
- next_state = STATE_NORMAL;
- break;
- case STATE_WARNING:
- if (critical)
- next_state = STATE_CRITICAL;
- else if (!warning)
- next_state = STATE_WARNING_HYST;
- break;
- case STATE_CRITICAL:
- if (!critical && !warning)
- next_state = STATE_WARNING;
- break;
- };
-
- return next_state;
-}
-
-static void handle_normal_actions(int actions)
-{
- /* switch on the PA */
- if (actions & SENSOR_ACT_NORM_PA0_ON) {
- if (lc15bts_power_set(LC15BTS_POWER_PA0, 1) != 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to switch on the PA #0\n");
- } else {
- LOGP(DTEMP, LOGL_NOTICE,
- "Switched on the PA #0 as normal action.\n");
- }
- }
-
- if (actions & SENSOR_ACT_NORM_PA1_ON) {
- if (lc15bts_power_set(LC15BTS_POWER_PA1, 1) != 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to switch on the PA #1\n");
- } else {
- LOGP(DTEMP, LOGL_NOTICE,
- "Switched on the PA #1 as normal action.\n");
- }
- }
-
- if (actions & SENSOR_ACT_NORM_BTS_SRV_ON) {
- LOGP(DTEMP, LOGL_NOTICE,
- "Going to switch on the BTS service\n");
- /*
- * TODO: use/create something like nspawn that serializes
- * and used SIGCHLD/waitpid to pick up the dead processes
- * without invoking shell.
- */
- system("/bin/systemctl start osmo-bts.service");
- }
-}
-
-static void handle_actions(int actions)
-{
- /* switch off the PA */
- if (actions & SENSOR_ACT_PA1_OFF) {
- if (lc15bts_power_set(LC15BTS_POWER_PA1, 0) != 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to switch off the PA #1. Stop BTS?\n");
- } else {
- LOGP(DTEMP, LOGL_NOTICE,
- "Switched off the PA #1 due temperature.\n");
- }
- }
-
- if (actions & SENSOR_ACT_PA0_OFF) {
- if (lc15bts_power_set(LC15BTS_POWER_PA0, 0) != 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to switch off the PA #0. Stop BTS?\n");
- } else {
- LOGP(DTEMP, LOGL_NOTICE,
- "Switched off the PA #0 due temperature.\n");
- }
- }
-
- if (actions & SENSOR_ACT_BTS_SRV_OFF) {
- LOGP(DTEMP, LOGL_NOTICE,
- "Going to switch off the BTS service\n");
- /*
- * TODO: use/create something like nspawn that serializes
- * and used SIGCHLD/waitpid to pick up the dead processes
- * without invoking shell.
- */
- system("/bin/systemctl stop osmo-bts.service");
- }
-}
-
-/**
- * Go back to normal! Depending on the configuration execute the normal
- * actions that could (start to) undo everything we did in the other
- * states. What is still missing is the power increase/decrease depending
- * on the state. E.g. starting from WARNING_HYST we might want to slowly
- * ramp up the output power again.
- */
-static void execute_normal_act(struct lc15bts_mgr_instance *manager)
-{
- LOGP(DTEMP, LOGL_NOTICE, "System is back to normal state.\n");
- handle_normal_actions(manager->state.action_norm);
-}
-
-static void execute_warning_act(struct lc15bts_mgr_instance *manager)
-{
- LOGP(DTEMP, LOGL_NOTICE, "System has reached warning state.\n");
- handle_actions(manager->state.action_warn);
-}
-
-static void execute_critical_act(struct lc15bts_mgr_instance *manager)
-{
- LOGP(DTEMP, LOGL_NOTICE, "System has reached critical warning.\n");
- handle_actions(manager->state.action_crit);
-}
-
-static void lc15bts_mgr_sensor_handle(struct lc15bts_mgr_instance *manager,
- int critical, int warning)
-{
- int new_state = next_state(manager->state.state, critical, warning);
-
- /* Nothing changed */
- if (new_state < 0)
- return;
-
- LOGP(DTEMP, LOGL_NOTICE, "Moving from state %s to %s.\n",
- get_value_string(state_names, manager->state.state),
- get_value_string(state_names, new_state));
- manager->state.state = new_state;
- switch (manager->state.state) {
- case STATE_NORMAL:
- execute_normal_act(manager);
- break;
- case STATE_WARNING_HYST:
- /* do nothing? Maybe start to increase transmit power? */
- break;
- case STATE_WARNING:
- execute_warning_act(manager);
- break;
- case STATE_CRITICAL:
- execute_critical_act(manager);
- break;
- };
-}
-
-static void sensor_ctrl_check(struct lc15bts_mgr_instance *mgr)
-{
- int rc;
- int temp = 0;
- int warn_thresh_passed = 0;
- int crit_thresh_passed = 0;
-
- LOGP(DTEMP, LOGL_DEBUG, "Going to check the temperature.\n");
-
- /* Read the current supply temperature */
- rc = lc15bts_temp_get(LC15BTS_TEMP_SUPPLY, &temp);
- if (rc < 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to read the supply temperature. rc=%d\n", rc);
- warn_thresh_passed = crit_thresh_passed = 1;
- } else {
- temp = temp / 1000;
- if (temp > mgr->temp.supply_temp_limit.thresh_warn_max)
- warn_thresh_passed = 1;
- if (temp > mgr->temp.supply_temp_limit.thresh_crit_max)
- crit_thresh_passed = 1;
- LOGP(DTEMP, LOGL_DEBUG, "Supply temperature is: %d\n", temp);
- }
-
- /* Read the current SoC temperature */
- rc = lc15bts_temp_get(LC15BTS_TEMP_SOC, &temp);
- if (rc < 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to read the SoC temperature. rc=%d\n", rc);
- warn_thresh_passed = crit_thresh_passed = 1;
- } else {
- temp = temp / 1000;
- if (temp > mgr->temp.soc_temp_limit.thresh_warn_max)
- warn_thresh_passed = 1;
- if (temp > mgr->temp.soc_temp_limit.thresh_crit_max)
- crit_thresh_passed = 1;
- LOGP(DTEMP, LOGL_DEBUG, "SoC temperature is: %d\n", temp);
- }
-
- /* Read the current fpga temperature */
- rc = lc15bts_temp_get(LC15BTS_TEMP_FPGA, &temp);
- if (rc < 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to read the fpga temperature. rc=%d\n", rc);
- warn_thresh_passed = crit_thresh_passed = 1;
- } else {
- temp = temp / 1000;
- if (temp > mgr->temp.fpga_temp_limit.thresh_warn_max)
- warn_thresh_passed = 1;
- if (temp > mgr->temp.fpga_temp_limit.thresh_crit_max)
- crit_thresh_passed = 1;
- LOGP(DTEMP, LOGL_DEBUG, "FPGA temperature is: %d\n", temp);
- }
-
- /* Read the current RMS detector temperature */
- rc = lc15bts_temp_get(LC15BTS_TEMP_RMSDET, &temp);
- if (rc < 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to read the RMS detector temperature. rc=%d\n", rc);
- warn_thresh_passed = crit_thresh_passed = 1;
- } else {
- temp = temp / 1000;
- if (temp > mgr->temp.rmsdet_temp_limit.thresh_warn_max)
- warn_thresh_passed = 1;
- if (temp > mgr->temp.rmsdet_temp_limit.thresh_crit_max)
- crit_thresh_passed = 1;
- LOGP(DTEMP, LOGL_DEBUG, "RMS detector temperature is: %d\n", temp);
- }
-
- /* Read the current OCXO temperature */
- rc = lc15bts_temp_get(LC15BTS_TEMP_OCXO, &temp);
- if (rc < 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to read the OCXO temperature. rc=%d\n", rc);
- warn_thresh_passed = crit_thresh_passed = 1;
- } else {
- temp = temp / 1000;
- if (temp > mgr->temp.ocxo_temp_limit.thresh_warn_max)
- warn_thresh_passed = 1;
- if (temp > mgr->temp.ocxo_temp_limit.thresh_crit_max)
- crit_thresh_passed = 1;
- LOGP(DTEMP, LOGL_DEBUG, "OCXO temperature is: %d\n", temp);
- }
-
- /* Read the current TX #0 temperature */
- rc = lc15bts_temp_get(LC15BTS_TEMP_TX0, &temp);
- if (rc < 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to read the TX #0 temperature. rc=%d\n", rc);
- warn_thresh_passed = crit_thresh_passed = 1;
- } else {
- temp = temp / 1000;
- if (temp > mgr->temp.tx0_temp_limit.thresh_warn_max)
- warn_thresh_passed = 1;
- if (temp > mgr->temp.tx0_temp_limit.thresh_crit_max)
- crit_thresh_passed = 1;
- LOGP(DTEMP, LOGL_DEBUG, "TX #0 temperature is: %d\n", temp);
- }
-
- /* Read the current TX #1 temperature */
- rc = lc15bts_temp_get(LC15BTS_TEMP_TX1, &temp);
- if (rc < 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to read the TX #1 temperature. rc=%d\n", rc);
- warn_thresh_passed = crit_thresh_passed = 1;
- } else {
- temp = temp / 1000;
- if (temp > mgr->temp.tx1_temp_limit.thresh_warn_max)
- warn_thresh_passed = 1;
- if (temp > mgr->temp.tx1_temp_limit.thresh_crit_max)
- crit_thresh_passed = 1;
- LOGP(DTEMP, LOGL_DEBUG, "TX #1 temperature is: %d\n", temp);
- }
-
- /* Read the current PA #0 temperature */
- rc = lc15bts_temp_get(LC15BTS_TEMP_PA0, &temp);
- if (rc < 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to read the PA #0 temperature. rc=%d\n", rc);
- warn_thresh_passed = crit_thresh_passed = 1;
- } else {
- temp = temp / 1000;
- if (temp > mgr->temp.pa0_temp_limit.thresh_warn_max)
- warn_thresh_passed = 1;
- if (temp > mgr->temp.pa0_temp_limit.thresh_crit_max)
- crit_thresh_passed = 1;
- LOGP(DTEMP, LOGL_DEBUG, "PA #0 temperature is: %d\n", temp);
- }
-
- /* Read the current PA #1 temperature */
- rc = lc15bts_temp_get(LC15BTS_TEMP_PA1, &temp);
- if (rc < 0) {
- LOGP(DTEMP, LOGL_ERROR,
- "Failed to read the PA #1 temperature. rc=%d\n", rc);
- warn_thresh_passed = crit_thresh_passed = 1;
- } else {
- temp = temp / 1000;
- if (temp > mgr->temp.pa1_temp_limit.thresh_warn_max)
- warn_thresh_passed = 1;
- if (temp > mgr->temp.pa1_temp_limit.thresh_crit_max)
- crit_thresh_passed = 1;
- LOGP(DTEMP, LOGL_DEBUG, "PA #1 temperature is: %d\n", temp);
- }
-
- lc15bts_mgr_sensor_handle(mgr, crit_thresh_passed, warn_thresh_passed);
-}
-
-static void sensor_ctrl_check_cb(void *_data)
-{
- struct lc15bts_mgr_instance *mgr = _data;
- sensor_ctrl_check(mgr);
- /* Check every minute? XXX make it configurable! */
- osmo_timer_schedule(&sensor_ctrl_timer, LC15BTS_SENSOR_TIMER_DURATION, 0);
- LOGP(DTEMP, LOGL_DEBUG,"Check sensors timer expired\n");
- /* TODO: do we want to notify if some sensors could not be read? */
- lc15bts_swd_event(mgr, SWD_CHECK_TEMP_SENSOR);
-}
-
-int lc15bts_mgr_sensor_init(struct lc15bts_mgr_instance *mgr)
-{
- s_mgr = mgr;
- sensor_ctrl_timer.cb = sensor_ctrl_check_cb;
- sensor_ctrl_timer.data = s_mgr;
- sensor_ctrl_check_cb(s_mgr);
- return 0;
-}