Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
	}
}
Ejemplo n.º 3
0
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;
		}
	}
}
Ejemplo n.º 4
0
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);
}
Ejemplo n.º 5
0
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);
}
Ejemplo n.º 6
0
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

}
Ejemplo n.º 7
0
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;
        }
}