Lines Matching refs:data
43 static inline u16 extract_value(const char *data, int offset) in extract_value() argument
45 return be16_to_cpup((__be16 *)&data[offset]); in extract_value()
124 static int ibmpex_send_message(struct ibmpex_bmc_data *data) in ibmpex_send_message() argument
128 err = ipmi_validate_addr(&data->address, sizeof(data->address)); in ibmpex_send_message()
132 data->tx_msgid++; in ibmpex_send_message()
133 err = ipmi_request_settime(data->user, &data->address, data->tx_msgid, in ibmpex_send_message()
134 &data->tx_message, data, 0, 0, 0); in ibmpex_send_message()
140 dev_err(data->bmc_device, "request_settime=%x\n", err); in ibmpex_send_message()
143 dev_err(data->bmc_device, "validate_addr=%x\n", err); in ibmpex_send_message()
147 static int ibmpex_ver_check(struct ibmpex_bmc_data *data) in ibmpex_ver_check() argument
149 data->tx_msg_data[0] = PEX_GET_VERSION; in ibmpex_ver_check()
150 data->tx_message.data_len = 1; in ibmpex_ver_check()
151 ibmpex_send_message(data); in ibmpex_ver_check()
153 wait_for_completion(&data->read_complete); in ibmpex_ver_check()
155 if (data->rx_result || data->rx_msg_len != 6) in ibmpex_ver_check()
158 data->sensor_major = data->rx_msg_data[0]; in ibmpex_ver_check()
159 data->sensor_minor = data->rx_msg_data[1]; in ibmpex_ver_check()
161 dev_info(data->bmc_device, in ibmpex_ver_check()
163 data->sensor_major, in ibmpex_ver_check()
164 data->sensor_minor, in ibmpex_ver_check()
165 extract_value(data->rx_msg_data, 2), in ibmpex_ver_check()
166 data->rx_msg_data[4], in ibmpex_ver_check()
167 data->rx_msg_data[5], in ibmpex_ver_check()
168 data->interface); in ibmpex_ver_check()
173 static int ibmpex_query_sensor_count(struct ibmpex_bmc_data *data) in ibmpex_query_sensor_count() argument
175 data->tx_msg_data[0] = PEX_GET_SENSOR_COUNT; in ibmpex_query_sensor_count()
176 data->tx_message.data_len = 1; in ibmpex_query_sensor_count()
177 ibmpex_send_message(data); in ibmpex_query_sensor_count()
179 wait_for_completion(&data->read_complete); in ibmpex_query_sensor_count()
181 if (data->rx_result || data->rx_msg_len != 1) in ibmpex_query_sensor_count()
184 return data->rx_msg_data[0]; in ibmpex_query_sensor_count()
187 static int ibmpex_query_sensor_name(struct ibmpex_bmc_data *data, int sensor) in ibmpex_query_sensor_name() argument
189 data->tx_msg_data[0] = PEX_GET_SENSOR_NAME; in ibmpex_query_sensor_name()
190 data->tx_msg_data[1] = sensor; in ibmpex_query_sensor_name()
191 data->tx_message.data_len = 2; in ibmpex_query_sensor_name()
192 ibmpex_send_message(data); in ibmpex_query_sensor_name()
194 wait_for_completion(&data->read_complete); in ibmpex_query_sensor_name()
196 if (data->rx_result || data->rx_msg_len < 1) in ibmpex_query_sensor_name()
202 static int ibmpex_query_sensor_data(struct ibmpex_bmc_data *data, int sensor) in ibmpex_query_sensor_data() argument
204 data->tx_msg_data[0] = PEX_GET_SENSOR_DATA; in ibmpex_query_sensor_data()
205 data->tx_msg_data[1] = sensor; in ibmpex_query_sensor_data()
206 data->tx_message.data_len = 2; in ibmpex_query_sensor_data()
207 ibmpex_send_message(data); in ibmpex_query_sensor_data()
209 wait_for_completion(&data->read_complete); in ibmpex_query_sensor_data()
211 if (data->rx_result || data->rx_msg_len < 26) { in ibmpex_query_sensor_data()
212 dev_err(data->bmc_device, "Error reading sensor %d.\n", in ibmpex_query_sensor_data()
220 static int ibmpex_reset_high_low_data(struct ibmpex_bmc_data *data) in ibmpex_reset_high_low_data() argument
222 data->tx_msg_data[0] = PEX_RESET_HIGH_LOW; in ibmpex_reset_high_low_data()
223 data->tx_message.data_len = 1; in ibmpex_reset_high_low_data()
224 ibmpex_send_message(data); in ibmpex_reset_high_low_data()
226 wait_for_completion(&data->read_complete); in ibmpex_reset_high_low_data()
231 static void ibmpex_update_device(struct ibmpex_bmc_data *data) in ibmpex_update_device() argument
235 mutex_lock(&data->lock); in ibmpex_update_device()
236 if (time_before(jiffies, data->last_updated + REFRESH_INTERVAL) && in ibmpex_update_device()
237 data->valid) in ibmpex_update_device()
240 for (i = 0; i < data->num_sensors; i++) { in ibmpex_update_device()
241 if (!data->sensors[i].in_use) in ibmpex_update_device()
243 err = ibmpex_query_sensor_data(data, i); in ibmpex_update_device()
246 data->sensors[i].values[0] = in ibmpex_update_device()
247 extract_value(data->rx_msg_data, 16); in ibmpex_update_device()
248 data->sensors[i].values[1] = in ibmpex_update_device()
249 extract_value(data->rx_msg_data, 18); in ibmpex_update_device()
250 data->sensors[i].values[2] = in ibmpex_update_device()
251 extract_value(data->rx_msg_data, 20); in ibmpex_update_device()
254 data->last_updated = jiffies; in ibmpex_update_device()
255 data->valid = 1; in ibmpex_update_device()
258 mutex_unlock(&data->lock); in ibmpex_update_device()
284 struct ibmpex_bmc_data *data = dev_get_drvdata(dev); in ibmpex_show_sensor() local
285 int mult = data->sensors[attr->index].multiplier; in ibmpex_show_sensor()
286 ibmpex_update_device(data); in ibmpex_show_sensor()
289 data->sensors[attr->index].values[attr->nr] * mult); in ibmpex_show_sensor()
297 struct ibmpex_bmc_data *data = dev_get_drvdata(dev); in ibmpex_reset_high_low() local
299 ibmpex_reset_high_low_data(data); in ibmpex_reset_high_low()
327 static int power_sensor_multiplier(struct ibmpex_bmc_data *data, in power_sensor_multiplier() argument
332 if (data->sensor_major == 2) in power_sensor_multiplier()
342 static int create_sensor(struct ibmpex_bmc_data *data, int type, in create_sensor() argument
359 sysfs_attr_init(&data->sensors[sensor].attr[func].dev_attr.attr); in create_sensor()
360 data->sensors[sensor].attr[func].dev_attr.attr.name = n; in create_sensor()
361 data->sensors[sensor].attr[func].dev_attr.attr.mode = S_IRUGO; in create_sensor()
362 data->sensors[sensor].attr[func].dev_attr.show = ibmpex_show_sensor; in create_sensor()
363 data->sensors[sensor].attr[func].index = sensor; in create_sensor()
364 data->sensors[sensor].attr[func].nr = func; in create_sensor()
366 err = device_create_file(data->bmc_device, in create_sensor()
367 &data->sensors[sensor].attr[func].dev_attr); in create_sensor()
369 data->sensors[sensor].attr[func].dev_attr.attr.name = NULL; in create_sensor()
377 static int ibmpex_find_sensors(struct ibmpex_bmc_data *data) in ibmpex_find_sensors() argument
385 err = ibmpex_query_sensor_count(data); in ibmpex_find_sensors()
388 data->num_sensors = err; in ibmpex_find_sensors()
390 data->sensors = kzalloc(data->num_sensors * sizeof(*data->sensors), in ibmpex_find_sensors()
392 if (!data->sensors) in ibmpex_find_sensors()
395 for (i = 0; i < data->num_sensors; i++) { in ibmpex_find_sensors()
396 err = ibmpex_query_sensor_name(data, i); in ibmpex_find_sensors()
400 if (is_power_sensor(data->rx_msg_data, data->rx_msg_len)) { in ibmpex_find_sensors()
404 data->sensors[i].multiplier = in ibmpex_find_sensors()
405 power_sensor_multiplier(data, in ibmpex_find_sensors()
406 data->rx_msg_data, in ibmpex_find_sensors()
407 data->rx_msg_len); in ibmpex_find_sensors()
408 } else if (is_temp_sensor(data->rx_msg_data, in ibmpex_find_sensors()
409 data->rx_msg_len)) { in ibmpex_find_sensors()
413 data->sensors[i].multiplier = 1000; in ibmpex_find_sensors()
417 data->sensors[i].in_use = 1; in ibmpex_find_sensors()
421 err = create_sensor(data, sensor_type, sensor_counter, in ibmpex_find_sensors()
428 err = device_create_file(data->bmc_device, in ibmpex_find_sensors()
433 err = device_create_file(data->bmc_device, in ibmpex_find_sensors()
441 device_remove_file(data->bmc_device, in ibmpex_find_sensors()
443 device_remove_file(data->bmc_device, &sensor_dev_attr_name.dev_attr); in ibmpex_find_sensors()
444 for (i = 0; i < data->num_sensors; i++) in ibmpex_find_sensors()
446 if (!data->sensors[i].attr[j].dev_attr.attr.name) in ibmpex_find_sensors()
448 device_remove_file(data->bmc_device, in ibmpex_find_sensors()
449 &data->sensors[i].attr[j].dev_attr); in ibmpex_find_sensors()
450 kfree(data->sensors[i].attr[j].dev_attr.attr.name); in ibmpex_find_sensors()
453 kfree(data->sensors); in ibmpex_find_sensors()
459 struct ibmpex_bmc_data *data; in ibmpex_register_bmc() local
462 data = kzalloc(sizeof(*data), GFP_KERNEL); in ibmpex_register_bmc()
463 if (!data) in ibmpex_register_bmc()
466 data->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; in ibmpex_register_bmc()
467 data->address.channel = IPMI_BMC_CHANNEL; in ibmpex_register_bmc()
468 data->address.data[0] = 0; in ibmpex_register_bmc()
469 data->interface = iface; in ibmpex_register_bmc()
470 data->bmc_device = dev; in ibmpex_register_bmc()
473 err = ipmi_create_user(data->interface, &driver_data.ipmi_hndlrs, in ibmpex_register_bmc()
474 data, &data->user); in ibmpex_register_bmc()
478 data->interface); in ibmpex_register_bmc()
482 mutex_init(&data->lock); in ibmpex_register_bmc()
485 data->tx_msgid = 0; in ibmpex_register_bmc()
486 init_completion(&data->read_complete); in ibmpex_register_bmc()
487 data->tx_message.netfn = PEX_NET_FUNCTION; in ibmpex_register_bmc()
488 data->tx_message.cmd = PEX_COMMAND; in ibmpex_register_bmc()
489 data->tx_message.data = data->tx_msg_data; in ibmpex_register_bmc()
492 err = ibmpex_ver_check(data); in ibmpex_register_bmc()
497 data->hwmon_dev = hwmon_device_register(data->bmc_device); in ibmpex_register_bmc()
499 if (IS_ERR(data->hwmon_dev)) { in ibmpex_register_bmc()
500 dev_err(data->bmc_device, in ibmpex_register_bmc()
502 data->interface); in ibmpex_register_bmc()
507 dev_set_drvdata(dev, data); in ibmpex_register_bmc()
508 list_add_tail(&data->list, &driver_data.bmc_data); in ibmpex_register_bmc()
511 err = ibmpex_find_sensors(data); in ibmpex_register_bmc()
513 dev_err(data->bmc_device, "Error %d finding sensors\n", err); in ibmpex_register_bmc()
520 hwmon_device_unregister(data->hwmon_dev); in ibmpex_register_bmc()
522 ipmi_destroy_user(data->user); in ibmpex_register_bmc()
524 kfree(data); in ibmpex_register_bmc()
527 static void ibmpex_bmc_delete(struct ibmpex_bmc_data *data) in ibmpex_bmc_delete() argument
531 device_remove_file(data->bmc_device, in ibmpex_bmc_delete()
533 device_remove_file(data->bmc_device, &sensor_dev_attr_name.dev_attr); in ibmpex_bmc_delete()
534 for (i = 0; i < data->num_sensors; i++) in ibmpex_bmc_delete()
536 if (!data->sensors[i].attr[j].dev_attr.attr.name) in ibmpex_bmc_delete()
538 device_remove_file(data->bmc_device, in ibmpex_bmc_delete()
539 &data->sensors[i].attr[j].dev_attr); in ibmpex_bmc_delete()
540 kfree(data->sensors[i].attr[j].dev_attr.attr.name); in ibmpex_bmc_delete()
543 list_del(&data->list); in ibmpex_bmc_delete()
544 dev_set_drvdata(data->bmc_device, NULL); in ibmpex_bmc_delete()
545 hwmon_device_unregister(data->hwmon_dev); in ibmpex_bmc_delete()
546 ipmi_destroy_user(data->user); in ibmpex_bmc_delete()
547 kfree(data->sensors); in ibmpex_bmc_delete()
548 kfree(data); in ibmpex_bmc_delete()
553 struct ibmpex_bmc_data *data = get_bmc_data(iface); in ibmpex_bmc_gone() local
555 if (!data) in ibmpex_bmc_gone()
558 ibmpex_bmc_delete(data); in ibmpex_bmc_gone()
563 struct ibmpex_bmc_data *data = (struct ibmpex_bmc_data *)user_msg_data; in ibmpex_msg_handler() local
565 if (msg->msgid != data->tx_msgid) { in ibmpex_msg_handler()
566 dev_err(data->bmc_device, in ibmpex_msg_handler()
569 (int)data->tx_msgid); in ibmpex_msg_handler()
574 data->rx_recv_type = msg->recv_type; in ibmpex_msg_handler()
576 data->rx_result = msg->msg.data[0]; in ibmpex_msg_handler()
578 data->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE; in ibmpex_msg_handler()
581 data->rx_msg_len = msg->msg.data_len - 1; in ibmpex_msg_handler()
582 memcpy(data->rx_msg_data, msg->msg.data + 1, data->rx_msg_len); in ibmpex_msg_handler()
584 data->rx_msg_len = 0; in ibmpex_msg_handler()
587 complete(&data->read_complete); in ibmpex_msg_handler()