Lines Matching refs:data
30 static inline u16 extract_value(const char *data, int offset)
32 return be16_to_cpup((__be16 *)&data[offset]);
111 static int ibmpex_send_message(struct ibmpex_bmc_data *data)
115 err = ipmi_validate_addr(&data->address, sizeof(data->address));
119 data->tx_msgid++;
120 err = ipmi_request_settime(data->user, &data->address, data->tx_msgid,
121 &data->tx_message, data, 0, 0, 0);
127 dev_err(data->bmc_device, "request_settime=%x\n", err);
130 dev_err(data->bmc_device, "validate_addr=%x\n", err);
134 static int ibmpex_ver_check(struct ibmpex_bmc_data *data)
136 data->tx_msg_data[0] = PEX_GET_VERSION;
137 data->tx_message.data_len = 1;
138 ibmpex_send_message(data);
140 wait_for_completion(&data->read_complete);
142 if (data->rx_result || data->rx_msg_len != 6)
145 data->sensor_major = data->rx_msg_data[0];
146 data->sensor_minor = data->rx_msg_data[1];
148 dev_info(data->bmc_device,
150 data->sensor_major,
151 data->sensor_minor,
152 extract_value(data->rx_msg_data, 2),
153 data->rx_msg_data[4],
154 data->rx_msg_data[5],
155 data->interface);
160 static int ibmpex_query_sensor_count(struct ibmpex_bmc_data *data)
162 data->tx_msg_data[0] = PEX_GET_SENSOR_COUNT;
163 data->tx_message.data_len = 1;
164 ibmpex_send_message(data);
166 wait_for_completion(&data->read_complete);
168 if (data->rx_result || data->rx_msg_len != 1)
171 return data->rx_msg_data[0];
174 static int ibmpex_query_sensor_name(struct ibmpex_bmc_data *data, int sensor)
176 data->tx_msg_data[0] = PEX_GET_SENSOR_NAME;
177 data->tx_msg_data[1] = sensor;
178 data->tx_message.data_len = 2;
179 ibmpex_send_message(data);
181 wait_for_completion(&data->read_complete);
183 if (data->rx_result || data->rx_msg_len < 1)
189 static int ibmpex_query_sensor_data(struct ibmpex_bmc_data *data, int sensor)
191 data->tx_msg_data[0] = PEX_GET_SENSOR_DATA;
192 data->tx_msg_data[1] = sensor;
193 data->tx_message.data_len = 2;
194 ibmpex_send_message(data);
196 wait_for_completion(&data->read_complete);
198 if (data->rx_result || data->rx_msg_len < 26) {
199 dev_err(data->bmc_device, "Error reading sensor %d.\n",
207 static int ibmpex_reset_high_low_data(struct ibmpex_bmc_data *data)
209 data->tx_msg_data[0] = PEX_RESET_HIGH_LOW;
210 data->tx_message.data_len = 1;
211 ibmpex_send_message(data);
213 wait_for_completion(&data->read_complete);
218 static void ibmpex_update_device(struct ibmpex_bmc_data *data)
222 mutex_lock(&data->lock);
223 if (time_before(jiffies, data->last_updated + REFRESH_INTERVAL) &&
224 data->valid)
227 for (i = 0; i < data->num_sensors; i++) {
228 if (!data->sensors[i].in_use)
230 err = ibmpex_query_sensor_data(data, i);
233 data->sensors[i].values[0] =
234 extract_value(data->rx_msg_data, 16);
235 data->sensors[i].values[1] =
236 extract_value(data->rx_msg_data, 18);
237 data->sensors[i].values[2] =
238 extract_value(data->rx_msg_data, 20);
241 data->last_updated = jiffies;
242 data->valid = 1;
245 mutex_unlock(&data->lock);
271 struct ibmpex_bmc_data *data = dev_get_drvdata(dev);
272 int mult = data->sensors[attr->index].multiplier;
273 ibmpex_update_device(data);
276 data->sensors[attr->index].values[attr->nr] * mult);
283 struct ibmpex_bmc_data *data = dev_get_drvdata(dev);
285 ibmpex_reset_high_low_data(data);
312 static int power_sensor_multiplier(struct ibmpex_bmc_data *data,
317 if (data->sensor_major == 2)
327 static int create_sensor(struct ibmpex_bmc_data *data, int type,
344 sysfs_attr_init(&data->sensors[sensor].attr[func].dev_attr.attr);
345 data->sensors[sensor].attr[func].dev_attr.attr.name = n;
346 data->sensors[sensor].attr[func].dev_attr.attr.mode = 0444;
347 data->sensors[sensor].attr[func].dev_attr.show = ibmpex_show_sensor;
348 data->sensors[sensor].attr[func].index = sensor;
349 data->sensors[sensor].attr[func].nr = func;
351 err = device_create_file(data->bmc_device,
352 &data->sensors[sensor].attr[func].dev_attr);
354 data->sensors[sensor].attr[func].dev_attr.attr.name = NULL;
362 static int ibmpex_find_sensors(struct ibmpex_bmc_data *data)
370 err = ibmpex_query_sensor_count(data);
373 data->num_sensors = err;
375 data->sensors = kcalloc(data->num_sensors, sizeof(*data->sensors),
377 if (!data->sensors)
380 for (i = 0; i < data->num_sensors; i++) {
381 err = ibmpex_query_sensor_name(data, i);
385 if (is_power_sensor(data->rx_msg_data, data->rx_msg_len)) {
389 data->sensors[i].multiplier =
390 power_sensor_multiplier(data,
391 data->rx_msg_data,
392 data->rx_msg_len);
393 } else if (is_temp_sensor(data->rx_msg_data,
394 data->rx_msg_len)) {
398 data->sensors[i].multiplier = 1000;
402 data->sensors[i].in_use = 1;
406 err = create_sensor(data, sensor_type, sensor_counter,
413 err = device_create_file(data->bmc_device,
418 err = device_create_file(data->bmc_device,
426 device_remove_file(data->bmc_device,
428 device_remove_file(data->bmc_device, &sensor_dev_attr_name.dev_attr);
429 for (i = 0; i < data->num_sensors; i++)
431 if (!data->sensors[i].attr[j].dev_attr.attr.name)
433 device_remove_file(data->bmc_device,
434 &data->sensors[i].attr[j].dev_attr);
435 kfree(data->sensors[i].attr[j].dev_attr.attr.name);
438 kfree(data->sensors);
444 struct ibmpex_bmc_data *data;
447 data = kzalloc(sizeof(*data), GFP_KERNEL);
448 if (!data)
451 data->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
452 data->address.channel = IPMI_BMC_CHANNEL;
453 data->address.data[0] = 0;
454 data->interface = iface;
455 data->bmc_device = dev;
458 err = ipmi_create_user(data->interface, &driver_data.ipmi_hndlrs,
459 data, &data->user);
463 data->interface);
467 mutex_init(&data->lock);
470 data->tx_msgid = 0;
471 init_completion(&data->read_complete);
472 data->tx_message.netfn = PEX_NET_FUNCTION;
473 data->tx_message.cmd = PEX_COMMAND;
474 data->tx_message.data = data->tx_msg_data;
477 err = ibmpex_ver_check(data);
482 data->hwmon_dev = hwmon_device_register(data->bmc_device);
484 if (IS_ERR(data->hwmon_dev)) {
485 dev_err(data->bmc_device,
487 data->interface);
491 /* finally add the new bmc data to the bmc data list */
492 dev_set_drvdata(dev, data);
493 list_add_tail(&data->list, &driver_data.bmc_data);
496 err = ibmpex_find_sensors(data);
498 dev_err(data->bmc_device, "Error %d finding sensors\n", err);
505 list_del(&data->list);
506 hwmon_device_unregister(data->hwmon_dev);
508 ipmi_destroy_user(data->user);
510 kfree(data);
513 static void ibmpex_bmc_delete(struct ibmpex_bmc_data *data)
517 device_remove_file(data->bmc_device,
519 device_remove_file(data->bmc_device, &sensor_dev_attr_name.dev_attr);
520 for (i = 0; i < data->num_sensors; i++)
522 if (!data->sensors[i].attr[j].dev_attr.attr.name)
524 device_remove_file(data->bmc_device,
525 &data->sensors[i].attr[j].dev_attr);
526 kfree(data->sensors[i].attr[j].dev_attr.attr.name);
529 list_del(&data->list);
530 dev_set_drvdata(data->bmc_device, NULL);
531 hwmon_device_unregister(data->hwmon_dev);
532 ipmi_destroy_user(data->user);
533 kfree(data->sensors);
534 kfree(data);
539 struct ibmpex_bmc_data *data = get_bmc_data(iface);
541 if (!data)
544 ibmpex_bmc_delete(data);
549 struct ibmpex_bmc_data *data = (struct ibmpex_bmc_data *)user_msg_data;
551 if (msg->msgid != data->tx_msgid) {
552 dev_err(data->bmc_device,
555 (int)data->tx_msgid);
560 data->rx_recv_type = msg->recv_type;
562 data->rx_result = msg->msg.data[0];
564 data->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE;
567 data->rx_msg_len = msg->msg.data_len - 1;
568 memcpy(data->rx_msg_data, msg->msg.data + 1, data->rx_msg_len);
570 data->rx_msg_len = 0;
573 complete(&data->read_complete);