drivers/char/ipmi/ipmi_ssif.c
1000
start_get(ssif_info);
drivers/char/ipmi/ipmi_ssif.c
1003
ssif_info->waiting_alert = true;
drivers/char/ipmi/ipmi_ssif.c
1004
ssif_info->retries_left = SSIF_RECV_RETRIES;
drivers/char/ipmi/ipmi_ssif.c
1005
if (!ssif_info->stopping)
drivers/char/ipmi/ipmi_ssif.c
1006
mod_timer(&ssif_info->retry_timer,
drivers/char/ipmi/ipmi_ssif.c
1008
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
1013
static void start_resend(struct ssif_info *ssif_info)
drivers/char/ipmi/ipmi_ssif.c
1017
ssif_info->got_alert = false;
drivers/char/ipmi/ipmi_ssif.c
1019
if (ssif_info->data_len > 32) {
drivers/char/ipmi/ipmi_ssif.c
1021
ssif_info->multi_data = ssif_info->data;
drivers/char/ipmi/ipmi_ssif.c
1022
ssif_info->multi_len = ssif_info->data_len;
drivers/char/ipmi/ipmi_ssif.c
1028
ssif_info->multi_pos = 32;
drivers/char/ipmi/ipmi_ssif.c
1029
ssif_info->data[0] = 32;
drivers/char/ipmi/ipmi_ssif.c
1031
ssif_info->multi_data = NULL;
drivers/char/ipmi/ipmi_ssif.c
1033
ssif_info->data[0] = ssif_info->data_len;
drivers/char/ipmi/ipmi_ssif.c
1036
ssif_i2c_send(ssif_info, msg_written_handler, I2C_SMBUS_WRITE,
drivers/char/ipmi/ipmi_ssif.c
1037
command, ssif_info->data, I2C_SMBUS_BLOCK_DATA);
drivers/char/ipmi/ipmi_ssif.c
1040
static int start_send(struct ssif_info *ssif_info,
drivers/char/ipmi/ipmi_ssif.c
1046
if (len > ssif_info->max_xmit_msg_size)
drivers/char/ipmi/ipmi_ssif.c
1049
ssif_info->retries_left = SSIF_SEND_RETRIES;
drivers/char/ipmi/ipmi_ssif.c
1050
memcpy(ssif_info->data + 1, data, len);
drivers/char/ipmi/ipmi_ssif.c
1051
ssif_info->data_len = len;
drivers/char/ipmi/ipmi_ssif.c
1052
start_resend(ssif_info);
drivers/char/ipmi/ipmi_ssif.c
1057
static void start_next_msg(struct ssif_info *ssif_info, unsigned long *flags)
drivers/char/ipmi/ipmi_ssif.c
1063
if (!IS_SSIF_IDLE(ssif_info)) {
drivers/char/ipmi/ipmi_ssif.c
1064
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
1068
if (!ssif_info->waiting_msg) {
drivers/char/ipmi/ipmi_ssif.c
1069
ssif_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_ssif.c
1070
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
1074
ssif_info->curr_msg = ssif_info->waiting_msg;
drivers/char/ipmi/ipmi_ssif.c
1075
ssif_info->waiting_msg = NULL;
drivers/char/ipmi/ipmi_ssif.c
1076
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
1077
rv = start_send(ssif_info,
drivers/char/ipmi/ipmi_ssif.c
1078
ssif_info->curr_msg->data,
drivers/char/ipmi/ipmi_ssif.c
1079
ssif_info->curr_msg->data_size);
drivers/char/ipmi/ipmi_ssif.c
1081
msg = ssif_info->curr_msg;
drivers/char/ipmi/ipmi_ssif.c
1082
ssif_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_ssif.c
1083
return_hosed_msg(ssif_info, msg);
drivers/char/ipmi/ipmi_ssif.c
1084
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
drivers/char/ipmi/ipmi_ssif.c
1092
struct ssif_info *ssif_info = send_info;
drivers/char/ipmi/ipmi_ssif.c
1095
BUG_ON(ssif_info->waiting_msg);
drivers/char/ipmi/ipmi_ssif.c
1096
ssif_info->waiting_msg = msg;
drivers/char/ipmi/ipmi_ssif.c
1098
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
drivers/char/ipmi/ipmi_ssif.c
1099
start_next_msg(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
1101
if (ssif_info->ssif_debug & SSIF_DEBUG_TIMING) {
drivers/char/ipmi/ipmi_ssif.c
1105
dev_dbg(&ssif_info->client->dev, "**Enqueue %02x %02x: %ptSp\n",
drivers/char/ipmi/ipmi_ssif.c
1113
struct ssif_info *ssif_info = send_info;
drivers/char/ipmi/ipmi_ssif.c
1115
data->addr_src = ssif_info->addr_source;
drivers/char/ipmi/ipmi_ssif.c
1116
data->dev = &ssif_info->client->dev;
drivers/char/ipmi/ipmi_ssif.c
1117
data->addr_info = ssif_info->addr_info;
drivers/char/ipmi/ipmi_ssif.c
1128
struct ssif_info *ssif_info = send_info;
drivers/char/ipmi/ipmi_ssif.c
1131
if (!ssif_info->has_event_buffer)
drivers/char/ipmi/ipmi_ssif.c
1134
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
drivers/char/ipmi/ipmi_ssif.c
1135
ssif_info->req_events = true;
drivers/char/ipmi/ipmi_ssif.c
1136
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
1145
struct ssif_info *ssif_info = send_info;
drivers/char/ipmi/ipmi_ssif.c
1154
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
drivers/char/ipmi/ipmi_ssif.c
1155
if (timeout != ssif_info->watch_timeout) {
drivers/char/ipmi/ipmi_ssif.c
1156
ssif_info->watch_timeout = timeout;
drivers/char/ipmi/ipmi_ssif.c
1157
if (ssif_info->watch_timeout)
drivers/char/ipmi/ipmi_ssif.c
1158
mod_timer(&ssif_info->watch_timer,
drivers/char/ipmi/ipmi_ssif.c
1159
jiffies + ssif_info->watch_timeout);
drivers/char/ipmi/ipmi_ssif.c
1161
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
1167
struct ssif_info *ssif_info = send_info;
drivers/char/ipmi/ipmi_ssif.c
1169
ssif_info->intf = intf;
drivers/char/ipmi/ipmi_ssif.c
1226
struct ssif_info *ssif_info = dev_get_drvdata(dev); \
drivers/char/ipmi/ipmi_ssif.c
1228
return sysfs_emit(buf, "%u\n", ssif_get_stat(ssif_info, name));\
drivers/char/ipmi/ipmi_ssif.c
1278
struct ssif_info *ssif_info = send_info;
drivers/char/ipmi/ipmi_ssif.c
1280
device_remove_group(&ssif_info->client->dev, &ipmi_ssif_dev_attr_group);
drivers/char/ipmi/ipmi_ssif.c
1281
dev_set_drvdata(&ssif_info->client->dev, NULL);
drivers/char/ipmi/ipmi_ssif.c
1284
while (ssif_info->ssif_state != SSIF_IDLE)
drivers/char/ipmi/ipmi_ssif.c
1287
ssif_info->stopping = true;
drivers/char/ipmi/ipmi_ssif.c
1288
timer_delete_sync(&ssif_info->watch_timer);
drivers/char/ipmi/ipmi_ssif.c
1289
timer_delete_sync(&ssif_info->retry_timer);
drivers/char/ipmi/ipmi_ssif.c
1290
if (ssif_info->thread) {
drivers/char/ipmi/ipmi_ssif.c
1291
kthread_stop(ssif_info->thread);
drivers/char/ipmi/ipmi_ssif.c
1292
ssif_info->thread = NULL;
drivers/char/ipmi/ipmi_ssif.c
1298
struct ssif_info *ssif_info = i2c_get_clientdata(client);
drivers/char/ipmi/ipmi_ssif.c
1305
ipmi_unregister_smi(ssif_info->intf);
drivers/char/ipmi/ipmi_ssif.c
1314
kfree(ssif_info);
drivers/char/ipmi/ipmi_ssif.c
1462
static bool check_acpi(struct ssif_info *ssif_info, struct device *dev)
drivers/char/ipmi/ipmi_ssif.c
1469
ssif_info->addr_source = SI_ACPI;
drivers/char/ipmi/ipmi_ssif.c
1470
ssif_info->addr_info.acpi_info.acpi_handle = acpi_handle;
drivers/char/ipmi/ipmi_ssif.c
1525
struct ssif_info *ssif_info,
drivers/char/ipmi/ipmi_ssif.c
1532
if (ssif_info->max_xmit_msg_size <= 32)
drivers/char/ipmi/ipmi_ssif.c
1535
do_middle = ssif_info->max_xmit_msg_size > 63;
drivers/char/ipmi/ipmi_ssif.c
1579
ssif_info->cmd8_works = true;
drivers/char/ipmi/ipmi_ssif.c
1599
if (ssif_info->max_xmit_msg_size > 63)
drivers/char/ipmi/ipmi_ssif.c
1600
ssif_info->max_xmit_msg_size = 63;
drivers/char/ipmi/ipmi_ssif.c
1604
ssif_info->max_xmit_msg_size = 32;
drivers/char/ipmi/ipmi_ssif.c
1616
struct ssif_info *ssif_info = i2c_get_clientdata(client);
drivers/char/ipmi/ipmi_ssif.c
1618
ipmi_unregister_smi(ssif_info->intf);
drivers/char/ipmi/ipmi_ssif.c
1619
kfree(ssif_info);
drivers/char/ipmi/ipmi_ssif.c
1648
struct ssif_info *ssif_info)
drivers/char/ipmi/ipmi_ssif.c
1660
if (ssif_info->addr_source == SI_ACPI &&
drivers/char/ipmi/ipmi_ssif.c
1677
struct ssif_info *ssif_info;
drivers/char/ipmi/ipmi_ssif.c
1692
ssif_info = kzalloc_obj(*ssif_info);
drivers/char/ipmi/ipmi_ssif.c
1693
if (!ssif_info) {
drivers/char/ipmi/ipmi_ssif.c
1699
if (!check_acpi(ssif_info, &client->dev)) {
drivers/char/ipmi/ipmi_ssif.c
1704
ssif_info->addr_source = SI_HOTMOD;
drivers/char/ipmi/ipmi_ssif.c
1706
ssif_info->addr_source = addr_info->addr_src;
drivers/char/ipmi/ipmi_ssif.c
1707
ssif_info->ssif_debug = addr_info->debug;
drivers/char/ipmi/ipmi_ssif.c
1708
ssif_info->addr_info = addr_info->addr_info;
drivers/char/ipmi/ipmi_ssif.c
1714
ssif_info->client = client;
drivers/char/ipmi/ipmi_ssif.c
1715
i2c_set_clientdata(client, ssif_info);
drivers/char/ipmi/ipmi_ssif.c
1717
rv = ssif_check_and_remove(client, ssif_info);
drivers/char/ipmi/ipmi_ssif.c
1719
if (!rv && ssif_info->addr_source == SI_ACPI) {
drivers/char/ipmi/ipmi_ssif.c
1734
ipmi_addr_src_to_str(ssif_info->addr_source),
drivers/char/ipmi/ipmi_ssif.c
1755
dev_dbg(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1761
ssif_info->max_xmit_msg_size = resp[5];
drivers/char/ipmi/ipmi_ssif.c
1762
ssif_info->max_recv_msg_size = resp[6];
drivers/char/ipmi/ipmi_ssif.c
1763
ssif_info->multi_support = (resp[4] >> 6) & 0x3;
drivers/char/ipmi/ipmi_ssif.c
1764
ssif_info->supports_pec = (resp[4] >> 3) & 0x1;
drivers/char/ipmi/ipmi_ssif.c
1767
switch (ssif_info->multi_support) {
drivers/char/ipmi/ipmi_ssif.c
1769
if (ssif_info->max_xmit_msg_size > 32)
drivers/char/ipmi/ipmi_ssif.c
1770
ssif_info->max_xmit_msg_size = 32;
drivers/char/ipmi/ipmi_ssif.c
1771
if (ssif_info->max_recv_msg_size > 32)
drivers/char/ipmi/ipmi_ssif.c
1772
ssif_info->max_recv_msg_size = 32;
drivers/char/ipmi/ipmi_ssif.c
1776
if (ssif_info->max_xmit_msg_size > 63)
drivers/char/ipmi/ipmi_ssif.c
1777
ssif_info->max_xmit_msg_size = 63;
drivers/char/ipmi/ipmi_ssif.c
1778
if (ssif_info->max_recv_msg_size > 62)
drivers/char/ipmi/ipmi_ssif.c
1779
ssif_info->max_recv_msg_size = 62;
drivers/char/ipmi/ipmi_ssif.c
1793
dev_info(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1797
ssif_info->max_xmit_msg_size = 32;
drivers/char/ipmi/ipmi_ssif.c
1798
ssif_info->max_recv_msg_size = 32;
drivers/char/ipmi/ipmi_ssif.c
1799
ssif_info->multi_support = SSIF_NO_MULTI;
drivers/char/ipmi/ipmi_ssif.c
1800
ssif_info->supports_pec = 0;
drivers/char/ipmi/ipmi_ssif.c
1803
test_multipart_messages(client, ssif_info, resp);
drivers/char/ipmi/ipmi_ssif.c
1811
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1820
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1827
ssif_info->global_enables = resp[3];
drivers/char/ipmi/ipmi_ssif.c
1830
ssif_info->has_event_buffer = true;
drivers/char/ipmi/ipmi_ssif.c
1837
msg[2] = ssif_info->global_enables | IPMI_BMC_EVT_MSG_BUFF;
drivers/char/ipmi/ipmi_ssif.c
1840
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1849
ssif_info->has_event_buffer = true;
drivers/char/ipmi/ipmi_ssif.c
1850
ssif_info->global_enables |= IPMI_BMC_EVT_MSG_BUFF;
drivers/char/ipmi/ipmi_ssif.c
1859
msg[2] = ssif_info->global_enables | IPMI_BMC_RCV_MSG_INTR;
drivers/char/ipmi/ipmi_ssif.c
1862
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1871
ssif_info->supports_alert = true;
drivers/char/ipmi/ipmi_ssif.c
1872
ssif_info->global_enables |= IPMI_BMC_RCV_MSG_INTR;
drivers/char/ipmi/ipmi_ssif.c
1877
dev_dbg(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1882
spin_lock_init(&ssif_info->lock);
drivers/char/ipmi/ipmi_ssif.c
1883
ssif_info->ssif_state = SSIF_IDLE;
drivers/char/ipmi/ipmi_ssif.c
1884
timer_setup(&ssif_info->retry_timer, retry_timeout, 0);
drivers/char/ipmi/ipmi_ssif.c
1885
timer_setup(&ssif_info->watch_timer, watch_timeout, 0);
drivers/char/ipmi/ipmi_ssif.c
1888
atomic_set(&ssif_info->stats[i], 0);
drivers/char/ipmi/ipmi_ssif.c
1890
if (ssif_info->supports_pec)
drivers/char/ipmi/ipmi_ssif.c
1891
ssif_info->client->flags |= I2C_CLIENT_PEC;
drivers/char/ipmi/ipmi_ssif.c
1893
ssif_info->handlers.owner = THIS_MODULE;
drivers/char/ipmi/ipmi_ssif.c
1894
ssif_info->handlers.start_processing = ssif_start_processing;
drivers/char/ipmi/ipmi_ssif.c
1895
ssif_info->handlers.shutdown = shutdown_ssif;
drivers/char/ipmi/ipmi_ssif.c
1896
ssif_info->handlers.get_smi_info = get_smi_info;
drivers/char/ipmi/ipmi_ssif.c
1897
ssif_info->handlers.sender = sender;
drivers/char/ipmi/ipmi_ssif.c
1898
ssif_info->handlers.request_events = request_events;
drivers/char/ipmi/ipmi_ssif.c
1899
ssif_info->handlers.set_need_watch = ssif_set_need_watch;
drivers/char/ipmi/ipmi_ssif.c
1901
thread_num = ((i2c_adapter_id(ssif_info->client->adapter) << 8) |
drivers/char/ipmi/ipmi_ssif.c
1902
ssif_info->client->addr);
drivers/char/ipmi/ipmi_ssif.c
1903
init_completion(&ssif_info->wake_thread);
drivers/char/ipmi/ipmi_ssif.c
1904
ssif_info->thread = kthread_run(ipmi_ssif_thread, ssif_info,
drivers/char/ipmi/ipmi_ssif.c
1906
if (IS_ERR(ssif_info->thread)) {
drivers/char/ipmi/ipmi_ssif.c
1907
rv = PTR_ERR(ssif_info->thread);
drivers/char/ipmi/ipmi_ssif.c
1908
ssif_info->thread = NULL;
drivers/char/ipmi/ipmi_ssif.c
1909
dev_notice(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1915
dev_set_drvdata(&ssif_info->client->dev, ssif_info);
drivers/char/ipmi/ipmi_ssif.c
1916
rv = device_add_group(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1919
dev_err(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1925
rv = ipmi_register_smi(&ssif_info->handlers,
drivers/char/ipmi/ipmi_ssif.c
1926
ssif_info,
drivers/char/ipmi/ipmi_ssif.c
1927
&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1930
dev_err(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1942
if (ssif_info->thread) {
drivers/char/ipmi/ipmi_ssif.c
1943
kthread_stop(ssif_info->thread);
drivers/char/ipmi/ipmi_ssif.c
1944
ssif_info->thread = NULL;
drivers/char/ipmi/ipmi_ssif.c
1949
dev_err(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
1952
kfree(ssif_info);
drivers/char/ipmi/ipmi_ssif.c
1959
device_remove_group(&ssif_info->client->dev, &ipmi_ssif_dev_attr_group);
drivers/char/ipmi/ipmi_ssif.c
196
struct ssif_info;
drivers/char/ipmi/ipmi_ssif.c
1960
dev_set_drvdata(&ssif_info->client->dev, NULL);
drivers/char/ipmi/ipmi_ssif.c
198
typedef void (*ssif_i2c_done)(struct ssif_info *ssif_info, int result,
drivers/char/ipmi/ipmi_ssif.c
303
static void return_hosed_msg(struct ssif_info *ssif_info,
drivers/char/ipmi/ipmi_ssif.c
305
static void start_next_msg(struct ssif_info *ssif_info, unsigned long *flags);
drivers/char/ipmi/ipmi_ssif.c
306
static int start_send(struct ssif_info *ssif_info,
drivers/char/ipmi/ipmi_ssif.c
310
static unsigned long *ipmi_ssif_lock_cond(struct ssif_info *ssif_info,
drivers/char/ipmi/ipmi_ssif.c
312
__acquires(&ssif_info->lock)
drivers/char/ipmi/ipmi_ssif.c
314
spin_lock_irqsave(&ssif_info->lock, *flags);
drivers/char/ipmi/ipmi_ssif.c
318
static void ipmi_ssif_unlock_cond(struct ssif_info *ssif_info,
drivers/char/ipmi/ipmi_ssif.c
320
__releases(&ssif_info->lock)
drivers/char/ipmi/ipmi_ssif.c
322
spin_unlock_irqrestore(&ssif_info->lock, *flags);
drivers/char/ipmi/ipmi_ssif.c
325
static void deliver_recv_msg(struct ssif_info *ssif_info,
drivers/char/ipmi/ipmi_ssif.c
329
return_hosed_msg(ssif_info, msg);
drivers/char/ipmi/ipmi_ssif.c
330
dev_err(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
334
ipmi_smi_msg_received(ssif_info->intf, msg);
drivers/char/ipmi/ipmi_ssif.c
338
static void return_hosed_msg(struct ssif_info *ssif_info,
drivers/char/ipmi/ipmi_ssif.c
341
ssif_inc_stat(ssif_info, hosed);
drivers/char/ipmi/ipmi_ssif.c
349
deliver_recv_msg(ssif_info, msg);
drivers/char/ipmi/ipmi_ssif.c
358
static void start_clear_flags(struct ssif_info *ssif_info, unsigned long *flags)
drivers/char/ipmi/ipmi_ssif.c
362
ssif_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT;
drivers/char/ipmi/ipmi_ssif.c
363
ssif_info->ssif_state = SSIF_CLEARING_FLAGS;
drivers/char/ipmi/ipmi_ssif.c
364
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
371
if (start_send(ssif_info, msg, 3) != 0) {
drivers/char/ipmi/ipmi_ssif.c
373
ssif_info->ssif_state = SSIF_IDLE;
drivers/char/ipmi/ipmi_ssif.c
377
static void start_flag_fetch(struct ssif_info *ssif_info, unsigned long *flags)
drivers/char/ipmi/ipmi_ssif.c
381
ssif_info->req_flags = false;
drivers/char/ipmi/ipmi_ssif.c
382
ssif_info->ssif_state = SSIF_GETTING_FLAGS;
drivers/char/ipmi/ipmi_ssif.c
383
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
387
if (start_send(ssif_info, mb, 2) != 0)
drivers/char/ipmi/ipmi_ssif.c
388
ssif_info->ssif_state = SSIF_IDLE;
drivers/char/ipmi/ipmi_ssif.c
391
static void check_start_send(struct ssif_info *ssif_info, unsigned long *flags,
drivers/char/ipmi/ipmi_ssif.c
394
if (start_send(ssif_info, msg->data, msg->data_size) != 0) {
drivers/char/ipmi/ipmi_ssif.c
397
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
drivers/char/ipmi/ipmi_ssif.c
398
ssif_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_ssif.c
399
ssif_info->ssif_state = SSIF_IDLE;
drivers/char/ipmi/ipmi_ssif.c
400
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
405
static void start_event_fetch(struct ssif_info *ssif_info, unsigned long *flags)
drivers/char/ipmi/ipmi_ssif.c
409
ssif_info->req_events = false;
drivers/char/ipmi/ipmi_ssif.c
413
ssif_info->ssif_state = SSIF_IDLE;
drivers/char/ipmi/ipmi_ssif.c
414
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
418
ssif_info->curr_msg = msg;
drivers/char/ipmi/ipmi_ssif.c
419
if (ssif_info->ssif_state != SSIF_GETTING_EVENTS) {
drivers/char/ipmi/ipmi_ssif.c
420
ssif_info->num_requests_in_a_row = 0;
drivers/char/ipmi/ipmi_ssif.c
421
ssif_info->ssif_state = SSIF_GETTING_EVENTS;
drivers/char/ipmi/ipmi_ssif.c
423
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
429
check_start_send(ssif_info, flags, msg);
drivers/char/ipmi/ipmi_ssif.c
432
static void start_recv_msg_fetch(struct ssif_info *ssif_info,
drivers/char/ipmi/ipmi_ssif.c
439
ssif_info->ssif_state = SSIF_IDLE;
drivers/char/ipmi/ipmi_ssif.c
440
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
444
ssif_info->curr_msg = msg;
drivers/char/ipmi/ipmi_ssif.c
445
if (ssif_info->ssif_state != SSIF_GETTING_MESSAGES) {
drivers/char/ipmi/ipmi_ssif.c
446
ssif_info->num_requests_in_a_row = 0;
drivers/char/ipmi/ipmi_ssif.c
447
ssif_info->ssif_state = SSIF_GETTING_MESSAGES;
drivers/char/ipmi/ipmi_ssif.c
449
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
455
check_start_send(ssif_info, flags, msg);
drivers/char/ipmi/ipmi_ssif.c
464
static void handle_flags(struct ssif_info *ssif_info, unsigned long *flags)
drivers/char/ipmi/ipmi_ssif.c
466
if (ssif_info->msg_flags & WDT_PRE_TIMEOUT_INT) {
drivers/char/ipmi/ipmi_ssif.c
468
ssif_inc_stat(ssif_info, watchdog_pretimeouts);
drivers/char/ipmi/ipmi_ssif.c
469
start_clear_flags(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
470
ipmi_smi_watchdog_pretimeout(ssif_info->intf);
drivers/char/ipmi/ipmi_ssif.c
471
} else if (ssif_info->msg_flags & RECEIVE_MSG_AVAIL)
drivers/char/ipmi/ipmi_ssif.c
473
start_recv_msg_fetch(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
474
else if (ssif_info->msg_flags & EVENT_MSG_BUFFER_FULL)
drivers/char/ipmi/ipmi_ssif.c
476
start_event_fetch(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
478
ssif_info->ssif_state = SSIF_IDLE;
drivers/char/ipmi/ipmi_ssif.c
479
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
485
struct ssif_info *ssif_info = data;
drivers/char/ipmi/ipmi_ssif.c
492
&ssif_info->wake_thread);
drivers/char/ipmi/ipmi_ssif.c
495
init_completion(&ssif_info->wake_thread);
drivers/char/ipmi/ipmi_ssif.c
497
if (ssif_info->i2c_read_write == I2C_SMBUS_WRITE) {
drivers/char/ipmi/ipmi_ssif.c
499
ssif_info->client, ssif_info->i2c_command,
drivers/char/ipmi/ipmi_ssif.c
500
ssif_info->i2c_data[0],
drivers/char/ipmi/ipmi_ssif.c
501
ssif_info->i2c_data + 1);
drivers/char/ipmi/ipmi_ssif.c
502
ssif_info->done_handler(ssif_info, result, NULL, 0);
drivers/char/ipmi/ipmi_ssif.c
505
ssif_info->client, ssif_info->i2c_command,
drivers/char/ipmi/ipmi_ssif.c
506
ssif_info->i2c_data);
drivers/char/ipmi/ipmi_ssif.c
508
ssif_info->done_handler(ssif_info, result,
drivers/char/ipmi/ipmi_ssif.c
511
ssif_info->done_handler(ssif_info, 0,
drivers/char/ipmi/ipmi_ssif.c
512
ssif_info->i2c_data,
drivers/char/ipmi/ipmi_ssif.c
520
static void ssif_i2c_send(struct ssif_info *ssif_info,
drivers/char/ipmi/ipmi_ssif.c
525
ssif_info->done_handler = handler;
drivers/char/ipmi/ipmi_ssif.c
527
ssif_info->i2c_read_write = read_write;
drivers/char/ipmi/ipmi_ssif.c
528
ssif_info->i2c_command = command;
drivers/char/ipmi/ipmi_ssif.c
529
ssif_info->i2c_data = data;
drivers/char/ipmi/ipmi_ssif.c
530
ssif_info->i2c_size = size;
drivers/char/ipmi/ipmi_ssif.c
531
complete(&ssif_info->wake_thread);
drivers/char/ipmi/ipmi_ssif.c
535
static void msg_done_handler(struct ssif_info *ssif_info, int result,
drivers/char/ipmi/ipmi_ssif.c
538
static void start_get(struct ssif_info *ssif_info)
drivers/char/ipmi/ipmi_ssif.c
540
ssif_info->multi_pos = 0;
drivers/char/ipmi/ipmi_ssif.c
542
ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ,
drivers/char/ipmi/ipmi_ssif.c
544
ssif_info->recv, I2C_SMBUS_BLOCK_DATA);
drivers/char/ipmi/ipmi_ssif.c
547
static void start_resend(struct ssif_info *ssif_info);
drivers/char/ipmi/ipmi_ssif.c
551
struct ssif_info *ssif_info = timer_container_of(ssif_info, t,
drivers/char/ipmi/ipmi_ssif.c
556
if (ssif_info->stopping)
drivers/char/ipmi/ipmi_ssif.c
559
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
drivers/char/ipmi/ipmi_ssif.c
560
resend = ssif_info->do_resend;
drivers/char/ipmi/ipmi_ssif.c
561
ssif_info->do_resend = false;
drivers/char/ipmi/ipmi_ssif.c
562
waiting = ssif_info->waiting_alert;
drivers/char/ipmi/ipmi_ssif.c
563
ssif_info->waiting_alert = false;
drivers/char/ipmi/ipmi_ssif.c
564
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
567
start_get(ssif_info);
drivers/char/ipmi/ipmi_ssif.c
569
start_resend(ssif_info);
drivers/char/ipmi/ipmi_ssif.c
570
ssif_inc_stat(ssif_info, send_retries);
drivers/char/ipmi/ipmi_ssif.c
576
struct ssif_info *ssif_info = timer_container_of(ssif_info, t,
drivers/char/ipmi/ipmi_ssif.c
580
if (ssif_info->stopping)
drivers/char/ipmi/ipmi_ssif.c
583
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
drivers/char/ipmi/ipmi_ssif.c
584
if (ssif_info->watch_timeout) {
drivers/char/ipmi/ipmi_ssif.c
585
mod_timer(&ssif_info->watch_timer,
drivers/char/ipmi/ipmi_ssif.c
586
jiffies + ssif_info->watch_timeout);
drivers/char/ipmi/ipmi_ssif.c
587
if (IS_SSIF_IDLE(ssif_info)) {
drivers/char/ipmi/ipmi_ssif.c
588
start_flag_fetch(ssif_info, flags); /* Releases lock */
drivers/char/ipmi/ipmi_ssif.c
591
ssif_info->req_flags = true;
drivers/char/ipmi/ipmi_ssif.c
593
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
599
struct ssif_info *ssif_info = i2c_get_clientdata(client);
drivers/char/ipmi/ipmi_ssif.c
606
ssif_inc_stat(ssif_info, alerts);
drivers/char/ipmi/ipmi_ssif.c
608
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
drivers/char/ipmi/ipmi_ssif.c
609
if (ssif_info->waiting_alert) {
drivers/char/ipmi/ipmi_ssif.c
610
ssif_info->waiting_alert = false;
drivers/char/ipmi/ipmi_ssif.c
611
timer_delete(&ssif_info->retry_timer);
drivers/char/ipmi/ipmi_ssif.c
613
} else if (ssif_info->curr_msg) {
drivers/char/ipmi/ipmi_ssif.c
614
ssif_info->got_alert = true;
drivers/char/ipmi/ipmi_ssif.c
616
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
618
start_get(ssif_info);
drivers/char/ipmi/ipmi_ssif.c
621
static void msg_done_handler(struct ssif_info *ssif_info, int result,
drivers/char/ipmi/ipmi_ssif.c
633
ssif_info->retries_left--;
drivers/char/ipmi/ipmi_ssif.c
634
if (ssif_info->retries_left > 0) {
drivers/char/ipmi/ipmi_ssif.c
635
ssif_inc_stat(ssif_info, receive_retries);
drivers/char/ipmi/ipmi_ssif.c
637
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
drivers/char/ipmi/ipmi_ssif.c
638
ssif_info->waiting_alert = true;
drivers/char/ipmi/ipmi_ssif.c
639
if (!ssif_info->stopping)
drivers/char/ipmi/ipmi_ssif.c
640
mod_timer(&ssif_info->retry_timer,
drivers/char/ipmi/ipmi_ssif.c
642
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
646
ssif_inc_stat(ssif_info, receive_errors);
drivers/char/ipmi/ipmi_ssif.c
648
if (ssif_info->ssif_debug & SSIF_DEBUG_MSG)
drivers/char/ipmi/ipmi_ssif.c
649
dev_dbg(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
655
if ((len > 1) && (ssif_info->multi_pos == 0)
drivers/char/ipmi/ipmi_ssif.c
660
ssif_inc_stat(ssif_info, received_message_parts);
drivers/char/ipmi/ipmi_ssif.c
666
ssif_info->data[i] = data[i];
drivers/char/ipmi/ipmi_ssif.c
667
ssif_info->multi_len = len;
drivers/char/ipmi/ipmi_ssif.c
668
ssif_info->multi_pos = 1;
drivers/char/ipmi/ipmi_ssif.c
670
ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ,
drivers/char/ipmi/ipmi_ssif.c
672
ssif_info->recv, I2C_SMBUS_BLOCK_DATA);
drivers/char/ipmi/ipmi_ssif.c
674
} else if (ssif_info->multi_pos) {
drivers/char/ipmi/ipmi_ssif.c
681
if (ssif_info->ssif_debug & SSIF_DEBUG_MSG)
drivers/char/ipmi/ipmi_ssif.c
682
dev_dbg(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
695
if (ssif_info->ssif_debug & SSIF_DEBUG_MSG)
drivers/char/ipmi/ipmi_ssif.c
696
dev_dbg(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
702
if (ssif_info->multi_len + len > IPMI_MAX_MSG_LENGTH) {
drivers/char/ipmi/ipmi_ssif.c
705
if (ssif_info->ssif_debug & SSIF_DEBUG_MSG)
drivers/char/ipmi/ipmi_ssif.c
706
dev_dbg(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
713
ssif_info->data[i + ssif_info->multi_len] = data[i];
drivers/char/ipmi/ipmi_ssif.c
714
ssif_info->multi_len += len;
drivers/char/ipmi/ipmi_ssif.c
717
len = ssif_info->multi_len;
drivers/char/ipmi/ipmi_ssif.c
718
data = ssif_info->data;
drivers/char/ipmi/ipmi_ssif.c
719
} else if (blocknum + 1 != ssif_info->multi_pos) {
drivers/char/ipmi/ipmi_ssif.c
725
if (ssif_info->ssif_debug & SSIF_DEBUG_MSG)
drivers/char/ipmi/ipmi_ssif.c
726
dev_dbg(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
728
ssif_info->multi_pos - 1, blocknum);
drivers/char/ipmi/ipmi_ssif.c
731
ssif_inc_stat(ssif_info, received_message_parts);
drivers/char/ipmi/ipmi_ssif.c
733
ssif_info->multi_pos++;
drivers/char/ipmi/ipmi_ssif.c
735
ssif_i2c_send(ssif_info, msg_done_handler,
drivers/char/ipmi/ipmi_ssif.c
738
ssif_info->recv,
drivers/char/ipmi/ipmi_ssif.c
746
ssif_inc_stat(ssif_info, receive_errors);
drivers/char/ipmi/ipmi_ssif.c
748
ssif_inc_stat(ssif_info, received_messages);
drivers/char/ipmi/ipmi_ssif.c
749
ssif_inc_stat(ssif_info, received_message_parts);
drivers/char/ipmi/ipmi_ssif.c
752
if (ssif_info->ssif_debug & SSIF_DEBUG_STATE)
drivers/char/ipmi/ipmi_ssif.c
753
dev_dbg(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
755
ssif_info->ssif_state, result);
drivers/char/ipmi/ipmi_ssif.c
757
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
drivers/char/ipmi/ipmi_ssif.c
758
msg = ssif_info->curr_msg;
drivers/char/ipmi/ipmi_ssif.c
768
ssif_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_ssif.c
771
switch (ssif_info->ssif_state) {
drivers/char/ipmi/ipmi_ssif.c
773
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
778
return_hosed_msg(ssif_info, msg);
drivers/char/ipmi/ipmi_ssif.c
780
deliver_recv_msg(ssif_info, msg);
drivers/char/ipmi/ipmi_ssif.c
790
ssif_info->ssif_state = SSIF_IDLE;
drivers/char/ipmi/ipmi_ssif.c
791
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
792
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
800
ssif_info->ssif_state = SSIF_IDLE;
drivers/char/ipmi/ipmi_ssif.c
801
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
802
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
806
ssif_inc_stat(ssif_info, flag_fetches);
drivers/char/ipmi/ipmi_ssif.c
807
ssif_info->msg_flags = data[3];
drivers/char/ipmi/ipmi_ssif.c
808
handle_flags(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
816
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
821
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
825
ssif_info->ssif_state = SSIF_IDLE;
drivers/char/ipmi/ipmi_ssif.c
826
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
832
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
834
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
843
ssif_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL;
drivers/char/ipmi/ipmi_ssif.c
844
handle_flags(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
847
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
852
ssif_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL;
drivers/char/ipmi/ipmi_ssif.c
853
handle_flags(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
855
ssif_info->num_requests_in_a_row++;
drivers/char/ipmi/ipmi_ssif.c
856
if (ssif_info->num_requests_in_a_row > 10)
drivers/char/ipmi/ipmi_ssif.c
858
ssif_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL;
drivers/char/ipmi/ipmi_ssif.c
860
handle_flags(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
861
ssif_inc_stat(ssif_info, events);
drivers/char/ipmi/ipmi_ssif.c
862
deliver_recv_msg(ssif_info, msg);
drivers/char/ipmi/ipmi_ssif.c
869
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
871
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
880
ssif_info->msg_flags &= ~RECEIVE_MSG_AVAIL;
drivers/char/ipmi/ipmi_ssif.c
881
handle_flags(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
884
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
890
ssif_info->msg_flags &= ~RECEIVE_MSG_AVAIL;
drivers/char/ipmi/ipmi_ssif.c
891
handle_flags(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
893
ssif_info->num_requests_in_a_row++;
drivers/char/ipmi/ipmi_ssif.c
894
if (ssif_info->num_requests_in_a_row > 10)
drivers/char/ipmi/ipmi_ssif.c
896
ssif_info->msg_flags &= ~RECEIVE_MSG_AVAIL;
drivers/char/ipmi/ipmi_ssif.c
898
ssif_inc_stat(ssif_info, incoming_messages);
drivers/char/ipmi/ipmi_ssif.c
899
handle_flags(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
900
deliver_recv_msg(ssif_info, msg);
drivers/char/ipmi/ipmi_ssif.c
906
dev_warn(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
908
ssif_info->ssif_state);
drivers/char/ipmi/ipmi_ssif.c
909
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
912
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
drivers/char/ipmi/ipmi_ssif.c
913
if (IS_SSIF_IDLE(ssif_info) && !ssif_info->stopping) {
drivers/char/ipmi/ipmi_ssif.c
914
if (ssif_info->req_events)
drivers/char/ipmi/ipmi_ssif.c
915
start_event_fetch(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
916
else if (ssif_info->req_flags)
drivers/char/ipmi/ipmi_ssif.c
917
start_flag_fetch(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
919
start_next_msg(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
921
ipmi_ssif_unlock_cond(ssif_info, flags);
drivers/char/ipmi/ipmi_ssif.c
923
if (ssif_info->ssif_debug & SSIF_DEBUG_STATE)
drivers/char/ipmi/ipmi_ssif.c
924
dev_dbg(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
925
"DONE 2: state = %d.\n", ssif_info->ssif_state);
drivers/char/ipmi/ipmi_ssif.c
928
static void msg_written_handler(struct ssif_info *ssif_info, int result,
drivers/char/ipmi/ipmi_ssif.c
933
ssif_info->retries_left--;
drivers/char/ipmi/ipmi_ssif.c
934
if (ssif_info->retries_left > 0) {
drivers/char/ipmi/ipmi_ssif.c
939
ssif_info->do_resend = true;
drivers/char/ipmi/ipmi_ssif.c
940
mod_timer(&ssif_info->retry_timer,
drivers/char/ipmi/ipmi_ssif.c
945
ssif_inc_stat(ssif_info, send_errors);
drivers/char/ipmi/ipmi_ssif.c
947
if (ssif_info->ssif_debug & SSIF_DEBUG_MSG)
drivers/char/ipmi/ipmi_ssif.c
948
dev_dbg(&ssif_info->client->dev,
drivers/char/ipmi/ipmi_ssif.c
951
msg_done_handler(ssif_info, -EIO, NULL, 0);
drivers/char/ipmi/ipmi_ssif.c
955
if (ssif_info->multi_data) {
drivers/char/ipmi/ipmi_ssif.c
965
ssif_inc_stat(ssif_info, sent_messages_parts);
drivers/char/ipmi/ipmi_ssif.c
967
left = ssif_info->multi_len - ssif_info->multi_pos;
drivers/char/ipmi/ipmi_ssif.c
972
ssif_info->multi_data[ssif_info->multi_pos] = to_write;
drivers/char/ipmi/ipmi_ssif.c
973
data_to_send = ssif_info->multi_data + ssif_info->multi_pos;
drivers/char/ipmi/ipmi_ssif.c
974
ssif_info->multi_pos += to_write;
drivers/char/ipmi/ipmi_ssif.c
976
if (ssif_info->cmd8_works) {
drivers/char/ipmi/ipmi_ssif.c
979
ssif_info->multi_data = NULL;
drivers/char/ipmi/ipmi_ssif.c
982
ssif_info->multi_data = NULL;
drivers/char/ipmi/ipmi_ssif.c
985
ssif_i2c_send(ssif_info, msg_written_handler,
drivers/char/ipmi/ipmi_ssif.c
992
ssif_inc_stat(ssif_info, sent_messages);
drivers/char/ipmi/ipmi_ssif.c
993
ssif_inc_stat(ssif_info, sent_messages_parts);
drivers/char/ipmi/ipmi_ssif.c
995
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
drivers/char/ipmi/ipmi_ssif.c
996
if (ssif_info->got_alert) {
drivers/char/ipmi/ipmi_ssif.c
998
ssif_info->got_alert = false;
drivers/char/ipmi/ipmi_ssif.c
999
ipmi_ssif_unlock_cond(ssif_info, flags);