Lines Matching full:data

42 static inline u16 extract_value(const char *data, int offset)  in extract_value()  argument
44 return be16_to_cpup((__be16 *)&data[offset]); in extract_value()
128 static int ibmpex_send_message(struct ibmpex_bmc_data *data) in ibmpex_send_message() argument
132 err = ipmi_validate_addr(&data->address, sizeof(data->address)); in ibmpex_send_message()
136 data->tx_msgid++; in ibmpex_send_message()
137 err = ipmi_request_settime(data->user, &data->address, data->tx_msgid, in ibmpex_send_message()
138 &data->tx_message, data, 0, 0, 0); in ibmpex_send_message()
144 dev_err(data->bmc_device, "request_settime=%x\n", err); in ibmpex_send_message()
147 dev_err(data->bmc_device, "validate_addr=%x\n", err); in ibmpex_send_message()
151 static int ibmpex_ver_check(struct ibmpex_bmc_data *data) in ibmpex_ver_check() argument
153 data->tx_msg_data[0] = PEX_GET_VERSION; in ibmpex_ver_check()
154 data->tx_message.data_len = 1; in ibmpex_ver_check()
155 ibmpex_send_message(data); in ibmpex_ver_check()
157 wait_for_completion(&data->read_complete); in ibmpex_ver_check()
159 if (data->rx_result || data->rx_msg_len != 6) in ibmpex_ver_check()
162 data->sensor_major = data->rx_msg_data[0]; in ibmpex_ver_check()
163 data->sensor_minor = data->rx_msg_data[1]; in ibmpex_ver_check()
165 dev_info(data->bmc_device, "Found BMC with sensor interface " in ibmpex_ver_check()
167 data->sensor_major, in ibmpex_ver_check()
168 data->sensor_minor, in ibmpex_ver_check()
169 extract_value(data->rx_msg_data, 2), in ibmpex_ver_check()
170 data->rx_msg_data[4], in ibmpex_ver_check()
171 data->rx_msg_data[5], in ibmpex_ver_check()
172 data->interface); in ibmpex_ver_check()
177 static int ibmpex_query_sensor_count(struct ibmpex_bmc_data *data) in ibmpex_query_sensor_count() argument
179 data->tx_msg_data[0] = PEX_GET_SENSOR_COUNT; in ibmpex_query_sensor_count()
180 data->tx_message.data_len = 1; in ibmpex_query_sensor_count()
181 ibmpex_send_message(data); in ibmpex_query_sensor_count()
183 wait_for_completion(&data->read_complete); in ibmpex_query_sensor_count()
185 if (data->rx_result || data->rx_msg_len != 1) in ibmpex_query_sensor_count()
188 return data->rx_msg_data[0]; in ibmpex_query_sensor_count()
191 static int ibmpex_query_sensor_name(struct ibmpex_bmc_data *data, int sensor) in ibmpex_query_sensor_name() argument
193 data->tx_msg_data[0] = PEX_GET_SENSOR_NAME; in ibmpex_query_sensor_name()
194 data->tx_msg_data[1] = sensor; in ibmpex_query_sensor_name()
195 data->tx_message.data_len = 2; in ibmpex_query_sensor_name()
196 ibmpex_send_message(data); in ibmpex_query_sensor_name()
198 wait_for_completion(&data->read_complete); in ibmpex_query_sensor_name()
200 if (data->rx_result || data->rx_msg_len < 1) in ibmpex_query_sensor_name()
206 static int ibmpex_query_sensor_data(struct ibmpex_bmc_data *data, int sensor) in ibmpex_query_sensor_data() argument
208 data->tx_msg_data[0] = PEX_GET_SENSOR_DATA; in ibmpex_query_sensor_data()
209 data->tx_msg_data[1] = sensor; in ibmpex_query_sensor_data()
210 data->tx_message.data_len = 2; in ibmpex_query_sensor_data()
211 ibmpex_send_message(data); in ibmpex_query_sensor_data()
213 wait_for_completion(&data->read_complete); in ibmpex_query_sensor_data()
215 if (data->rx_result || data->rx_msg_len < 26) { in ibmpex_query_sensor_data()
216 dev_err(data->bmc_device, "Error reading sensor %d.\n", in ibmpex_query_sensor_data()
224 static int ibmpex_reset_high_low_data(struct ibmpex_bmc_data *data) in ibmpex_reset_high_low_data() argument
226 data->tx_msg_data[0] = PEX_RESET_HIGH_LOW; in ibmpex_reset_high_low_data()
227 data->tx_message.data_len = 1; in ibmpex_reset_high_low_data()
228 ibmpex_send_message(data); in ibmpex_reset_high_low_data()
230 wait_for_completion(&data->read_complete); in ibmpex_reset_high_low_data()
235 static void ibmpex_update_device(struct ibmpex_bmc_data *data) in ibmpex_update_device() argument
239 mutex_lock(&data->lock); in ibmpex_update_device()
240 if (time_before(jiffies, data->last_updated + REFRESH_INTERVAL) && in ibmpex_update_device()
241 data->valid) in ibmpex_update_device()
244 for (i = 0; i < data->num_sensors; i++) { in ibmpex_update_device()
245 if (!data->sensors[i].in_use) in ibmpex_update_device()
247 err = ibmpex_query_sensor_data(data, i); in ibmpex_update_device()
250 data->sensors[i].values[0] = in ibmpex_update_device()
251 extract_value(data->rx_msg_data, 16); in ibmpex_update_device()
252 data->sensors[i].values[1] = in ibmpex_update_device()
253 extract_value(data->rx_msg_data, 18); in ibmpex_update_device()
254 data->sensors[i].values[2] = in ibmpex_update_device()
255 extract_value(data->rx_msg_data, 20); in ibmpex_update_device()
258 data->last_updated = jiffies; in ibmpex_update_device()
259 data->valid = 1; in ibmpex_update_device()
262 mutex_unlock(&data->lock); in ibmpex_update_device()
288 struct ibmpex_bmc_data *data = dev_get_drvdata(dev); in ibmpex_show_sensor() local
289 int mult = data->sensors[attr->index].multiplier; in ibmpex_show_sensor()
290 ibmpex_update_device(data); in ibmpex_show_sensor()
293 data->sensors[attr->index].values[attr->nr] * mult); in ibmpex_show_sensor()
301 struct ibmpex_bmc_data *data = dev_get_drvdata(dev); in ibmpex_reset_high_low() local
303 ibmpex_reset_high_low_data(data); in ibmpex_reset_high_low()
331 static int power_sensor_multiplier(struct ibmpex_bmc_data *data, in power_sensor_multiplier() argument
336 if (data->sensor_major == 2) in power_sensor_multiplier()
346 static int create_sensor(struct ibmpex_bmc_data *data, int type, in create_sensor() argument
361 sysfs_attr_init(&data->sensors[sensor].attr[func].dev_attr.attr); in create_sensor()
362 data->sensors[sensor].attr[func].dev_attr.attr.name = n; in create_sensor()
363 data->sensors[sensor].attr[func].dev_attr.attr.mode = S_IRUGO; in create_sensor()
364 data->sensors[sensor].attr[func].dev_attr.show = ibmpex_show_sensor; in create_sensor()
365 data->sensors[sensor].attr[func].index = sensor; in create_sensor()
366 data->sensors[sensor].attr[func].nr = func; in create_sensor()
368 err = device_create_file(data->bmc_device, in create_sensor()
369 &data->sensors[sensor].attr[func].dev_attr); in create_sensor()
371 data->sensors[sensor].attr[func].dev_attr.attr.name = NULL; in create_sensor()
379 static int ibmpex_find_sensors(struct ibmpex_bmc_data *data) in ibmpex_find_sensors() argument
387 err = ibmpex_query_sensor_count(data); in ibmpex_find_sensors()
390 data->num_sensors = err; in ibmpex_find_sensors()
392 data->sensors = kzalloc(data->num_sensors * sizeof(*data->sensors), in ibmpex_find_sensors()
394 if (!data->sensors) in ibmpex_find_sensors()
397 for (i = 0; i < data->num_sensors; i++) { in ibmpex_find_sensors()
398 err = ibmpex_query_sensor_name(data, i); in ibmpex_find_sensors()
402 if (is_power_sensor(data->rx_msg_data, data->rx_msg_len)) { in ibmpex_find_sensors()
406 data->sensors[i].multiplier = in ibmpex_find_sensors()
407 power_sensor_multiplier(data, in ibmpex_find_sensors()
408 data->rx_msg_data, in ibmpex_find_sensors()
409 data->rx_msg_len); in ibmpex_find_sensors()
410 } else if (is_temp_sensor(data->rx_msg_data, in ibmpex_find_sensors()
411 data->rx_msg_len)) { in ibmpex_find_sensors()
415 data->sensors[i].multiplier = 1000; in ibmpex_find_sensors()
419 data->sensors[i].in_use = 1; in ibmpex_find_sensors()
423 err = create_sensor(data, sensor_type, sensor_counter, in ibmpex_find_sensors()
430 err = device_create_file(data->bmc_device, in ibmpex_find_sensors()
435 err = device_create_file(data->bmc_device, in ibmpex_find_sensors()
443 device_remove_file(data->bmc_device, in ibmpex_find_sensors()
445 device_remove_file(data->bmc_device, &sensor_dev_attr_name.dev_attr); in ibmpex_find_sensors()
446 for (i = 0; i < data->num_sensors; i++) in ibmpex_find_sensors()
448 if (!data->sensors[i].attr[j].dev_attr.attr.name) in ibmpex_find_sensors()
450 device_remove_file(data->bmc_device, in ibmpex_find_sensors()
451 &data->sensors[i].attr[j].dev_attr); in ibmpex_find_sensors()
452 kfree(data->sensors[i].attr[j].dev_attr.attr.name); in ibmpex_find_sensors()
455 kfree(data->sensors); in ibmpex_find_sensors()
461 struct ibmpex_bmc_data *data; in ibmpex_register_bmc() local
464 data = kzalloc(sizeof(*data), GFP_KERNEL); in ibmpex_register_bmc()
465 if (!data) { in ibmpex_register_bmc()
470 data->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; in ibmpex_register_bmc()
471 data->address.channel = IPMI_BMC_CHANNEL; in ibmpex_register_bmc()
472 data->address.data[0] = 0; in ibmpex_register_bmc()
473 data->interface = iface; in ibmpex_register_bmc()
474 data->bmc_device = dev; in ibmpex_register_bmc()
477 err = ipmi_create_user(data->interface, &driver_data.ipmi_hndlrs, in ibmpex_register_bmc()
478 data, &data->user); in ibmpex_register_bmc()
481 "interface %d\n", data->interface); in ibmpex_register_bmc()
485 mutex_init(&data->lock); in ibmpex_register_bmc()
488 data->tx_msgid = 0; in ibmpex_register_bmc()
489 init_completion(&data->read_complete); in ibmpex_register_bmc()
490 data->tx_message.netfn = PEX_NET_FUNCTION; in ibmpex_register_bmc()
491 data->tx_message.cmd = PEX_COMMAND; in ibmpex_register_bmc()
492 data->tx_message.data = data->tx_msg_data; in ibmpex_register_bmc()
495 err = ibmpex_ver_check(data); in ibmpex_register_bmc()
500 data->hwmon_dev = hwmon_device_register(data->bmc_device); in ibmpex_register_bmc()
502 if (IS_ERR(data->hwmon_dev)) { in ibmpex_register_bmc()
503 dev_err(data->bmc_device, "Unable to register hwmon " in ibmpex_register_bmc()
505 data->interface); in ibmpex_register_bmc()
509 /* finally add the new bmc data to the bmc data list */ in ibmpex_register_bmc()
510 dev_set_drvdata(dev, data); in ibmpex_register_bmc()
511 list_add_tail(&data->list, &driver_data.bmc_data); in ibmpex_register_bmc()
514 err = ibmpex_find_sensors(data); in ibmpex_register_bmc()
516 dev_err(data->bmc_device, "Error %d finding sensors\n", err); in ibmpex_register_bmc()
523 hwmon_device_unregister(data->hwmon_dev); in ibmpex_register_bmc()
525 ipmi_destroy_user(data->user); in ibmpex_register_bmc()
527 kfree(data); in ibmpex_register_bmc()
530 static void ibmpex_bmc_delete(struct ibmpex_bmc_data *data) in ibmpex_bmc_delete() argument
534 device_remove_file(data->bmc_device, in ibmpex_bmc_delete()
536 device_remove_file(data->bmc_device, &sensor_dev_attr_name.dev_attr); in ibmpex_bmc_delete()
537 for (i = 0; i < data->num_sensors; i++) in ibmpex_bmc_delete()
539 if (!data->sensors[i].attr[j].dev_attr.attr.name) in ibmpex_bmc_delete()
541 device_remove_file(data->bmc_device, in ibmpex_bmc_delete()
542 &data->sensors[i].attr[j].dev_attr); in ibmpex_bmc_delete()
543 kfree(data->sensors[i].attr[j].dev_attr.attr.name); in ibmpex_bmc_delete()
546 list_del(&data->list); in ibmpex_bmc_delete()
547 dev_set_drvdata(data->bmc_device, NULL); in ibmpex_bmc_delete()
548 hwmon_device_unregister(data->hwmon_dev); in ibmpex_bmc_delete()
549 ipmi_destroy_user(data->user); in ibmpex_bmc_delete()
550 kfree(data->sensors); in ibmpex_bmc_delete()
551 kfree(data); in ibmpex_bmc_delete()
556 struct ibmpex_bmc_data *data = get_bmc_data(iface); in ibmpex_bmc_gone() local
558 if (!data) in ibmpex_bmc_gone()
561 ibmpex_bmc_delete(data); in ibmpex_bmc_gone()
566 struct ibmpex_bmc_data *data = (struct ibmpex_bmc_data *)user_msg_data; in ibmpex_msg_handler() local
568 if (msg->msgid != data->tx_msgid) { in ibmpex_msg_handler()
569 dev_err(data->bmc_device, "Mismatch between received msgid " in ibmpex_msg_handler()
572 (int)data->tx_msgid); in ibmpex_msg_handler()
577 data->rx_recv_type = msg->recv_type; in ibmpex_msg_handler()
579 data->rx_result = msg->msg.data[0]; in ibmpex_msg_handler()
581 data->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE; in ibmpex_msg_handler()
584 data->rx_msg_len = msg->msg.data_len - 1; in ibmpex_msg_handler()
585 memcpy(data->rx_msg_data, msg->msg.data + 1, data->rx_msg_len); in ibmpex_msg_handler()
587 data->rx_msg_len = 0; in ibmpex_msg_handler()
590 complete(&data->read_complete); in ibmpex_msg_handler()