drivers/char/ipmi/ipmi_si_intf.c
1003
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1005
smi_info->run_to_completion = i_run_to_completion;
drivers/char/ipmi/ipmi_si_intf.c
1007
flush_messages(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1016
const struct smi_info *smi_info,
drivers/char/ipmi/ipmi_si_intf.c
1021
if (smi_info->si_num < num_max_busy_us)
drivers/char/ipmi/ipmi_si_intf.c
1022
max_busy_us = kipmid_max_busy_us[smi_info->si_num];
drivers/char/ipmi/ipmi_si_intf.c
1048
struct smi_info *smi_info = data;
drivers/char/ipmi/ipmi_si_intf.c
1057
spin_lock_irqsave(&(smi_info->si_lock), flags);
drivers/char/ipmi/ipmi_si_intf.c
1058
smi_result = smi_event_handler(smi_info, 0);
drivers/char/ipmi/ipmi_si_intf.c
1067
if (smi_result != SI_SM_IDLE && !smi_info->timer_running)
drivers/char/ipmi/ipmi_si_intf.c
1068
smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES);
drivers/char/ipmi/ipmi_si_intf.c
1070
spin_unlock_irqrestore(&(smi_info->si_lock), flags);
drivers/char/ipmi/ipmi_si_intf.c
1071
busy_wait = ipmi_thread_busy_wait(smi_result, smi_info,
drivers/char/ipmi/ipmi_si_intf.c
1082
if (smi_info->in_maintenance_mode)
drivers/char/ipmi/ipmi_si_intf.c
1087
if (atomic_read(&smi_info->need_watch)) {
drivers/char/ipmi/ipmi_si_intf.c
1104
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1106
bool run_to_completion = smi_info->run_to_completion;
drivers/char/ipmi/ipmi_si_intf.c
1114
spin_lock_irqsave(&smi_info->si_lock, flags);
drivers/char/ipmi/ipmi_si_intf.c
1115
smi_event_handler(smi_info, 10);
drivers/char/ipmi/ipmi_si_intf.c
1117
spin_unlock_irqrestore(&smi_info->si_lock, flags);
drivers/char/ipmi/ipmi_si_intf.c
1122
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1124
if (!smi_info->has_event_buffer)
drivers/char/ipmi/ipmi_si_intf.c
1127
atomic_set(&smi_info->req_events, 1);
drivers/char/ipmi/ipmi_si_intf.c
1132
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1138
atomic_set(&smi_info->need_watch, enable);
drivers/char/ipmi/ipmi_si_intf.c
1139
spin_lock_irqsave(&smi_info->si_lock, flags);
drivers/char/ipmi/ipmi_si_intf.c
1140
check_start_timer_thread(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1141
spin_unlock_irqrestore(&smi_info->si_lock, flags);
drivers/char/ipmi/ipmi_si_intf.c
1146
struct smi_info *smi_info = timer_container_of(smi_info, t,
drivers/char/ipmi/ipmi_si_intf.c
1154
spin_lock_irqsave(&(smi_info->si_lock), flags);
drivers/char/ipmi/ipmi_si_intf.c
1155
debug_timestamp(smi_info, "Timer");
drivers/char/ipmi/ipmi_si_intf.c
1157
if (smi_info->si_state == SI_HOSED)
drivers/char/ipmi/ipmi_si_intf.c
1159
start_get_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1162
time_diff = (((long)jiffies_now - (long)smi_info->last_timeout_jiffies)
drivers/char/ipmi/ipmi_si_intf.c
1164
smi_result = smi_event_handler(smi_info, time_diff);
drivers/char/ipmi/ipmi_si_intf.c
1166
if (smi_info->si_state == SI_HOSED) {
drivers/char/ipmi/ipmi_si_intf.c
1168
} else if ((smi_info->io.irq) && (!smi_info->interrupt_disabled)) {
drivers/char/ipmi/ipmi_si_intf.c
1171
smi_inc_stat(smi_info, long_timeouts);
drivers/char/ipmi/ipmi_si_intf.c
1177
smi_inc_stat(smi_info, short_timeouts);
drivers/char/ipmi/ipmi_si_intf.c
1180
smi_inc_stat(smi_info, long_timeouts);
drivers/char/ipmi/ipmi_si_intf.c
1185
smi_mod_timer(smi_info, timeout);
drivers/char/ipmi/ipmi_si_intf.c
1187
smi_info->timer_running = false;
drivers/char/ipmi/ipmi_si_intf.c
1188
spin_unlock_irqrestore(&(smi_info->si_lock), flags);
drivers/char/ipmi/ipmi_si_intf.c
1193
struct smi_info *smi_info = data;
drivers/char/ipmi/ipmi_si_intf.c
1196
if (smi_info->io.si_info->type == SI_BT)
drivers/char/ipmi/ipmi_si_intf.c
1198
smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG,
drivers/char/ipmi/ipmi_si_intf.c
1202
spin_lock_irqsave(&(smi_info->si_lock), flags);
drivers/char/ipmi/ipmi_si_intf.c
1204
smi_inc_stat(smi_info, interrupts);
drivers/char/ipmi/ipmi_si_intf.c
1206
debug_timestamp(smi_info, "Interrupt");
drivers/char/ipmi/ipmi_si_intf.c
1208
smi_event_handler(smi_info, 0);
drivers/char/ipmi/ipmi_si_intf.c
1209
spin_unlock_irqrestore(&(smi_info->si_lock), flags);
drivers/char/ipmi/ipmi_si_intf.c
1216
struct smi_info *new_smi = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1260
struct smi_info *smi = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1272
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1275
atomic_set(&smi_info->req_events, 0);
drivers/char/ipmi/ipmi_si_intf.c
1276
smi_info->in_maintenance_mode = enable;
drivers/char/ipmi/ipmi_si_intf.c
1356
static int wait_for_msg_done(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1360
smi_result = smi_info->handlers->event(smi_info->si_sm, 0);
drivers/char/ipmi/ipmi_si_intf.c
1365
smi_result = smi_info->handlers->event(
drivers/char/ipmi/ipmi_si_intf.c
1366
smi_info->si_sm, jiffies_to_usecs(1));
drivers/char/ipmi/ipmi_si_intf.c
1368
smi_result = smi_info->handlers->event(
drivers/char/ipmi/ipmi_si_intf.c
1369
smi_info->si_sm, 0);
drivers/char/ipmi/ipmi_si_intf.c
1383
static int try_get_dev_id(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1403
smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2);
drivers/char/ipmi/ipmi_si_intf.c
1405
rv = wait_for_msg_done(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1409
resp_len = smi_info->handlers->get_result(smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
1414
resp + 2, resp_len - 2, &smi_info->device_id);
drivers/char/ipmi/ipmi_si_intf.c
1421
dev_warn_ratelimited(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1433
static int get_global_enables(struct smi_info *smi_info, u8 *enables)
drivers/char/ipmi/ipmi_si_intf.c
1446
smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2);
drivers/char/ipmi/ipmi_si_intf.c
1448
rv = wait_for_msg_done(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1450
dev_warn(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1456
resp_len = smi_info->handlers->get_result(smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
1463
dev_warn(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1480
static int set_global_enables(struct smi_info *smi_info, u8 enables)
drivers/char/ipmi/ipmi_si_intf.c
1494
smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3);
drivers/char/ipmi/ipmi_si_intf.c
1496
rv = wait_for_msg_done(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1498
dev_warn(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1504
resp_len = smi_info->handlers->get_result(smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
1510
dev_warn(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
153
int (*oem_data_avail_handler)(struct smi_info *smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1530
static void check_clr_rcv_irq(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1535
rv = get_global_enables(smi_info, &enables);
drivers/char/ipmi/ipmi_si_intf.c
1542
rv = set_global_enables(smi_info, enables);
drivers/char/ipmi/ipmi_si_intf.c
1546
dev_err(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1556
dev_warn(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1558
smi_info->cannot_disable_irq = true;
drivers/char/ipmi/ipmi_si_intf.c
1567
static void check_set_rcv_irq(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1572
if (!smi_info->io.irq)
drivers/char/ipmi/ipmi_si_intf.c
1575
rv = get_global_enables(smi_info, &enables);
drivers/char/ipmi/ipmi_si_intf.c
1578
rv = set_global_enables(smi_info, enables);
drivers/char/ipmi/ipmi_si_intf.c
1582
dev_err(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1592
dev_warn(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1594
smi_info->cannot_disable_irq = true;
drivers/char/ipmi/ipmi_si_intf.c
1595
smi_info->irq_enable_broken = true;
drivers/char/ipmi/ipmi_si_intf.c
1599
static int try_enable_event_buffer(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1612
smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2);
drivers/char/ipmi/ipmi_si_intf.c
1614
rv = wait_for_msg_done(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1620
resp_len = smi_info->handlers->get_result(smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
1634
smi_info->supports_event_msg_buff = true;
drivers/char/ipmi/ipmi_si_intf.c
1641
smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3);
drivers/char/ipmi/ipmi_si_intf.c
1643
rv = wait_for_msg_done(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1649
resp_len = smi_info->handlers->get_result(smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
1667
smi_info->supports_event_msg_buff = true;
drivers/char/ipmi/ipmi_si_intf.c
1679
struct smi_info *smi_info = dev_get_drvdata(dev); \
drivers/char/ipmi/ipmi_si_intf.c
1681
return sysfs_emit(buf, "%u\n", smi_get_stat(smi_info, name)); \
drivers/char/ipmi/ipmi_si_intf.c
1689
struct smi_info *smi_info = dev_get_drvdata(dev);
drivers/char/ipmi/ipmi_si_intf.c
1691
return sysfs_emit(buf, "%s\n", si_to_str[smi_info->io.si_info->type]);
drivers/char/ipmi/ipmi_si_intf.c
1699
struct smi_info *smi_info = dev_get_drvdata(dev);
drivers/char/ipmi/ipmi_si_intf.c
1700
int enabled = smi_info->io.irq && !smi_info->interrupt_disabled;
drivers/char/ipmi/ipmi_si_intf.c
1722
struct smi_info *smi_info = dev_get_drvdata(dev);
drivers/char/ipmi/ipmi_si_intf.c
1726
si_to_str[smi_info->io.si_info->type],
drivers/char/ipmi/ipmi_si_intf.c
1727
addr_space_to_str[smi_info->io.addr_space],
drivers/char/ipmi/ipmi_si_intf.c
1728
smi_info->io.addr_data,
drivers/char/ipmi/ipmi_si_intf.c
1729
smi_info->io.regspacing,
drivers/char/ipmi/ipmi_si_intf.c
1730
smi_info->io.regsize,
drivers/char/ipmi/ipmi_si_intf.c
1731
smi_info->io.regshift,
drivers/char/ipmi/ipmi_si_intf.c
1732
smi_info->io.irq,
drivers/char/ipmi/ipmi_si_intf.c
1733
smi_info->io.slave_addr);
drivers/char/ipmi/ipmi_si_intf.c
1766
static int oem_data_avail_to_receive_msg_avail(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1768
smi_info->msg_flags = ((smi_info->msg_flags & ~OEM_DATA_AVAIL) |
drivers/char/ipmi/ipmi_si_intf.c
1802
static void setup_dell_poweredge_oem_data_handler(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1804
struct ipmi_device_id *id = &smi_info->device_id;
drivers/char/ipmi/ipmi_si_intf.c
1809
smi_info->oem_data_avail_handler =
drivers/char/ipmi/ipmi_si_intf.c
1814
smi_info->oem_data_avail_handler =
drivers/char/ipmi/ipmi_si_intf.c
1821
static void return_hosed_msg_badsize(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1823
struct ipmi_smi_msg *msg = smi_info->curr_msg;
drivers/char/ipmi/ipmi_si_intf.c
1830
smi_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
1831
deliver_recv_msg(smi_info, msg);
drivers/char/ipmi/ipmi_si_intf.c
1851
struct smi_info *smi_info = in;
drivers/char/ipmi/ipmi_si_intf.c
1852
unsigned char *data = smi_info->curr_msg->data;
drivers/char/ipmi/ipmi_si_intf.c
1853
unsigned int size = smi_info->curr_msg->data_size;
drivers/char/ipmi/ipmi_si_intf.c
1858
return_hosed_msg_badsize(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1876
setup_dell_poweredge_bt_xaction_handler(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1878
struct ipmi_device_id *id = &smi_info->device_id;
drivers/char/ipmi/ipmi_si_intf.c
1880
smi_info->io.si_info->type == SI_BT)
drivers/char/ipmi/ipmi_si_intf.c
1892
static void setup_oem_data_handler(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1894
setup_dell_poweredge_oem_data_handler(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1897
static void setup_xaction_handlers(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1899
setup_dell_poweredge_bt_xaction_handler(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1902
static void check_for_broken_irqs(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1904
check_clr_rcv_irq(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1905
check_set_rcv_irq(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1908
static inline void stop_timer_and_thread(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1910
if (smi_info->thread != NULL) {
drivers/char/ipmi/ipmi_si_intf.c
1911
kthread_stop(smi_info->thread);
drivers/char/ipmi/ipmi_si_intf.c
1912
smi_info->thread = NULL;
drivers/char/ipmi/ipmi_si_intf.c
1915
smi_info->timer_can_start = false;
drivers/char/ipmi/ipmi_si_intf.c
1916
timer_delete_sync(&smi_info->si_timer);
drivers/char/ipmi/ipmi_si_intf.c
1919
static struct smi_info *find_dup_si(struct smi_info *info)
drivers/char/ipmi/ipmi_si_intf.c
1921
struct smi_info *e;
drivers/char/ipmi/ipmi_si_intf.c
1944
struct smi_info *new_smi, *dup;
drivers/char/ipmi/ipmi_si_intf.c
2015
static int try_smi_init(struct smi_info *new_smi)
drivers/char/ipmi/ipmi_si_intf.c
2171
static bool __init ipmi_smi_info_same(struct smi_info *e1, struct smi_info *e2)
drivers/char/ipmi/ipmi_si_intf.c
2179
struct smi_info *e, *e2;
drivers/char/ipmi/ipmi_si_intf.c
2276
static void wait_msg_processed(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
2281
while (smi_info->si_state != SI_HOSED &&
drivers/char/ipmi/ipmi_si_intf.c
2282
(smi_info->curr_msg || (smi_info->si_state != SI_NORMAL))) {
drivers/char/ipmi/ipmi_si_intf.c
2284
time_diff = (((long)jiffies_now - (long)smi_info->last_timeout_jiffies)
drivers/char/ipmi/ipmi_si_intf.c
2286
smi_event_handler(smi_info, time_diff);
drivers/char/ipmi/ipmi_si_intf.c
2293
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
2295
if (smi_info->dev_group_added) {
drivers/char/ipmi/ipmi_si_intf.c
2296
device_remove_group(smi_info->io.dev, &ipmi_si_dev_attr_group);
drivers/char/ipmi/ipmi_si_intf.c
2297
smi_info->dev_group_added = false;
drivers/char/ipmi/ipmi_si_intf.c
2299
if (smi_info->io.dev)
drivers/char/ipmi/ipmi_si_intf.c
2300
dev_set_drvdata(smi_info->io.dev, NULL);
drivers/char/ipmi/ipmi_si_intf.c
2306
smi_info->interrupt_disabled = true;
drivers/char/ipmi/ipmi_si_intf.c
2307
if (smi_info->io.irq_cleanup) {
drivers/char/ipmi/ipmi_si_intf.c
2308
smi_info->io.irq_cleanup(&smi_info->io);
drivers/char/ipmi/ipmi_si_intf.c
2309
smi_info->io.irq_cleanup = NULL;
drivers/char/ipmi/ipmi_si_intf.c
2311
stop_timer_and_thread(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
2325
wait_msg_processed(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
2327
if (smi_info->handlers)
drivers/char/ipmi/ipmi_si_intf.c
2328
disable_si_irq(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
2330
wait_msg_processed(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
2332
if (smi_info->handlers)
drivers/char/ipmi/ipmi_si_intf.c
2333
smi_info->handlers->cleanup(smi_info->si_sm);
drivers/char/ipmi/ipmi_si_intf.c
2335
if (smi_info->io.io_cleanup) {
drivers/char/ipmi/ipmi_si_intf.c
2336
smi_info->io.io_cleanup(&smi_info->io);
drivers/char/ipmi/ipmi_si_intf.c
2337
smi_info->io.io_cleanup = NULL;
drivers/char/ipmi/ipmi_si_intf.c
2340
kfree(smi_info->si_sm);
drivers/char/ipmi/ipmi_si_intf.c
2341
smi_info->si_sm = NULL;
drivers/char/ipmi/ipmi_si_intf.c
2343
smi_info->intf = NULL;
drivers/char/ipmi/ipmi_si_intf.c
2350
static void cleanup_one_si(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
2352
if (!smi_info)
drivers/char/ipmi/ipmi_si_intf.c
2355
list_del(&smi_info->link);
drivers/char/ipmi/ipmi_si_intf.c
2356
ipmi_unregister_smi(smi_info->intf);
drivers/char/ipmi/ipmi_si_intf.c
2357
kfree(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
2362
struct smi_info *e;
drivers/char/ipmi/ipmi_si_intf.c
2378
struct smi_info *e, *tmp_e;
drivers/char/ipmi/ipmi_si_intf.c
2399
struct smi_info *e, *tmp_e;
drivers/char/ipmi/ipmi_si_intf.c
272
static int try_smi_init(struct smi_info *smi);
drivers/char/ipmi/ipmi_si_intf.c
273
static void cleanup_one_si(struct smi_info *smi_info);
drivers/char/ipmi/ipmi_si_intf.c
277
void debug_timestamp(struct smi_info *smi_info, char *msg)
drivers/char/ipmi/ipmi_si_intf.c
282
dev_dbg(smi_info->io.dev, "**%s: %ptSp\n", msg, &t);
drivers/char/ipmi/ipmi_si_intf.c
285
#define debug_timestamp(smi_info, x)
drivers/char/ipmi/ipmi_si_intf.c
294
static void deliver_recv_msg(struct smi_info *smi_info,
drivers/char/ipmi/ipmi_si_intf.c
298
ipmi_smi_msg_received(smi_info->intf, msg);
drivers/char/ipmi/ipmi_si_intf.c
301
static void return_hosed_msg(struct smi_info *smi_info, int cCode)
drivers/char/ipmi/ipmi_si_intf.c
303
struct ipmi_smi_msg *msg = smi_info->curr_msg;
drivers/char/ipmi/ipmi_si_intf.c
315
smi_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
316
deliver_recv_msg(smi_info, msg);
drivers/char/ipmi/ipmi_si_intf.c
319
static enum si_sm_result start_next_msg(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
323
if (!smi_info->waiting_msg) {
drivers/char/ipmi/ipmi_si_intf.c
324
smi_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
329
smi_info->curr_msg = smi_info->waiting_msg;
drivers/char/ipmi/ipmi_si_intf.c
330
smi_info->waiting_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
331
debug_timestamp(smi_info, "Start2");
drivers/char/ipmi/ipmi_si_intf.c
333
0, smi_info);
drivers/char/ipmi/ipmi_si_intf.c
338
err = smi_info->handlers->start_transaction(
drivers/char/ipmi/ipmi_si_intf.c
339
smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
340
smi_info->curr_msg->data,
drivers/char/ipmi/ipmi_si_intf.c
341
smi_info->curr_msg->data_size);
drivers/char/ipmi/ipmi_si_intf.c
343
return_hosed_msg(smi_info, err);
drivers/char/ipmi/ipmi_si_intf.c
351
static void smi_mod_timer(struct smi_info *smi_info, unsigned long new_val)
drivers/char/ipmi/ipmi_si_intf.c
353
if (!smi_info->timer_can_start)
drivers/char/ipmi/ipmi_si_intf.c
355
smi_info->last_timeout_jiffies = jiffies;
drivers/char/ipmi/ipmi_si_intf.c
356
mod_timer(&smi_info->si_timer, new_val);
drivers/char/ipmi/ipmi_si_intf.c
357
smi_info->timer_running = true;
drivers/char/ipmi/ipmi_si_intf.c
363
static void start_new_msg(struct smi_info *smi_info, unsigned char *msg,
drivers/char/ipmi/ipmi_si_intf.c
366
smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES);
drivers/char/ipmi/ipmi_si_intf.c
368
if (smi_info->thread)
drivers/char/ipmi/ipmi_si_intf.c
369
wake_up_process(smi_info->thread);
drivers/char/ipmi/ipmi_si_intf.c
371
smi_info->handlers->start_transaction(smi_info->si_sm, msg, size);
drivers/char/ipmi/ipmi_si_intf.c
374
static void start_check_enables(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
381
start_new_msg(smi_info, msg, 2);
drivers/char/ipmi/ipmi_si_intf.c
382
smi_info->si_state = SI_CHECKING_ENABLES;
drivers/char/ipmi/ipmi_si_intf.c
385
static void start_clear_flags(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
394
start_new_msg(smi_info, msg, 3);
drivers/char/ipmi/ipmi_si_intf.c
395
smi_info->si_state = SI_CLEARING_FLAGS;
drivers/char/ipmi/ipmi_si_intf.c
398
static void start_get_flags(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
405
start_new_msg(smi_info, msg, 2);
drivers/char/ipmi/ipmi_si_intf.c
406
smi_info->si_state = SI_GETTING_FLAGS;
drivers/char/ipmi/ipmi_si_intf.c
409
static void start_getting_msg_queue(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
411
smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
drivers/char/ipmi/ipmi_si_intf.c
412
smi_info->curr_msg->data[1] = IPMI_GET_MSG_CMD;
drivers/char/ipmi/ipmi_si_intf.c
413
smi_info->curr_msg->data_size = 2;
drivers/char/ipmi/ipmi_si_intf.c
415
start_new_msg(smi_info, smi_info->curr_msg->data,
drivers/char/ipmi/ipmi_si_intf.c
416
smi_info->curr_msg->data_size);
drivers/char/ipmi/ipmi_si_intf.c
417
if (smi_info->si_state != SI_GETTING_MESSAGES) {
drivers/char/ipmi/ipmi_si_intf.c
418
smi_info->num_requests_in_a_row = 0;
drivers/char/ipmi/ipmi_si_intf.c
419
smi_info->si_state = SI_GETTING_MESSAGES;
drivers/char/ipmi/ipmi_si_intf.c
423
static void start_getting_events(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
425
smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
drivers/char/ipmi/ipmi_si_intf.c
426
smi_info->curr_msg->data[1] = IPMI_READ_EVENT_MSG_BUFFER_CMD;
drivers/char/ipmi/ipmi_si_intf.c
427
smi_info->curr_msg->data_size = 2;
drivers/char/ipmi/ipmi_si_intf.c
429
start_new_msg(smi_info, smi_info->curr_msg->data,
drivers/char/ipmi/ipmi_si_intf.c
430
smi_info->curr_msg->data_size);
drivers/char/ipmi/ipmi_si_intf.c
431
if (smi_info->si_state != SI_GETTING_EVENTS) {
drivers/char/ipmi/ipmi_si_intf.c
432
smi_info->num_requests_in_a_row = 0;
drivers/char/ipmi/ipmi_si_intf.c
433
smi_info->si_state = SI_GETTING_EVENTS;
drivers/char/ipmi/ipmi_si_intf.c
446
static inline bool disable_si_irq(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
448
if ((smi_info->io.irq) && (!smi_info->interrupt_disabled)) {
drivers/char/ipmi/ipmi_si_intf.c
449
smi_info->interrupt_disabled = true;
drivers/char/ipmi/ipmi_si_intf.c
450
start_check_enables(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
456
static inline bool enable_si_irq(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
458
if ((smi_info->io.irq) && (smi_info->interrupt_disabled)) {
drivers/char/ipmi/ipmi_si_intf.c
459
smi_info->interrupt_disabled = false;
drivers/char/ipmi/ipmi_si_intf.c
460
start_check_enables(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
472
static struct ipmi_smi_msg *alloc_msg_handle_irq(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
478
if (!disable_si_irq(smi_info))
drivers/char/ipmi/ipmi_si_intf.c
479
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
480
} else if (enable_si_irq(smi_info)) {
drivers/char/ipmi/ipmi_si_intf.c
487
static void handle_flags(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
490
if (smi_info->msg_flags & WDT_PRE_TIMEOUT_INT) {
drivers/char/ipmi/ipmi_si_intf.c
492
smi_inc_stat(smi_info, watchdog_pretimeouts);
drivers/char/ipmi/ipmi_si_intf.c
494
start_clear_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
495
smi_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT;
drivers/char/ipmi/ipmi_si_intf.c
496
ipmi_smi_watchdog_pretimeout(smi_info->intf);
drivers/char/ipmi/ipmi_si_intf.c
497
} else if (smi_info->msg_flags & RECEIVE_MSG_AVAIL) {
drivers/char/ipmi/ipmi_si_intf.c
499
smi_info->curr_msg = alloc_msg_handle_irq(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
500
if (!smi_info->curr_msg) {
drivers/char/ipmi/ipmi_si_intf.c
501
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
505
start_getting_msg_queue(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
506
} else if (smi_info->msg_flags & EVENT_MSG_BUFFER_FULL) {
drivers/char/ipmi/ipmi_si_intf.c
508
smi_info->curr_msg = alloc_msg_handle_irq(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
509
if (!smi_info->curr_msg) {
drivers/char/ipmi/ipmi_si_intf.c
510
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
514
start_getting_events(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
515
} else if (smi_info->msg_flags & OEM_DATA_AVAIL &&
drivers/char/ipmi/ipmi_si_intf.c
516
smi_info->oem_data_avail_handler) {
drivers/char/ipmi/ipmi_si_intf.c
517
if (smi_info->oem_data_avail_handler(smi_info))
drivers/char/ipmi/ipmi_si_intf.c
520
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
529
static u8 current_global_enables(struct smi_info *smi_info, u8 base,
drivers/char/ipmi/ipmi_si_intf.c
534
if (smi_info->supports_event_msg_buff)
drivers/char/ipmi/ipmi_si_intf.c
537
if (((smi_info->io.irq && !smi_info->interrupt_disabled) ||
drivers/char/ipmi/ipmi_si_intf.c
538
smi_info->cannot_disable_irq) &&
drivers/char/ipmi/ipmi_si_intf.c
539
!smi_info->irq_enable_broken)
drivers/char/ipmi/ipmi_si_intf.c
542
if (smi_info->supports_event_msg_buff &&
drivers/char/ipmi/ipmi_si_intf.c
543
smi_info->io.irq && !smi_info->interrupt_disabled &&
drivers/char/ipmi/ipmi_si_intf.c
544
!smi_info->irq_enable_broken)
drivers/char/ipmi/ipmi_si_intf.c
552
static void check_bt_irq(struct smi_info *smi_info, bool irq_on)
drivers/char/ipmi/ipmi_si_intf.c
554
u8 irqstate = smi_info->io.inputb(&smi_info->io, IPMI_BT_INTMASK_REG);
drivers/char/ipmi/ipmi_si_intf.c
562
smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG,
drivers/char/ipmi/ipmi_si_intf.c
565
smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG, 0);
drivers/char/ipmi/ipmi_si_intf.c
568
static void handle_transaction_done(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
572
debug_timestamp(smi_info, "Done");
drivers/char/ipmi/ipmi_si_intf.c
573
switch (smi_info->si_state) {
drivers/char/ipmi/ipmi_si_intf.c
575
if (!smi_info->curr_msg)
drivers/char/ipmi/ipmi_si_intf.c
578
smi_info->curr_msg->rsp_size
drivers/char/ipmi/ipmi_si_intf.c
579
= smi_info->handlers->get_result(
drivers/char/ipmi/ipmi_si_intf.c
580
smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
581
smi_info->curr_msg->rsp,
drivers/char/ipmi/ipmi_si_intf.c
589
msg = smi_info->curr_msg;
drivers/char/ipmi/ipmi_si_intf.c
590
smi_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
591
deliver_recv_msg(smi_info, msg);
drivers/char/ipmi/ipmi_si_intf.c
600
len = smi_info->handlers->get_result(smi_info->si_sm, msg, 4);
drivers/char/ipmi/ipmi_si_intf.c
603
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
609
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
611
smi_info->msg_flags = msg[3];
drivers/char/ipmi/ipmi_si_intf.c
612
smi_info->last_was_flag_fetch = true;
drivers/char/ipmi/ipmi_si_intf.c
613
handle_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
623
smi_info->handlers->get_result(smi_info->si_sm, msg, 3);
drivers/char/ipmi/ipmi_si_intf.c
626
dev_warn_ratelimited(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
629
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
635
smi_info->curr_msg->rsp_size
drivers/char/ipmi/ipmi_si_intf.c
636
= smi_info->handlers->get_result(
drivers/char/ipmi/ipmi_si_intf.c
637
smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
638
smi_info->curr_msg->rsp,
drivers/char/ipmi/ipmi_si_intf.c
646
msg = smi_info->curr_msg;
drivers/char/ipmi/ipmi_si_intf.c
647
smi_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
659
smi_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL;
drivers/char/ipmi/ipmi_si_intf.c
660
handle_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
662
smi_inc_stat(smi_info, events);
drivers/char/ipmi/ipmi_si_intf.c
664
smi_info->num_requests_in_a_row++;
drivers/char/ipmi/ipmi_si_intf.c
665
if (smi_info->num_requests_in_a_row > 10)
drivers/char/ipmi/ipmi_si_intf.c
667
smi_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL;
drivers/char/ipmi/ipmi_si_intf.c
675
handle_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
677
deliver_recv_msg(smi_info, msg);
drivers/char/ipmi/ipmi_si_intf.c
684
smi_info->curr_msg->rsp_size
drivers/char/ipmi/ipmi_si_intf.c
685
= smi_info->handlers->get_result(
drivers/char/ipmi/ipmi_si_intf.c
686
smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
687
smi_info->curr_msg->rsp,
drivers/char/ipmi/ipmi_si_intf.c
695
msg = smi_info->curr_msg;
drivers/char/ipmi/ipmi_si_intf.c
696
smi_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
702
smi_info->msg_flags &= ~RECEIVE_MSG_AVAIL;
drivers/char/ipmi/ipmi_si_intf.c
703
handle_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
705
smi_inc_stat(smi_info, incoming_messages);
drivers/char/ipmi/ipmi_si_intf.c
707
smi_info->num_requests_in_a_row++;
drivers/char/ipmi/ipmi_si_intf.c
708
if (smi_info->num_requests_in_a_row > 10)
drivers/char/ipmi/ipmi_si_intf.c
710
smi_info->msg_flags &= ~RECEIVE_MSG_AVAIL;
drivers/char/ipmi/ipmi_si_intf.c
718
handle_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
720
deliver_recv_msg(smi_info, msg);
drivers/char/ipmi/ipmi_si_intf.c
732
smi_info->handlers->get_result(smi_info->si_sm, msg, 4);
drivers/char/ipmi/ipmi_si_intf.c
734
dev_warn_ratelimited(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
738
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
741
enables = current_global_enables(smi_info, 0, &irq_on);
drivers/char/ipmi/ipmi_si_intf.c
742
if (smi_info->io.si_info->type == SI_BT)
drivers/char/ipmi/ipmi_si_intf.c
744
check_bt_irq(smi_info, irq_on);
drivers/char/ipmi/ipmi_si_intf.c
750
smi_info->handlers->start_transaction(
drivers/char/ipmi/ipmi_si_intf.c
751
smi_info->si_sm, msg, 3);
drivers/char/ipmi/ipmi_si_intf.c
752
smi_info->si_state = SI_SETTING_ENABLES;
drivers/char/ipmi/ipmi_si_intf.c
753
} else if (smi_info->supports_event_msg_buff) {
drivers/char/ipmi/ipmi_si_intf.c
754
smi_info->curr_msg = ipmi_alloc_smi_msg();
drivers/char/ipmi/ipmi_si_intf.c
755
if (!smi_info->curr_msg) {
drivers/char/ipmi/ipmi_si_intf.c
756
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
759
start_getting_events(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
761
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
770
smi_info->handlers->get_result(smi_info->si_sm, msg, 4);
drivers/char/ipmi/ipmi_si_intf.c
772
dev_warn_ratelimited(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
776
if (smi_info->supports_event_msg_buff) {
drivers/char/ipmi/ipmi_si_intf.c
777
smi_info->curr_msg = ipmi_alloc_smi_msg();
drivers/char/ipmi/ipmi_si_intf.c
778
if (!smi_info->curr_msg) {
drivers/char/ipmi/ipmi_si_intf.c
779
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
782
start_getting_events(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
784
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
798
static enum si_sm_result smi_event_handler(struct smi_info *smi_info,
drivers/char/ipmi/ipmi_si_intf.c
804
if (smi_info->si_state == SI_HOSED)
drivers/char/ipmi/ipmi_si_intf.c
816
si_sm_result = smi_info->handlers->event(smi_info->si_sm, time);
drivers/char/ipmi/ipmi_si_intf.c
819
si_sm_result = smi_info->handlers->event(smi_info->si_sm, 0);
drivers/char/ipmi/ipmi_si_intf.c
822
smi_inc_stat(smi_info, complete_transactions);
drivers/char/ipmi/ipmi_si_intf.c
824
handle_transaction_done(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
827
smi_inc_stat(smi_info, hosed_count);
drivers/char/ipmi/ipmi_si_intf.c
834
smi_info->si_state = SI_HOSED;
drivers/char/ipmi/ipmi_si_intf.c
835
if (smi_info->curr_msg != NULL) {
drivers/char/ipmi/ipmi_si_intf.c
841
return_hosed_msg(smi_info, IPMI_BUS_ERR);
drivers/char/ipmi/ipmi_si_intf.c
843
if (smi_info->waiting_msg != NULL) {
drivers/char/ipmi/ipmi_si_intf.c
845
smi_info->curr_msg = smi_info->waiting_msg;
drivers/char/ipmi/ipmi_si_intf.c
846
smi_info->waiting_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
847
return_hosed_msg(smi_info, IPMI_BUS_ERR);
drivers/char/ipmi/ipmi_si_intf.c
849
smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_HOSED);
drivers/char/ipmi/ipmi_si_intf.c
863
(si_sm_result == SI_SM_ATTN && smi_info->waiting_msg &&
drivers/char/ipmi/ipmi_si_intf.c
864
smi_info->last_was_flag_fetch)) {
drivers/char/ipmi/ipmi_si_intf.c
865
smi_info->last_was_flag_fetch = false;
drivers/char/ipmi/ipmi_si_intf.c
866
smi_inc_stat(smi_info, idles);
drivers/char/ipmi/ipmi_si_intf.c
868
si_sm_result = start_next_msg(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
877
if (si_sm_result == SI_SM_ATTN || smi_info->got_attn) {
drivers/char/ipmi/ipmi_si_intf.c
878
if (smi_info->si_state != SI_NORMAL) {
drivers/char/ipmi/ipmi_si_intf.c
883
smi_info->got_attn = true;
drivers/char/ipmi/ipmi_si_intf.c
885
smi_info->got_attn = false;
drivers/char/ipmi/ipmi_si_intf.c
886
smi_inc_stat(smi_info, attentions);
drivers/char/ipmi/ipmi_si_intf.c
895
start_get_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
901
&& (atomic_read(&smi_info->req_events))) {
drivers/char/ipmi/ipmi_si_intf.c
906
atomic_set(&smi_info->req_events, 0);
drivers/char/ipmi/ipmi_si_intf.c
914
if (smi_info->supports_event_msg_buff || smi_info->io.irq) {
drivers/char/ipmi/ipmi_si_intf.c
915
start_check_enables(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
917
smi_info->curr_msg = alloc_msg_handle_irq(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
918
if (!smi_info->curr_msg)
drivers/char/ipmi/ipmi_si_intf.c
921
start_getting_events(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
926
if (si_sm_result == SI_SM_IDLE && smi_info->timer_running) {
drivers/char/ipmi/ipmi_si_intf.c
928
if (timer_delete(&smi_info->si_timer))
drivers/char/ipmi/ipmi_si_intf.c
929
smi_info->timer_running = false;
drivers/char/ipmi/ipmi_si_intf.c
936
static void check_start_timer_thread(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
938
if (smi_info->si_state == SI_NORMAL && smi_info->curr_msg == NULL) {
drivers/char/ipmi/ipmi_si_intf.c
939
smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES);
drivers/char/ipmi/ipmi_si_intf.c
941
if (smi_info->thread)
drivers/char/ipmi/ipmi_si_intf.c
942
wake_up_process(smi_info->thread);
drivers/char/ipmi/ipmi_si_intf.c
944
start_next_msg(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
945
smi_event_handler(smi_info, 0);
drivers/char/ipmi/ipmi_si_intf.c
951
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
958
result = smi_event_handler(smi_info, 0);
drivers/char/ipmi/ipmi_si_intf.c
961
result = smi_event_handler(smi_info, SI_SHORT_TIMEOUT_USEC);
drivers/char/ipmi/ipmi_si_intf.c
967
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
971
debug_timestamp(smi_info, "Enqueue");
drivers/char/ipmi/ipmi_si_intf.c
977
if (smi_info->si_state == SI_HOSED)
drivers/char/ipmi/ipmi_si_intf.c
980
if (smi_info->run_to_completion) {
drivers/char/ipmi/ipmi_si_intf.c
985
smi_info->waiting_msg = msg;
drivers/char/ipmi/ipmi_si_intf.c
989
spin_lock_irqsave(&smi_info->si_lock, flags);
drivers/char/ipmi/ipmi_si_intf.c
990
if (smi_info->si_state == SI_HOSED) {
drivers/char/ipmi/ipmi_si_intf.c
993
BUG_ON(smi_info->waiting_msg);
drivers/char/ipmi/ipmi_si_intf.c
994
smi_info->waiting_msg = msg;
drivers/char/ipmi/ipmi_si_intf.c
995
check_start_timer_thread(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
997
spin_unlock_irqrestore(&smi_info->si_lock, flags);