static sdata_t * alloc_sdata(ipmi_sensor_t *sensor) { sdata_t *sdata; sdata = malloc(sizeof(*sdata)); if (!sdata) return NULL; sdata->es = malloc(ipmi_event_state_size()); if (!sdata->es) { free(sdata); return NULL; } ipmi_event_state_init(sdata->es); sdata->th = malloc(ipmi_thresholds_size()); if (!sdata->th) { free(sdata->es); free(sdata); return NULL; } ipmi_thresholds_init(sdata->th); sdata->refcount = 1; sdata->sensor_id = ipmi_sensor_convert_to_id(sensor); ipmi_sensor_get_name(sensor, sdata->name, sizeof(sdata->name)); sdata->next = sdata_list; sdata->prev = NULL; sdata_list = sdata; return sdata; }
static void set_sensor_event_enable_masks(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_event_enable_masks *enable_data; int rv; ipmi_event_state_t info; enable_data = cb_data; if (ignore_sensor(sensor)) { dbg("sensor is ignored"); enable_data->done = 1; enable_data->rvalue = SA_ERR_HPI_INTERNAL_ERROR; return; } ipmi_event_state_init(&info); if (enable_data->enable == SAHPI_TRUE) ipmi_event_state_set_events_enabled(&info, 1); else ipmi_event_state_set_events_enabled(&info, 0); if ((ipmi_sensor_get_event_support(sensor) == IPMI_EVENT_SUPPORT_PER_STATE)|| (ipmi_sensor_get_event_support(sensor) == IPMI_EVENT_SUPPORT_ENTIRE_SENSOR)) { int i; for (i = 0; i < 32 ; i++) { if (enable_data->assert & 1<<i ) ipmi_discrete_event_set(&info, i, IPMI_ASSERTION); else ipmi_discrete_event_clear(&info, i, IPMI_ASSERTION); if (enable_data->deassert & 1<<i ) ipmi_discrete_event_set(&info, i, IPMI_DEASSERTION); else ipmi_discrete_event_clear(&info, i, IPMI_DEASSERTION); } } rv = ipmi_sensor_events_enable_set(sensor, &info, set_data, &enable_data->done); if (rv) { dbg("Unable to sensor event enable: 0x%x\n", rv); enable_data->done = 1; enable_data->rvalue = SA_ERR_HPI_INTERNAL_ERROR; } }
static void set_sensor_event_enable_masks(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_event_enable_masks *enable_data = cb_data; int rv; ipmi_event_state_t *info = enable_data->states; if (ignore_sensor(sensor)) { dbg("sensor is ignored"); enable_data->done = 1; enable_data->rvalue = SA_ERR_HPI_NOT_PRESENT; return; } ipmi_event_state_init(info); ipmi_event_state_set_events_enabled(info, (enable_data->enable == SAHPI_TRUE) ? 1 : 0); if (insert_events_to_ipmi_event_state(sensor, info, enable_data->assert, enable_data->deassert, enable_data->a_support, enable_data->d_support)) { dbg("Attempt to set not supported event 0x%x/0x%x", enable_data->assert, enable_data->deassert); enable_data->done = 1; enable_data->rvalue = SA_ERR_HPI_INVALID_DATA; return; } rv = ipmi_sensor_set_event_enables(sensor, info, mask_set_data, enable_data); if (rv) { dbg("Unable to sensor event enable = %d", rv); enable_data->done = 1; if (rv == EINVAL) { // invalid event in mask for this sensor */ enable_data->rvalue = SA_ERR_HPI_INVALID_DATA; } else { enable_data->rvalue = SA_ERR_HPI_INTERNAL_ERROR; } } }
static void sensor_rearm(ipmi_sensor_t *sensor, void *cb_data) { ipmi_cmd_info_t *cmd_info = cb_data; ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info); int rv; int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info); int argc = ipmi_cmdlang_get_argc(cmd_info); char **argv = ipmi_cmdlang_get_argv(cmd_info); int global; ipmi_event_state_t *s = NULL; if ((argc - curr_arg) < 1) { cmdlang->errstr = "Not enough parameters"; cmdlang->err = EINVAL; goto out_err; } if (strcmp(argv[curr_arg], "global") == 0) { global = 1; } else { global = 0; s = ipmi_mem_alloc(ipmi_event_state_size()); if (!s) { cmdlang->errstr = "Out of memory"; cmdlang->err = ENOMEM; goto out_err; } ipmi_event_state_init(s); if (ipmi_sensor_get_event_reading_type(sensor) == IPMI_EVENT_READING_TYPE_THRESHOLD) { enum ipmi_thresh_e thresh; enum ipmi_event_value_dir_e value_dir; enum ipmi_event_dir_e dir; while (curr_arg < argc) { ipmi_cmdlang_get_threshold_ev(argv[curr_arg], &thresh, &value_dir, &dir, cmd_info); if (cmdlang->err) { goto out_err; } ipmi_threshold_event_set(s, thresh, value_dir, dir); curr_arg++; } } else { int offset; enum ipmi_event_dir_e dir; while (curr_arg < argc) { ipmi_cmdlang_get_discrete_ev(argv[curr_arg], &offset, &dir, cmd_info); if (cmdlang->err) { goto out_err; } ipmi_discrete_event_set(s, offset, dir); curr_arg++; } } } ipmi_cmdlang_cmd_info_get(cmd_info); rv = ipmi_sensor_rearm(sensor, global, s, sensor_rearm_done, cmd_info); if (rv) { ipmi_cmdlang_cmd_info_put(cmd_info); cmdlang->err = rv; cmdlang->errstr = "Error rearming sensor"; goto out_err; } if (s) ipmi_mem_free(s); return; out_err: ipmi_sensor_get_name(sensor, cmdlang->objstr, cmdlang->objstr_len); cmdlang->location = "cmd_sensor.c(sensor_rearm)"; if (s) ipmi_mem_free(s); }
static void mod_event_enables(ipmi_sensor_t *sensor, void *cb_data, enum ev_en_kind kind) { ipmi_cmd_info_t *cmd_info = cb_data; ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info); int rv; int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info); int argc = ipmi_cmdlang_get_argc(cmd_info); char **argv = ipmi_cmdlang_get_argv(cmd_info); ipmi_event_state_t *s = NULL; if ((argc - curr_arg) < 2) { /* Not enough parameters */ cmdlang->errstr = "Not enough parameters"; cmdlang->err = EINVAL; goto out_err; } s = ipmi_mem_alloc(ipmi_states_size()); if (!s) { cmdlang->errstr = "Out of memory"; cmdlang->err = ENOMEM; goto out_err; } ipmi_event_state_init(s); if (strcmp(argv[curr_arg], "msg") == 0) ipmi_event_state_set_events_enabled(s, 1); else if (strcmp(argv[curr_arg], "nomsg") == 0) ipmi_event_state_set_events_enabled(s, 0); else { cmdlang->errstr = "Invalid message enable setting"; cmdlang->err = EINVAL; goto out_err; } curr_arg++; if (strcmp(argv[curr_arg], "scan") == 0) ipmi_event_state_set_scanning_enabled(s, 1); else if (strcmp(argv[curr_arg], "noscan") == 0) ipmi_event_state_set_scanning_enabled(s, 0); else { cmdlang->errstr = "Invalid scanning enable setting"; cmdlang->err = EINVAL; goto out_err; } curr_arg++; if (ipmi_sensor_get_event_reading_type(sensor) == IPMI_EVENT_READING_TYPE_THRESHOLD) { while (curr_arg < argc) { enum ipmi_thresh_e thresh; enum ipmi_event_value_dir_e value_dir; enum ipmi_event_dir_e dir; ipmi_cmdlang_get_threshold_ev(argv[curr_arg], &thresh, &value_dir, &dir, cmd_info); if (cmdlang->err) { goto out_err; } ipmi_threshold_event_set(s, thresh, value_dir, dir); curr_arg++; } } else { while (curr_arg < argc) { int offset; enum ipmi_event_dir_e dir; ipmi_cmdlang_get_discrete_ev(argv[curr_arg], &offset, &dir, cmd_info); if (cmdlang->err) { goto out_err; } ipmi_discrete_event_set(s, offset, dir); curr_arg++; } } ipmi_cmdlang_cmd_info_get(cmd_info); switch (kind) { case ev_en_set: rv = ipmi_sensor_set_event_enables(sensor, s, sensor_set_event_enables_done, cmd_info); break; case ev_en_enable: rv = ipmi_sensor_enable_events(sensor, s, sensor_set_event_enables_done, cmd_info); break; case ev_en_disable: rv = ipmi_sensor_disable_events(sensor, s, sensor_set_event_enables_done, cmd_info); break; default: rv = EINVAL; } if (rv) { ipmi_cmdlang_cmd_info_put(cmd_info); cmdlang->err = rv; cmdlang->errstr = "Error setting event enables"; goto out_err; } ipmi_mem_free(s); return; out_err: ipmi_sensor_get_name(sensor, cmdlang->objstr, cmdlang->objstr_len); cmdlang->location = "cmd_sensor.c(sensor_set_event_enables)"; if (s) ipmi_mem_free(s); }
static void set_sensor_event_enables(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_enables *enables_data; int rv; ipmi_event_state_t info; enables_data = cb_data; if (ignore_sensor(sensor)) { dbg("sensor is ignored"); enables_data->done = 1; return; } ipmi_event_state_init(&info); if (*enables_data->enables == SAHPI_TRUE) ipmi_event_state_set_events_enabled(&info, 1); else ipmi_event_state_set_events_enabled(&info, 0); rv = ipmi_sensor_events_enable_set(sensor, &info, set_data, &enables_data->done); if (rv) { dbg("Unable to sensor event enables: 0x%x\n", rv); enables_data->done = 1; } #if 0 if ((ipmi_sensor_get_event_support(sensor) == IPMI_EVENT_SUPPORT_PER_STATE)|| (ipmi_sensor_get_event_support(sensor) == IPMI_EVENT_SUPPORT_ENTIRE_SENSOR)) { ipmi_event_state_init(&info); if (enables_data->sensor_enables->SensorStatus & SAHPI_SENSTAT_EVENTS_ENABLED) ipmi_event_state_set_events_enabled(&info, 1); if (enables_data->sensor_enables->SensorStatus & SAHPI_SENSTAT_SCAN_ENABLED) ipmi_event_state_set_scanning_enabled(&info, 1); if (enables_data->sensor_enables->SensorStatus & SAHPI_SENSTAT_BUSY) ipmi_event_state_set_busy(&info, 1); for (i = 0; i < 32; i++) { if (enables_data->sensor_enables->AssertEvents & 1<<i ) ipmi_discrete_event_set(&info, i, IPMI_ASSERTION); else ipmi_discrete_event_clear(&info, i, IPMI_ASSERTION); if (enables_data->sensor_enables->DeassertEvents & 1<<i ) ipmi_discrete_event_set(&info, i, IPMI_DEASSERTION); else ipmi_discrete_event_clear(&info, i, IPMI_DEASSERTION); } rv = ipmi_sensor_events_enable_set(sensor, &info, set_data, &enables_data->done); if (rv) { dbg("Unable to sensor event enables: 0x%x\n", rv); enables_data->done = 1; } } else { dbg("%#x", ipmi_sensor_get_event_support(sensor)); enables_data->done = 1; } #endif }
static void set_sensor_event_enables(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_enables *enables_data; int rv; ipmi_event_state_t info; int i; enables_data = cb_data; if (is_ignored_sensor(sensor)) { dbg("sensor is ignored"); enables_data->done = 1; return; } if ((ipmi_sensor_get_event_support(sensor) == IPMI_EVENT_SUPPORT_PER_STATE)|| (ipmi_sensor_get_event_support(sensor) == IPMI_EVENT_SUPPORT_ENTIRE_SENSOR)) { ipmi_event_state_init(&info); if (enables_data->sensor_enables->SensorStatus & SAHPI_SENSTAT_EVENTS_ENABLED) ipmi_event_state_set_events_enabled(&info, 1); if (enables_data->sensor_enables->SensorStatus & SAHPI_SENSTAT_SCAN_ENABLED) ipmi_event_state_set_scanning_enabled(&info, 1); if (enables_data->sensor_enables->SensorStatus & SAHPI_SENSTAT_BUSY) ipmi_event_state_set_busy(&info, 1); #if 0 if ( enables_data->sensor_enables->AssertEvents == 0xffff ) { /* enable all assertion events */ info.__assertion_events = 0; for( i = 0; i < 12; i++ ) { int val = 0; if ( ipmi_sensor_get_event_reading_type( sensor ) == IPMI_EVENT_READING_TYPE_THRESHOLD ) ipmi_sensor_threshold_assertion_event_supported( sensor, 0, i, &val ); else ipmi_sensor_discrete_assertion_event_supported( sensor, i, &val ); if ( val ) info.__assertion_events |= (1 << i); } } else info.__assertion_events = enables_data->sensor_enables->AssertEvents; if ( enables_data->sensor_enables->DeassertEvents == 0xffff ) { /* enable all deassertion events */ info.__deassertion_events = 0; for( i = 0; i < 12; i++ ) { int val = 0; if ( ipmi_sensor_get_event_reading_type( sensor ) == IPMI_EVENT_READING_TYPE_THRESHOLD ) ipmi_sensor_threshold_deassertion_event_supported( sensor, 0, i, &val ); else ipmi_sensor_discrete_deassertion_event_supported( sensor, i, &val ); if ( val ) info.__deassertion_events |= (1 << i); } } else info.__deassertion_events = enables_data->sensor_enables->DeassertEvents; #endif for (i = 0; i < 32; i++) { if (enables_data->sensor_enables->AssertEvents & 1<<i ) ipmi_discrete_event_set(&info, i, IPMI_ASSERTION); else ipmi_discrete_event_clear(&info, i, IPMI_ASSERTION); if (enables_data->sensor_enables->DeassertEvents & 1<<i ) ipmi_discrete_event_set(&info, i, IPMI_DEASSERTION); else ipmi_discrete_event_clear(&info, i, IPMI_DEASSERTION); } rv = ipmi_sensor_events_enable_set(sensor, &info, set_data, &enables_data->done); if (rv) { dbg("Unable to sensor event enables: 0x%x\n", rv); enables_data->done = 1; } } else { dbg("%#x", ipmi_sensor_get_event_support(sensor)); enables_data->done = 1; } }