Symbol: smi_info
drivers/char/ipmi/ipmi_si_intf.c
1006
struct smi_info *smi_info = data;
drivers/char/ipmi/ipmi_si_intf.c
1015
spin_lock_irqsave(&(smi_info->si_lock), flags);
drivers/char/ipmi/ipmi_si_intf.c
1016
smi_result = smi_event_handler(smi_info, 0);
drivers/char/ipmi/ipmi_si_intf.c
1025
if (smi_result != SI_SM_IDLE && !smi_info->timer_running)
drivers/char/ipmi/ipmi_si_intf.c
1026
smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES);
drivers/char/ipmi/ipmi_si_intf.c
1028
spin_unlock_irqrestore(&(smi_info->si_lock), flags);
drivers/char/ipmi/ipmi_si_intf.c
1029
busy_wait = ipmi_thread_busy_wait(smi_result, smi_info,
drivers/char/ipmi/ipmi_si_intf.c
1040
if (smi_info->in_maintenance_mode)
drivers/char/ipmi/ipmi_si_intf.c
1045
if (atomic_read(&smi_info->need_watch)) {
drivers/char/ipmi/ipmi_si_intf.c
1062
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1064
bool run_to_completion = smi_info->run_to_completion;
drivers/char/ipmi/ipmi_si_intf.c
1072
spin_lock_irqsave(&smi_info->si_lock, flags);
drivers/char/ipmi/ipmi_si_intf.c
1073
smi_event_handler(smi_info, 10);
drivers/char/ipmi/ipmi_si_intf.c
1075
spin_unlock_irqrestore(&smi_info->si_lock, flags);
drivers/char/ipmi/ipmi_si_intf.c
1080
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1082
if (!smi_info->has_event_buffer)
drivers/char/ipmi/ipmi_si_intf.c
1085
atomic_set(&smi_info->req_events, 1);
drivers/char/ipmi/ipmi_si_intf.c
1090
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1096
atomic_set(&smi_info->need_watch, enable);
drivers/char/ipmi/ipmi_si_intf.c
1097
spin_lock_irqsave(&smi_info->si_lock, flags);
drivers/char/ipmi/ipmi_si_intf.c
1098
check_start_timer_thread(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1099
spin_unlock_irqrestore(&smi_info->si_lock, flags);
drivers/char/ipmi/ipmi_si_intf.c
1104
struct smi_info *smi_info = timer_container_of(smi_info, t,
drivers/char/ipmi/ipmi_si_intf.c
1112
spin_lock_irqsave(&(smi_info->si_lock), flags);
drivers/char/ipmi/ipmi_si_intf.c
1113
debug_timestamp(smi_info, "Timer");
drivers/char/ipmi/ipmi_si_intf.c
1115
if (smi_info->si_state == SI_HOSED)
drivers/char/ipmi/ipmi_si_intf.c
1117
start_get_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1120
time_diff = (((long)jiffies_now - (long)smi_info->last_timeout_jiffies)
drivers/char/ipmi/ipmi_si_intf.c
1122
smi_result = smi_event_handler(smi_info, time_diff);
drivers/char/ipmi/ipmi_si_intf.c
1124
if (smi_info->si_state == SI_HOSED) {
drivers/char/ipmi/ipmi_si_intf.c
1126
} else if ((smi_info->io.irq) && (!smi_info->interrupt_disabled)) {
drivers/char/ipmi/ipmi_si_intf.c
1129
smi_inc_stat(smi_info, long_timeouts);
drivers/char/ipmi/ipmi_si_intf.c
1135
smi_inc_stat(smi_info, short_timeouts);
drivers/char/ipmi/ipmi_si_intf.c
1138
smi_inc_stat(smi_info, long_timeouts);
drivers/char/ipmi/ipmi_si_intf.c
1143
smi_mod_timer(smi_info, timeout);
drivers/char/ipmi/ipmi_si_intf.c
1145
smi_info->timer_running = false;
drivers/char/ipmi/ipmi_si_intf.c
1146
spin_unlock_irqrestore(&(smi_info->si_lock), flags);
drivers/char/ipmi/ipmi_si_intf.c
1151
struct smi_info *smi_info = data;
drivers/char/ipmi/ipmi_si_intf.c
1154
if (smi_info->io.si_info->type == SI_BT)
drivers/char/ipmi/ipmi_si_intf.c
1156
smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG,
drivers/char/ipmi/ipmi_si_intf.c
1160
spin_lock_irqsave(&(smi_info->si_lock), flags);
drivers/char/ipmi/ipmi_si_intf.c
1162
smi_inc_stat(smi_info, interrupts);
drivers/char/ipmi/ipmi_si_intf.c
1164
debug_timestamp(smi_info, "Interrupt");
drivers/char/ipmi/ipmi_si_intf.c
1166
smi_event_handler(smi_info, 0);
drivers/char/ipmi/ipmi_si_intf.c
1167
spin_unlock_irqrestore(&(smi_info->si_lock), flags);
drivers/char/ipmi/ipmi_si_intf.c
1174
struct smi_info *new_smi = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1218
struct smi_info *smi = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1230
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
1233
atomic_set(&smi_info->req_events, 0);
drivers/char/ipmi/ipmi_si_intf.c
1234
smi_info->in_maintenance_mode = enable;
drivers/char/ipmi/ipmi_si_intf.c
1314
static int wait_for_msg_done(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1318
smi_result = smi_info->handlers->event(smi_info->si_sm, 0);
drivers/char/ipmi/ipmi_si_intf.c
1323
smi_result = smi_info->handlers->event(
drivers/char/ipmi/ipmi_si_intf.c
1324
smi_info->si_sm, jiffies_to_usecs(1));
drivers/char/ipmi/ipmi_si_intf.c
1326
smi_result = smi_info->handlers->event(
drivers/char/ipmi/ipmi_si_intf.c
1327
smi_info->si_sm, 0);
drivers/char/ipmi/ipmi_si_intf.c
1341
static int try_get_dev_id(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1361
smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2);
drivers/char/ipmi/ipmi_si_intf.c
1363
rv = wait_for_msg_done(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1367
resp_len = smi_info->handlers->get_result(smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
1372
resp + 2, resp_len - 2, &smi_info->device_id);
drivers/char/ipmi/ipmi_si_intf.c
1379
dev_warn_ratelimited(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1391
static int get_global_enables(struct smi_info *smi_info, u8 *enables)
drivers/char/ipmi/ipmi_si_intf.c
1404
smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2);
drivers/char/ipmi/ipmi_si_intf.c
1406
rv = wait_for_msg_done(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1408
dev_warn(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1414
resp_len = smi_info->handlers->get_result(smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
1421
dev_warn(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1438
static int set_global_enables(struct smi_info *smi_info, u8 enables)
drivers/char/ipmi/ipmi_si_intf.c
1452
smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3);
drivers/char/ipmi/ipmi_si_intf.c
1454
rv = wait_for_msg_done(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1456
dev_warn(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1462
resp_len = smi_info->handlers->get_result(smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
1468
dev_warn(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1488
static void check_clr_rcv_irq(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1493
rv = get_global_enables(smi_info, &enables);
drivers/char/ipmi/ipmi_si_intf.c
1500
rv = set_global_enables(smi_info, enables);
drivers/char/ipmi/ipmi_si_intf.c
1504
dev_err(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1514
dev_warn(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1516
smi_info->cannot_disable_irq = true;
drivers/char/ipmi/ipmi_si_intf.c
1525
static void check_set_rcv_irq(struct smi_info *smi_info)
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
if (!smi_info->io.irq)
drivers/char/ipmi/ipmi_si_intf.c
1533
rv = get_global_enables(smi_info, &enables);
drivers/char/ipmi/ipmi_si_intf.c
1536
rv = set_global_enables(smi_info, enables);
drivers/char/ipmi/ipmi_si_intf.c
1540
dev_err(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1550
dev_warn(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
1552
smi_info->cannot_disable_irq = true;
drivers/char/ipmi/ipmi_si_intf.c
1553
smi_info->irq_enable_broken = true;
drivers/char/ipmi/ipmi_si_intf.c
1557
static int try_enable_event_buffer(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1570
smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2);
drivers/char/ipmi/ipmi_si_intf.c
1572
rv = wait_for_msg_done(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1578
resp_len = smi_info->handlers->get_result(smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
1592
smi_info->supports_event_msg_buff = true;
drivers/char/ipmi/ipmi_si_intf.c
1599
smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3);
drivers/char/ipmi/ipmi_si_intf.c
1601
rv = wait_for_msg_done(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1607
resp_len = smi_info->handlers->get_result(smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
1625
smi_info->supports_event_msg_buff = true;
drivers/char/ipmi/ipmi_si_intf.c
1637
struct smi_info *smi_info = dev_get_drvdata(dev); \
drivers/char/ipmi/ipmi_si_intf.c
1639
return sysfs_emit(buf, "%u\n", smi_get_stat(smi_info, name)); \
drivers/char/ipmi/ipmi_si_intf.c
1647
struct smi_info *smi_info = dev_get_drvdata(dev);
drivers/char/ipmi/ipmi_si_intf.c
1649
return sysfs_emit(buf, "%s\n", si_to_str[smi_info->io.si_info->type]);
drivers/char/ipmi/ipmi_si_intf.c
1657
struct smi_info *smi_info = dev_get_drvdata(dev);
drivers/char/ipmi/ipmi_si_intf.c
1658
int enabled = smi_info->io.irq && !smi_info->interrupt_disabled;
drivers/char/ipmi/ipmi_si_intf.c
1680
struct smi_info *smi_info = dev_get_drvdata(dev);
drivers/char/ipmi/ipmi_si_intf.c
1684
si_to_str[smi_info->io.si_info->type],
drivers/char/ipmi/ipmi_si_intf.c
1685
addr_space_to_str[smi_info->io.addr_space],
drivers/char/ipmi/ipmi_si_intf.c
1686
smi_info->io.addr_data,
drivers/char/ipmi/ipmi_si_intf.c
1687
smi_info->io.regspacing,
drivers/char/ipmi/ipmi_si_intf.c
1688
smi_info->io.regsize,
drivers/char/ipmi/ipmi_si_intf.c
1689
smi_info->io.regshift,
drivers/char/ipmi/ipmi_si_intf.c
1690
smi_info->io.irq,
drivers/char/ipmi/ipmi_si_intf.c
1691
smi_info->io.slave_addr);
drivers/char/ipmi/ipmi_si_intf.c
1724
static int oem_data_avail_to_receive_msg_avail(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1726
smi_info->msg_flags = ((smi_info->msg_flags & ~OEM_DATA_AVAIL) |
drivers/char/ipmi/ipmi_si_intf.c
1760
static void setup_dell_poweredge_oem_data_handler(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1762
struct ipmi_device_id *id = &smi_info->device_id;
drivers/char/ipmi/ipmi_si_intf.c
1767
smi_info->oem_data_avail_handler =
drivers/char/ipmi/ipmi_si_intf.c
1772
smi_info->oem_data_avail_handler =
drivers/char/ipmi/ipmi_si_intf.c
1779
static void return_hosed_msg_badsize(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1781
struct ipmi_smi_msg *msg = smi_info->curr_msg;
drivers/char/ipmi/ipmi_si_intf.c
1788
smi_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
1789
deliver_recv_msg(smi_info, msg);
drivers/char/ipmi/ipmi_si_intf.c
1809
struct smi_info *smi_info = in;
drivers/char/ipmi/ipmi_si_intf.c
1810
unsigned char *data = smi_info->curr_msg->data;
drivers/char/ipmi/ipmi_si_intf.c
1811
unsigned int size = smi_info->curr_msg->data_size;
drivers/char/ipmi/ipmi_si_intf.c
1816
return_hosed_msg_badsize(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1834
setup_dell_poweredge_bt_xaction_handler(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1836
struct ipmi_device_id *id = &smi_info->device_id;
drivers/char/ipmi/ipmi_si_intf.c
1838
smi_info->io.si_info->type == SI_BT)
drivers/char/ipmi/ipmi_si_intf.c
1850
static void setup_oem_data_handler(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1852
setup_dell_poweredge_oem_data_handler(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1855
static void setup_xaction_handlers(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1857
setup_dell_poweredge_bt_xaction_handler(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1860
static void check_for_broken_irqs(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1862
check_clr_rcv_irq(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1863
check_set_rcv_irq(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
1866
static inline void stop_timer_and_thread(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
1868
if (smi_info->thread != NULL) {
drivers/char/ipmi/ipmi_si_intf.c
1869
kthread_stop(smi_info->thread);
drivers/char/ipmi/ipmi_si_intf.c
1870
smi_info->thread = NULL;
drivers/char/ipmi/ipmi_si_intf.c
1873
smi_info->timer_can_start = false;
drivers/char/ipmi/ipmi_si_intf.c
1874
timer_delete_sync(&smi_info->si_timer);
drivers/char/ipmi/ipmi_si_intf.c
1877
static struct smi_info *find_dup_si(struct smi_info *info)
drivers/char/ipmi/ipmi_si_intf.c
1879
struct smi_info *e;
drivers/char/ipmi/ipmi_si_intf.c
1902
struct smi_info *new_smi, *dup;
drivers/char/ipmi/ipmi_si_intf.c
1973
static int try_smi_init(struct smi_info *new_smi)
drivers/char/ipmi/ipmi_si_intf.c
2129
static bool __init ipmi_smi_info_same(struct smi_info *e1, struct smi_info *e2)
drivers/char/ipmi/ipmi_si_intf.c
2137
struct smi_info *e, *e2;
drivers/char/ipmi/ipmi_si_intf.c
2234
static void wait_msg_processed(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
2239
while (smi_info->si_state != SI_HOSED &&
drivers/char/ipmi/ipmi_si_intf.c
2240
(smi_info->curr_msg || (smi_info->si_state != SI_NORMAL))) {
drivers/char/ipmi/ipmi_si_intf.c
2242
time_diff = (((long)jiffies_now - (long)smi_info->last_timeout_jiffies)
drivers/char/ipmi/ipmi_si_intf.c
2244
smi_event_handler(smi_info, time_diff);
drivers/char/ipmi/ipmi_si_intf.c
2251
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
2253
if (smi_info->dev_group_added) {
drivers/char/ipmi/ipmi_si_intf.c
2254
device_remove_group(smi_info->io.dev, &ipmi_si_dev_attr_group);
drivers/char/ipmi/ipmi_si_intf.c
2255
smi_info->dev_group_added = false;
drivers/char/ipmi/ipmi_si_intf.c
2257
if (smi_info->io.dev)
drivers/char/ipmi/ipmi_si_intf.c
2258
dev_set_drvdata(smi_info->io.dev, NULL);
drivers/char/ipmi/ipmi_si_intf.c
2264
smi_info->interrupt_disabled = true;
drivers/char/ipmi/ipmi_si_intf.c
2265
if (smi_info->io.irq_cleanup) {
drivers/char/ipmi/ipmi_si_intf.c
2266
smi_info->io.irq_cleanup(&smi_info->io);
drivers/char/ipmi/ipmi_si_intf.c
2267
smi_info->io.irq_cleanup = NULL;
drivers/char/ipmi/ipmi_si_intf.c
2269
stop_timer_and_thread(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
2283
wait_msg_processed(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
2285
if (smi_info->handlers)
drivers/char/ipmi/ipmi_si_intf.c
2286
disable_si_irq(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
2288
wait_msg_processed(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
2290
if (smi_info->handlers)
drivers/char/ipmi/ipmi_si_intf.c
2291
smi_info->handlers->cleanup(smi_info->si_sm);
drivers/char/ipmi/ipmi_si_intf.c
2293
if (smi_info->io.io_cleanup) {
drivers/char/ipmi/ipmi_si_intf.c
2294
smi_info->io.io_cleanup(&smi_info->io);
drivers/char/ipmi/ipmi_si_intf.c
2295
smi_info->io.io_cleanup = NULL;
drivers/char/ipmi/ipmi_si_intf.c
2298
kfree(smi_info->si_sm);
drivers/char/ipmi/ipmi_si_intf.c
2299
smi_info->si_sm = NULL;
drivers/char/ipmi/ipmi_si_intf.c
2301
smi_info->intf = NULL;
drivers/char/ipmi/ipmi_si_intf.c
2308
static void cleanup_one_si(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
2310
if (!smi_info)
drivers/char/ipmi/ipmi_si_intf.c
2313
list_del(&smi_info->link);
drivers/char/ipmi/ipmi_si_intf.c
2314
ipmi_unregister_smi(smi_info->intf);
drivers/char/ipmi/ipmi_si_intf.c
2315
kfree(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
2320
struct smi_info *e;
drivers/char/ipmi/ipmi_si_intf.c
2336
struct smi_info *e, *tmp_e;
drivers/char/ipmi/ipmi_si_intf.c
2357
struct smi_info *e, *tmp_e;
drivers/char/ipmi/ipmi_si_intf.c
268
static int try_smi_init(struct smi_info *smi);
drivers/char/ipmi/ipmi_si_intf.c
269
static void cleanup_one_si(struct smi_info *smi_info);
drivers/char/ipmi/ipmi_si_intf.c
273
void debug_timestamp(struct smi_info *smi_info, char *msg)
drivers/char/ipmi/ipmi_si_intf.c
278
dev_dbg(smi_info->io.dev, "**%s: %ptSp\n", msg, &t);
drivers/char/ipmi/ipmi_si_intf.c
281
#define debug_timestamp(smi_info, x)
drivers/char/ipmi/ipmi_si_intf.c
290
static void deliver_recv_msg(struct smi_info *smi_info,
drivers/char/ipmi/ipmi_si_intf.c
294
ipmi_smi_msg_received(smi_info->intf, msg);
drivers/char/ipmi/ipmi_si_intf.c
297
static void return_hosed_msg(struct smi_info *smi_info, int cCode)
drivers/char/ipmi/ipmi_si_intf.c
299
struct ipmi_smi_msg *msg = smi_info->curr_msg;
drivers/char/ipmi/ipmi_si_intf.c
311
smi_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
312
deliver_recv_msg(smi_info, msg);
drivers/char/ipmi/ipmi_si_intf.c
315
static enum si_sm_result start_next_msg(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
319
if (!smi_info->waiting_msg) {
drivers/char/ipmi/ipmi_si_intf.c
320
smi_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
325
smi_info->curr_msg = smi_info->waiting_msg;
drivers/char/ipmi/ipmi_si_intf.c
326
smi_info->waiting_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
327
debug_timestamp(smi_info, "Start2");
drivers/char/ipmi/ipmi_si_intf.c
329
0, smi_info);
drivers/char/ipmi/ipmi_si_intf.c
334
err = smi_info->handlers->start_transaction(
drivers/char/ipmi/ipmi_si_intf.c
335
smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
336
smi_info->curr_msg->data,
drivers/char/ipmi/ipmi_si_intf.c
337
smi_info->curr_msg->data_size);
drivers/char/ipmi/ipmi_si_intf.c
339
return_hosed_msg(smi_info, err);
drivers/char/ipmi/ipmi_si_intf.c
347
static void smi_mod_timer(struct smi_info *smi_info, unsigned long new_val)
drivers/char/ipmi/ipmi_si_intf.c
349
if (!smi_info->timer_can_start)
drivers/char/ipmi/ipmi_si_intf.c
351
smi_info->last_timeout_jiffies = jiffies;
drivers/char/ipmi/ipmi_si_intf.c
352
mod_timer(&smi_info->si_timer, new_val);
drivers/char/ipmi/ipmi_si_intf.c
353
smi_info->timer_running = true;
drivers/char/ipmi/ipmi_si_intf.c
359
static void start_new_msg(struct smi_info *smi_info, unsigned char *msg,
drivers/char/ipmi/ipmi_si_intf.c
362
smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES);
drivers/char/ipmi/ipmi_si_intf.c
364
if (smi_info->thread)
drivers/char/ipmi/ipmi_si_intf.c
365
wake_up_process(smi_info->thread);
drivers/char/ipmi/ipmi_si_intf.c
367
smi_info->handlers->start_transaction(smi_info->si_sm, msg, size);
drivers/char/ipmi/ipmi_si_intf.c
370
static void start_check_enables(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
377
start_new_msg(smi_info, msg, 2);
drivers/char/ipmi/ipmi_si_intf.c
378
smi_info->si_state = SI_CHECKING_ENABLES;
drivers/char/ipmi/ipmi_si_intf.c
381
static void start_clear_flags(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
390
start_new_msg(smi_info, msg, 3);
drivers/char/ipmi/ipmi_si_intf.c
391
smi_info->si_state = SI_CLEARING_FLAGS;
drivers/char/ipmi/ipmi_si_intf.c
394
static void start_get_flags(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
401
start_new_msg(smi_info, msg, 2);
drivers/char/ipmi/ipmi_si_intf.c
402
smi_info->si_state = SI_GETTING_FLAGS;
drivers/char/ipmi/ipmi_si_intf.c
405
static void start_getting_msg_queue(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
407
smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
drivers/char/ipmi/ipmi_si_intf.c
408
smi_info->curr_msg->data[1] = IPMI_GET_MSG_CMD;
drivers/char/ipmi/ipmi_si_intf.c
409
smi_info->curr_msg->data_size = 2;
drivers/char/ipmi/ipmi_si_intf.c
411
start_new_msg(smi_info, smi_info->curr_msg->data,
drivers/char/ipmi/ipmi_si_intf.c
412
smi_info->curr_msg->data_size);
drivers/char/ipmi/ipmi_si_intf.c
413
smi_info->si_state = SI_GETTING_MESSAGES;
drivers/char/ipmi/ipmi_si_intf.c
416
static void start_getting_events(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
418
smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
drivers/char/ipmi/ipmi_si_intf.c
419
smi_info->curr_msg->data[1] = IPMI_READ_EVENT_MSG_BUFFER_CMD;
drivers/char/ipmi/ipmi_si_intf.c
420
smi_info->curr_msg->data_size = 2;
drivers/char/ipmi/ipmi_si_intf.c
422
start_new_msg(smi_info, smi_info->curr_msg->data,
drivers/char/ipmi/ipmi_si_intf.c
423
smi_info->curr_msg->data_size);
drivers/char/ipmi/ipmi_si_intf.c
424
smi_info->si_state = SI_GETTING_EVENTS;
drivers/char/ipmi/ipmi_si_intf.c
436
static inline bool disable_si_irq(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
438
if ((smi_info->io.irq) && (!smi_info->interrupt_disabled)) {
drivers/char/ipmi/ipmi_si_intf.c
439
smi_info->interrupt_disabled = true;
drivers/char/ipmi/ipmi_si_intf.c
440
start_check_enables(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
446
static inline bool enable_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 = false;
drivers/char/ipmi/ipmi_si_intf.c
450
start_check_enables(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
462
static struct ipmi_smi_msg *alloc_msg_handle_irq(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
468
if (!disable_si_irq(smi_info))
drivers/char/ipmi/ipmi_si_intf.c
469
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
470
} else if (enable_si_irq(smi_info)) {
drivers/char/ipmi/ipmi_si_intf.c
477
static void handle_flags(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
480
if (smi_info->msg_flags & WDT_PRE_TIMEOUT_INT) {
drivers/char/ipmi/ipmi_si_intf.c
482
smi_inc_stat(smi_info, watchdog_pretimeouts);
drivers/char/ipmi/ipmi_si_intf.c
484
start_clear_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
485
smi_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT;
drivers/char/ipmi/ipmi_si_intf.c
486
ipmi_smi_watchdog_pretimeout(smi_info->intf);
drivers/char/ipmi/ipmi_si_intf.c
487
} else if (smi_info->msg_flags & RECEIVE_MSG_AVAIL) {
drivers/char/ipmi/ipmi_si_intf.c
489
smi_info->curr_msg = alloc_msg_handle_irq(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
490
if (!smi_info->curr_msg)
drivers/char/ipmi/ipmi_si_intf.c
493
start_getting_msg_queue(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
494
} else if (smi_info->msg_flags & EVENT_MSG_BUFFER_FULL) {
drivers/char/ipmi/ipmi_si_intf.c
496
smi_info->curr_msg = alloc_msg_handle_irq(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
497
if (!smi_info->curr_msg)
drivers/char/ipmi/ipmi_si_intf.c
500
start_getting_events(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
501
} else if (smi_info->msg_flags & OEM_DATA_AVAIL &&
drivers/char/ipmi/ipmi_si_intf.c
502
smi_info->oem_data_avail_handler) {
drivers/char/ipmi/ipmi_si_intf.c
503
if (smi_info->oem_data_avail_handler(smi_info))
drivers/char/ipmi/ipmi_si_intf.c
506
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
515
static u8 current_global_enables(struct smi_info *smi_info, u8 base,
drivers/char/ipmi/ipmi_si_intf.c
520
if (smi_info->supports_event_msg_buff)
drivers/char/ipmi/ipmi_si_intf.c
523
if (((smi_info->io.irq && !smi_info->interrupt_disabled) ||
drivers/char/ipmi/ipmi_si_intf.c
524
smi_info->cannot_disable_irq) &&
drivers/char/ipmi/ipmi_si_intf.c
525
!smi_info->irq_enable_broken)
drivers/char/ipmi/ipmi_si_intf.c
528
if (smi_info->supports_event_msg_buff &&
drivers/char/ipmi/ipmi_si_intf.c
529
smi_info->io.irq && !smi_info->interrupt_disabled &&
drivers/char/ipmi/ipmi_si_intf.c
530
!smi_info->irq_enable_broken)
drivers/char/ipmi/ipmi_si_intf.c
538
static void check_bt_irq(struct smi_info *smi_info, bool irq_on)
drivers/char/ipmi/ipmi_si_intf.c
540
u8 irqstate = smi_info->io.inputb(&smi_info->io, IPMI_BT_INTMASK_REG);
drivers/char/ipmi/ipmi_si_intf.c
548
smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG,
drivers/char/ipmi/ipmi_si_intf.c
551
smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG, 0);
drivers/char/ipmi/ipmi_si_intf.c
554
static void handle_transaction_done(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
558
debug_timestamp(smi_info, "Done");
drivers/char/ipmi/ipmi_si_intf.c
559
switch (smi_info->si_state) {
drivers/char/ipmi/ipmi_si_intf.c
561
if (!smi_info->curr_msg)
drivers/char/ipmi/ipmi_si_intf.c
564
smi_info->curr_msg->rsp_size
drivers/char/ipmi/ipmi_si_intf.c
565
= smi_info->handlers->get_result(
drivers/char/ipmi/ipmi_si_intf.c
566
smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
567
smi_info->curr_msg->rsp,
drivers/char/ipmi/ipmi_si_intf.c
575
msg = smi_info->curr_msg;
drivers/char/ipmi/ipmi_si_intf.c
576
smi_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
577
deliver_recv_msg(smi_info, msg);
drivers/char/ipmi/ipmi_si_intf.c
586
len = smi_info->handlers->get_result(smi_info->si_sm, msg, 4);
drivers/char/ipmi/ipmi_si_intf.c
589
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
595
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
597
smi_info->msg_flags = msg[3];
drivers/char/ipmi/ipmi_si_intf.c
598
handle_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
608
smi_info->handlers->get_result(smi_info->si_sm, msg, 3);
drivers/char/ipmi/ipmi_si_intf.c
611
dev_warn_ratelimited(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
614
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
620
smi_info->curr_msg->rsp_size
drivers/char/ipmi/ipmi_si_intf.c
621
= smi_info->handlers->get_result(
drivers/char/ipmi/ipmi_si_intf.c
622
smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
623
smi_info->curr_msg->rsp,
drivers/char/ipmi/ipmi_si_intf.c
631
msg = smi_info->curr_msg;
drivers/char/ipmi/ipmi_si_intf.c
632
smi_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
638
smi_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL;
drivers/char/ipmi/ipmi_si_intf.c
639
handle_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
641
smi_inc_stat(smi_info, events);
drivers/char/ipmi/ipmi_si_intf.c
649
handle_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
651
deliver_recv_msg(smi_info, msg);
drivers/char/ipmi/ipmi_si_intf.c
658
smi_info->curr_msg->rsp_size
drivers/char/ipmi/ipmi_si_intf.c
659
= smi_info->handlers->get_result(
drivers/char/ipmi/ipmi_si_intf.c
660
smi_info->si_sm,
drivers/char/ipmi/ipmi_si_intf.c
661
smi_info->curr_msg->rsp,
drivers/char/ipmi/ipmi_si_intf.c
669
msg = smi_info->curr_msg;
drivers/char/ipmi/ipmi_si_intf.c
670
smi_info->curr_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
676
smi_info->msg_flags &= ~RECEIVE_MSG_AVAIL;
drivers/char/ipmi/ipmi_si_intf.c
677
handle_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
679
smi_inc_stat(smi_info, incoming_messages);
drivers/char/ipmi/ipmi_si_intf.c
687
handle_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
689
deliver_recv_msg(smi_info, msg);
drivers/char/ipmi/ipmi_si_intf.c
701
smi_info->handlers->get_result(smi_info->si_sm, msg, 4);
drivers/char/ipmi/ipmi_si_intf.c
703
dev_warn_ratelimited(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
707
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
710
enables = current_global_enables(smi_info, 0, &irq_on);
drivers/char/ipmi/ipmi_si_intf.c
711
if (smi_info->io.si_info->type == SI_BT)
drivers/char/ipmi/ipmi_si_intf.c
713
check_bt_irq(smi_info, irq_on);
drivers/char/ipmi/ipmi_si_intf.c
719
smi_info->handlers->start_transaction(
drivers/char/ipmi/ipmi_si_intf.c
720
smi_info->si_sm, msg, 3);
drivers/char/ipmi/ipmi_si_intf.c
721
smi_info->si_state = SI_SETTING_ENABLES;
drivers/char/ipmi/ipmi_si_intf.c
722
} else if (smi_info->supports_event_msg_buff) {
drivers/char/ipmi/ipmi_si_intf.c
723
smi_info->curr_msg = ipmi_alloc_smi_msg();
drivers/char/ipmi/ipmi_si_intf.c
724
if (!smi_info->curr_msg) {
drivers/char/ipmi/ipmi_si_intf.c
725
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
728
start_getting_events(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
730
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
739
smi_info->handlers->get_result(smi_info->si_sm, msg, 4);
drivers/char/ipmi/ipmi_si_intf.c
741
dev_warn_ratelimited(smi_info->io.dev,
drivers/char/ipmi/ipmi_si_intf.c
745
if (smi_info->supports_event_msg_buff) {
drivers/char/ipmi/ipmi_si_intf.c
746
smi_info->curr_msg = ipmi_alloc_smi_msg();
drivers/char/ipmi/ipmi_si_intf.c
747
if (!smi_info->curr_msg) {
drivers/char/ipmi/ipmi_si_intf.c
748
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
751
start_getting_events(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
753
smi_info->si_state = SI_NORMAL;
drivers/char/ipmi/ipmi_si_intf.c
767
static enum si_sm_result smi_event_handler(struct smi_info *smi_info,
drivers/char/ipmi/ipmi_si_intf.c
773
if (smi_info->si_state == SI_HOSED)
drivers/char/ipmi/ipmi_si_intf.c
785
si_sm_result = smi_info->handlers->event(smi_info->si_sm, time);
drivers/char/ipmi/ipmi_si_intf.c
788
si_sm_result = smi_info->handlers->event(smi_info->si_sm, 0);
drivers/char/ipmi/ipmi_si_intf.c
791
smi_inc_stat(smi_info, complete_transactions);
drivers/char/ipmi/ipmi_si_intf.c
793
handle_transaction_done(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
796
smi_inc_stat(smi_info, hosed_count);
drivers/char/ipmi/ipmi_si_intf.c
803
smi_info->si_state = SI_HOSED;
drivers/char/ipmi/ipmi_si_intf.c
804
if (smi_info->curr_msg != NULL) {
drivers/char/ipmi/ipmi_si_intf.c
810
return_hosed_msg(smi_info, IPMI_BUS_ERR);
drivers/char/ipmi/ipmi_si_intf.c
812
if (smi_info->waiting_msg != NULL) {
drivers/char/ipmi/ipmi_si_intf.c
814
smi_info->curr_msg = smi_info->waiting_msg;
drivers/char/ipmi/ipmi_si_intf.c
815
smi_info->waiting_msg = NULL;
drivers/char/ipmi/ipmi_si_intf.c
816
return_hosed_msg(smi_info, IPMI_BUS_ERR);
drivers/char/ipmi/ipmi_si_intf.c
818
smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_HOSED);
drivers/char/ipmi/ipmi_si_intf.c
826
if (si_sm_result == SI_SM_ATTN || smi_info->got_attn) {
drivers/char/ipmi/ipmi_si_intf.c
827
if (smi_info->si_state != SI_NORMAL) {
drivers/char/ipmi/ipmi_si_intf.c
832
smi_info->got_attn = true;
drivers/char/ipmi/ipmi_si_intf.c
834
smi_info->got_attn = false;
drivers/char/ipmi/ipmi_si_intf.c
835
smi_inc_stat(smi_info, attentions);
drivers/char/ipmi/ipmi_si_intf.c
844
start_get_flags(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
851
smi_inc_stat(smi_info, idles);
drivers/char/ipmi/ipmi_si_intf.c
853
si_sm_result = start_next_msg(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
859
&& (atomic_read(&smi_info->req_events))) {
drivers/char/ipmi/ipmi_si_intf.c
864
atomic_set(&smi_info->req_events, 0);
drivers/char/ipmi/ipmi_si_intf.c
872
if (smi_info->supports_event_msg_buff || smi_info->io.irq) {
drivers/char/ipmi/ipmi_si_intf.c
873
start_check_enables(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
875
smi_info->curr_msg = alloc_msg_handle_irq(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
876
if (!smi_info->curr_msg)
drivers/char/ipmi/ipmi_si_intf.c
879
start_getting_events(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
884
if (si_sm_result == SI_SM_IDLE && smi_info->timer_running) {
drivers/char/ipmi/ipmi_si_intf.c
886
if (timer_delete(&smi_info->si_timer))
drivers/char/ipmi/ipmi_si_intf.c
887
smi_info->timer_running = false;
drivers/char/ipmi/ipmi_si_intf.c
894
static void check_start_timer_thread(struct smi_info *smi_info)
drivers/char/ipmi/ipmi_si_intf.c
896
if (smi_info->si_state == SI_NORMAL && smi_info->curr_msg == NULL) {
drivers/char/ipmi/ipmi_si_intf.c
897
smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES);
drivers/char/ipmi/ipmi_si_intf.c
899
if (smi_info->thread)
drivers/char/ipmi/ipmi_si_intf.c
900
wake_up_process(smi_info->thread);
drivers/char/ipmi/ipmi_si_intf.c
902
start_next_msg(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
903
smi_event_handler(smi_info, 0);
drivers/char/ipmi/ipmi_si_intf.c
909
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
916
result = smi_event_handler(smi_info, 0);
drivers/char/ipmi/ipmi_si_intf.c
919
result = smi_event_handler(smi_info, SI_SHORT_TIMEOUT_USEC);
drivers/char/ipmi/ipmi_si_intf.c
925
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
929
debug_timestamp(smi_info, "Enqueue");
drivers/char/ipmi/ipmi_si_intf.c
935
if (smi_info->si_state == SI_HOSED)
drivers/char/ipmi/ipmi_si_intf.c
938
if (smi_info->run_to_completion) {
drivers/char/ipmi/ipmi_si_intf.c
943
smi_info->waiting_msg = msg;
drivers/char/ipmi/ipmi_si_intf.c
947
spin_lock_irqsave(&smi_info->si_lock, flags);
drivers/char/ipmi/ipmi_si_intf.c
948
if (smi_info->si_state == SI_HOSED) {
drivers/char/ipmi/ipmi_si_intf.c
951
BUG_ON(smi_info->waiting_msg);
drivers/char/ipmi/ipmi_si_intf.c
952
smi_info->waiting_msg = msg;
drivers/char/ipmi/ipmi_si_intf.c
953
check_start_timer_thread(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
955
spin_unlock_irqrestore(&smi_info->si_lock, flags);
drivers/char/ipmi/ipmi_si_intf.c
961
struct smi_info *smi_info = send_info;
drivers/char/ipmi/ipmi_si_intf.c
963
smi_info->run_to_completion = i_run_to_completion;
drivers/char/ipmi/ipmi_si_intf.c
965
flush_messages(smi_info);
drivers/char/ipmi/ipmi_si_intf.c
974
const struct smi_info *smi_info,
drivers/char/ipmi/ipmi_si_intf.c
979
if (smi_info->si_num < num_max_busy_us)
drivers/char/ipmi/ipmi_si_intf.c
980
max_busy_us = kipmid_max_busy_us[smi_info->si_num];