Lines Matching +full:ipmi +full:- +full:bt
1 // SPDX-License-Identifier: GPL-2.0+
5 * The interface to the IPMI driver for the system interfaces (KCS, SMIC,
6 * BT).
40 #include <linux/ipmi.h>
65 /* FIXME - add watchdog stuff. */
68 /* Some BT-specific defines we need here. */
73 /* 'invalid' to allow a firmware-specified interface to be disabled */
74 const char *const si_to_str[] = { "invalid", "kcs", "smic", "bt", NULL };
112 /* Number of IPMI events received from the hardware. */
138 * IPMI
143 * Per-OEM handler, called from handle_flags(). Returns 1
144 * when handle_flags() needs to be re-run or 0 indicating it
199 * memory. Once that situation clears up, it will re-enable
249 atomic_inc(&(smi)->stats[SI_STAT_ ## stat])
251 ((unsigned int) atomic_read(&(smi)->stats[SI_STAT_ ## stat]))
288 ipmi_smi_msg_received(smi_info->intf, msg); in deliver_recv_msg()
293 struct ipmi_smi_msg *msg = smi_info->curr_msg; in return_hosed_msg()
300 msg->rsp[0] = msg->data[0] | 4; in return_hosed_msg()
301 msg->rsp[1] = msg->data[1]; in return_hosed_msg()
302 msg->rsp[2] = cCode; in return_hosed_msg()
303 msg->rsp_size = 3; in return_hosed_msg()
305 smi_info->curr_msg = NULL; in return_hosed_msg()
313 if (!smi_info->waiting_msg) { in start_next_msg()
314 smi_info->curr_msg = NULL; in start_next_msg()
319 smi_info->curr_msg = smi_info->waiting_msg; in start_next_msg()
320 smi_info->waiting_msg = NULL; in start_next_msg()
328 err = smi_info->handlers->start_transaction( in start_next_msg()
329 smi_info->si_sm, in start_next_msg()
330 smi_info->curr_msg->data, in start_next_msg()
331 smi_info->curr_msg->data_size); in start_next_msg()
343 if (!smi_info->timer_can_start) in smi_mod_timer()
345 smi_info->last_timeout_jiffies = jiffies; in smi_mod_timer()
346 mod_timer(&smi_info->si_timer, new_val); in smi_mod_timer()
347 smi_info->timer_running = true; in smi_mod_timer()
358 if (smi_info->thread) in start_new_msg()
359 wake_up_process(smi_info->thread); in start_new_msg()
361 smi_info->handlers->start_transaction(smi_info->si_sm, msg, size); in start_new_msg()
372 smi_info->si_state = SI_CHECKING_ENABLES; in start_check_enables()
379 /* Make sure the watchdog pre-timeout flag is not set at startup. */ in start_clear_flags()
385 smi_info->si_state = SI_CLEARING_FLAGS; in start_clear_flags()
390 smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); in start_getting_msg_queue()
391 smi_info->curr_msg->data[1] = IPMI_GET_MSG_CMD; in start_getting_msg_queue()
392 smi_info->curr_msg->data_size = 2; in start_getting_msg_queue()
394 start_new_msg(smi_info, smi_info->curr_msg->data, in start_getting_msg_queue()
395 smi_info->curr_msg->data_size); in start_getting_msg_queue()
396 smi_info->si_state = SI_GETTING_MESSAGES; in start_getting_msg_queue()
401 smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); in start_getting_events()
402 smi_info->curr_msg->data[1] = IPMI_READ_EVENT_MSG_BUFFER_CMD; in start_getting_events()
403 smi_info->curr_msg->data_size = 2; in start_getting_events()
405 start_new_msg(smi_info, smi_info->curr_msg->data, in start_getting_events()
406 smi_info->curr_msg->data_size); in start_getting_events()
407 smi_info->si_state = SI_GETTING_EVENTS; in start_getting_events()
414 * memory, we will re-enable the interrupt.
421 if ((smi_info->io.irq) && (!smi_info->interrupt_disabled)) { in disable_si_irq()
422 smi_info->interrupt_disabled = true; in disable_si_irq()
431 if ((smi_info->io.irq) && (smi_info->interrupt_disabled)) { in enable_si_irq()
432 smi_info->interrupt_disabled = false; in enable_si_irq()
452 smi_info->si_state = SI_NORMAL; in alloc_msg_handle_irq()
463 if (smi_info->msg_flags & WDT_PRE_TIMEOUT_INT) { in handle_flags()
464 /* Watchdog pre-timeout */ in handle_flags()
468 smi_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT; in handle_flags()
469 ipmi_smi_watchdog_pretimeout(smi_info->intf); in handle_flags()
470 } else if (smi_info->msg_flags & RECEIVE_MSG_AVAIL) { in handle_flags()
472 smi_info->curr_msg = alloc_msg_handle_irq(smi_info); in handle_flags()
473 if (!smi_info->curr_msg) in handle_flags()
477 } else if (smi_info->msg_flags & EVENT_MSG_BUFFER_FULL) { in handle_flags()
479 smi_info->curr_msg = alloc_msg_handle_irq(smi_info); in handle_flags()
480 if (!smi_info->curr_msg) in handle_flags()
484 } else if (smi_info->msg_flags & OEM_DATA_AVAIL && in handle_flags()
485 smi_info->oem_data_avail_handler) { in handle_flags()
486 if (smi_info->oem_data_avail_handler(smi_info)) in handle_flags()
489 smi_info->si_state = SI_NORMAL; in handle_flags()
503 if (smi_info->supports_event_msg_buff) in current_global_enables()
506 if (((smi_info->io.irq && !smi_info->interrupt_disabled) || in current_global_enables()
507 smi_info->cannot_disable_irq) && in current_global_enables()
508 !smi_info->irq_enable_broken) in current_global_enables()
511 if (smi_info->supports_event_msg_buff && in current_global_enables()
512 smi_info->io.irq && !smi_info->interrupt_disabled && in current_global_enables()
513 !smi_info->irq_enable_broken) in current_global_enables()
523 u8 irqstate = smi_info->io.inputb(&smi_info->io, IPMI_BT_INTMASK_REG); in check_bt_irq()
531 smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG, in check_bt_irq()
534 smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG, 0); in check_bt_irq()
542 switch (smi_info->si_state) { in handle_transaction_done()
544 if (!smi_info->curr_msg) in handle_transaction_done()
547 smi_info->curr_msg->rsp_size in handle_transaction_done()
548 = smi_info->handlers->get_result( in handle_transaction_done()
549 smi_info->si_sm, in handle_transaction_done()
550 smi_info->curr_msg->rsp, in handle_transaction_done()
558 msg = smi_info->curr_msg; in handle_transaction_done()
559 smi_info->curr_msg = NULL; in handle_transaction_done()
569 len = smi_info->handlers->get_result(smi_info->si_sm, msg, 4); in handle_transaction_done()
572 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
578 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
580 smi_info->msg_flags = msg[3]; in handle_transaction_done()
591 smi_info->handlers->get_result(smi_info->si_sm, msg, 3); in handle_transaction_done()
594 dev_warn_ratelimited(smi_info->io.dev, in handle_transaction_done()
597 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
603 smi_info->curr_msg->rsp_size in handle_transaction_done()
604 = smi_info->handlers->get_result( in handle_transaction_done()
605 smi_info->si_sm, in handle_transaction_done()
606 smi_info->curr_msg->rsp, in handle_transaction_done()
614 msg = smi_info->curr_msg; in handle_transaction_done()
615 smi_info->curr_msg = NULL; in handle_transaction_done()
616 if (msg->rsp[2] != 0) { in handle_transaction_done()
618 msg->done(msg); in handle_transaction_done()
621 smi_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; in handle_transaction_done()
641 smi_info->curr_msg->rsp_size in handle_transaction_done()
642 = smi_info->handlers->get_result( in handle_transaction_done()
643 smi_info->si_sm, in handle_transaction_done()
644 smi_info->curr_msg->rsp, in handle_transaction_done()
652 msg = smi_info->curr_msg; in handle_transaction_done()
653 smi_info->curr_msg = NULL; in handle_transaction_done()
654 if (msg->rsp[2] != 0) { in handle_transaction_done()
656 msg->done(msg); in handle_transaction_done()
659 smi_info->msg_flags &= ~RECEIVE_MSG_AVAIL; in handle_transaction_done()
684 smi_info->handlers->get_result(smi_info->si_sm, msg, 4); in handle_transaction_done()
686 dev_warn_ratelimited(smi_info->io.dev, in handle_transaction_done()
688 "Maybe ok, but ipmi might run very slowly.\n", in handle_transaction_done()
690 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
694 if (smi_info->io.si_type == SI_BT) in handle_transaction_done()
695 /* BT has its own interrupt enable bit. */ in handle_transaction_done()
702 smi_info->handlers->start_transaction( in handle_transaction_done()
703 smi_info->si_sm, msg, 3); in handle_transaction_done()
704 smi_info->si_state = SI_SETTING_ENABLES; in handle_transaction_done()
705 } else if (smi_info->supports_event_msg_buff) { in handle_transaction_done()
706 smi_info->curr_msg = ipmi_alloc_smi_msg(); in handle_transaction_done()
707 if (!smi_info->curr_msg) { in handle_transaction_done()
708 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
713 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
722 smi_info->handlers->get_result(smi_info->si_sm, msg, 4); in handle_transaction_done()
724 dev_warn_ratelimited(smi_info->io.dev, in handle_transaction_done()
728 if (smi_info->supports_event_msg_buff) { in handle_transaction_done()
729 smi_info->curr_msg = ipmi_alloc_smi_msg(); in handle_transaction_done()
730 if (!smi_info->curr_msg) { in handle_transaction_done()
731 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
736 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
762 si_sm_result = smi_info->handlers->event(smi_info->si_sm, time); in smi_event_handler()
765 si_sm_result = smi_info->handlers->event(smi_info->si_sm, 0); in smi_event_handler()
779 smi_info->si_state = SI_NORMAL; in smi_event_handler()
780 if (smi_info->curr_msg != NULL) { in smi_event_handler()
795 if (si_sm_result == SI_SM_ATTN || smi_info->got_attn) { in smi_event_handler()
798 if (smi_info->si_state != SI_NORMAL) { in smi_event_handler()
803 smi_info->got_attn = true; in smi_event_handler()
805 smi_info->got_attn = false; in smi_event_handler()
819 smi_info->si_state = SI_GETTING_FLAGS; in smi_event_handler()
834 && (atomic_read(&smi_info->req_events))) { in smi_event_handler()
839 atomic_set(&smi_info->req_events, 0); in smi_event_handler()
847 if (smi_info->supports_event_msg_buff || smi_info->io.irq) { in smi_event_handler()
850 smi_info->curr_msg = alloc_msg_handle_irq(smi_info); in smi_event_handler()
851 if (!smi_info->curr_msg) in smi_event_handler()
859 if (si_sm_result == SI_SM_IDLE && smi_info->timer_running) { in smi_event_handler()
861 if (del_timer(&smi_info->si_timer)) in smi_event_handler()
862 smi_info->timer_running = false; in smi_event_handler()
871 if (smi_info->si_state == SI_NORMAL && smi_info->curr_msg == NULL) { in check_start_timer_thread()
874 if (smi_info->thread) in check_start_timer_thread()
875 wake_up_process(smi_info->thread); in check_start_timer_thread()
888 * Currently, this function is called only in run-to-completion in flush_messages()
889 * mode. This means we are single-threaded, no need for locks. in flush_messages()
906 if (smi_info->run_to_completion) { in sender()
911 smi_info->waiting_msg = msg; in sender()
915 spin_lock_irqsave(&smi_info->si_lock, flags); in sender()
923 BUG_ON(smi_info->waiting_msg); in sender()
924 smi_info->waiting_msg = msg; in sender()
926 spin_unlock_irqrestore(&smi_info->si_lock, flags); in sender()
933 smi_info->run_to_completion = i_run_to_completion; in set_run_to_completion()
939 * Use -1 as a special constant to tell that we are spinning in kipmid
942 #define IPMI_TIME_NOT_BUSY ns_to_ktime(-1ull)
949 if (smi_info->si_num < num_max_busy_us) in ipmi_thread_busy_wait()
950 max_busy_us = kipmid_max_busy_us[smi_info->si_num]; in ipmi_thread_busy_wait()
966 * A busy-waiting loop for speeding up IPMI operation.
969 * that are not BT and do not have interrupts. It starts spinning
972 * Documentation/driver-api/ipmi.rst for details.
985 spin_lock_irqsave(&(smi_info->si_lock), flags); in ipmi_thread()
995 if (smi_result != SI_SM_IDLE && !smi_info->timer_running) in ipmi_thread()
998 spin_unlock_irqrestore(&(smi_info->si_lock), flags); in ipmi_thread()
1010 if (smi_info->in_maintenance_mode) in ipmi_thread()
1015 if (atomic_read(&smi_info->need_watch)) { in ipmi_thread()
1034 bool run_to_completion = smi_info->run_to_completion; in poll()
1042 spin_lock_irqsave(&smi_info->si_lock, flags); in poll()
1045 spin_unlock_irqrestore(&smi_info->si_lock, flags); in poll()
1052 if (!smi_info->has_event_buffer) in request_events()
1055 atomic_set(&smi_info->req_events, 1); in request_events()
1066 atomic_set(&smi_info->need_watch, enable); in set_need_watch()
1067 spin_lock_irqsave(&smi_info->si_lock, flags); in set_need_watch()
1069 spin_unlock_irqrestore(&smi_info->si_lock, flags); in set_need_watch()
1081 spin_lock_irqsave(&(smi_info->si_lock), flags); in smi_timeout()
1085 time_diff = (((long)jiffies_now - (long)smi_info->last_timeout_jiffies) in smi_timeout()
1089 if ((smi_info->io.irq) && (!smi_info->interrupt_disabled)) { in smi_timeout()
1112 smi_info->timer_running = false; in smi_timeout()
1113 spin_unlock_irqrestore(&(smi_info->si_lock), flags); in smi_timeout()
1121 if (smi_info->io.si_type == SI_BT) in ipmi_si_irq_handler()
1122 /* We need to clear the IRQ flag for the BT interface. */ in ipmi_si_irq_handler()
1123 smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG, in ipmi_si_irq_handler()
1127 spin_lock_irqsave(&(smi_info->si_lock), flags); in ipmi_si_irq_handler()
1134 spin_unlock_irqrestore(&(smi_info->si_lock), flags); in ipmi_si_irq_handler()
1144 new_smi->intf = intf; in smi_start_processing()
1147 timer_setup(&new_smi->si_timer, smi_timeout, 0); in smi_start_processing()
1148 new_smi->timer_can_start = true; in smi_start_processing()
1152 if (new_smi->io.irq_setup) { in smi_start_processing()
1153 new_smi->io.irq_handler_data = new_smi; in smi_start_processing()
1154 new_smi->io.irq_setup(&new_smi->io); in smi_start_processing()
1160 if (new_smi->si_num < num_force_kipmid) in smi_start_processing()
1161 enable = force_kipmid[new_smi->si_num]; in smi_start_processing()
1163 * The BT interface is efficient enough to not need a thread, in smi_start_processing()
1166 else if ((new_smi->io.si_type != SI_BT) && (!new_smi->io.irq)) in smi_start_processing()
1170 new_smi->thread = kthread_run(ipmi_thread, new_smi, in smi_start_processing()
1171 "kipmi%d", new_smi->si_num); in smi_start_processing()
1172 if (IS_ERR(new_smi->thread)) { in smi_start_processing()
1173 dev_notice(new_smi->io.dev, in smi_start_processing()
1175 PTR_ERR(new_smi->thread)); in smi_start_processing()
1176 new_smi->thread = NULL; in smi_start_processing()
1187 data->addr_src = smi->io.addr_source; in get_smi_info()
1188 data->dev = smi->io.dev; in get_smi_info()
1189 data->addr_info = smi->io.addr_info; in get_smi_info()
1190 get_device(smi->io.dev); in get_smi_info()
1200 atomic_set(&smi_info->req_events, 0); in set_maintenance_mode()
1201 smi_info->in_maintenance_mode = enable; in set_maintenance_mode()
1227 …"Force the kipmi daemon to be enabled (1) or disabled(0). Normally the IPMI driver auto-detects t…
1233 …"Max time (in microseconds) to busy-wait for IPMI data before sleeping. 0 (default) means to wait …
1237 if (io->si_type == SI_BT) in ipmi_irq_finish_setup()
1238 /* Enable the interrupt in the BT interface. */ in ipmi_irq_finish_setup()
1239 io->outputb(io, IPMI_BT_INTMASK_REG, in ipmi_irq_finish_setup()
1245 if (io->si_type == SI_BT) in ipmi_irq_start_cleanup()
1246 /* Disable the interrupt in the BT interface. */ in ipmi_irq_start_cleanup()
1247 io->outputb(io, IPMI_BT_INTMASK_REG, 0); in ipmi_irq_start_cleanup()
1253 free_irq(io->irq, io->irq_handler_data); in std_irq_cleanup()
1260 if (!io->irq) in ipmi_std_irq_setup()
1263 rv = request_irq(io->irq, in ipmi_std_irq_setup()
1267 io->irq_handler_data); in ipmi_std_irq_setup()
1269 dev_warn(io->dev, "%s unable to claim interrupt %d, running polled\n", in ipmi_std_irq_setup()
1270 SI_DEVICE_NAME, io->irq); in ipmi_std_irq_setup()
1271 io->irq = 0; in ipmi_std_irq_setup()
1273 io->irq_cleanup = std_irq_cleanup; in ipmi_std_irq_setup()
1275 dev_info(io->dev, "Using irq %d\n", io->irq); in ipmi_std_irq_setup()
1285 smi_result = smi_info->handlers->event(smi_info->si_sm, 0); in wait_for_msg_done()
1290 smi_result = smi_info->handlers->event( in wait_for_msg_done()
1291 smi_info->si_sm, jiffies_to_usecs(1)); in wait_for_msg_done()
1293 smi_result = smi_info->handlers->event( in wait_for_msg_done()
1294 smi_info->si_sm, 0); in wait_for_msg_done()
1301 * the port is probably not an IPMI SMI interface. in wait_for_msg_done()
1303 return -ENODEV; in wait_for_msg_done()
1318 return -ENOMEM; in try_get_dev_id()
1328 smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); in try_get_dev_id()
1334 resp_len = smi_info->handlers->get_result(smi_info->si_sm, in try_get_dev_id()
1339 resp + 2, resp_len - 2, &smi_info->device_id); in try_get_dev_id()
1346 dev_warn_ratelimited(smi_info->io.dev, in try_get_dev_id()
1367 return -ENOMEM; in get_global_enables()
1371 smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); in get_global_enables()
1375 dev_warn(smi_info->io.dev, in get_global_enables()
1381 resp_len = smi_info->handlers->get_result(smi_info->si_sm, in get_global_enables()
1388 dev_warn(smi_info->io.dev, in get_global_enables()
1391 rv = -EINVAL; in get_global_enables()
1414 return -ENOMEM; in set_global_enables()
1419 smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3); in set_global_enables()
1423 dev_warn(smi_info->io.dev, in set_global_enables()
1429 resp_len = smi_info->handlers->get_result(smi_info->si_sm, in set_global_enables()
1435 dev_warn(smi_info->io.dev, in set_global_enables()
1438 rv = -EINVAL; in set_global_enables()
1471 dev_err(smi_info->io.dev, in check_clr_rcv_irq()
1481 dev_warn(smi_info->io.dev, in check_clr_rcv_irq()
1483 smi_info->cannot_disable_irq = true; in check_clr_rcv_irq()
1497 if (!smi_info->io.irq) in check_set_rcv_irq()
1507 dev_err(smi_info->io.dev, in check_set_rcv_irq()
1517 dev_warn(smi_info->io.dev, in check_set_rcv_irq()
1519 smi_info->cannot_disable_irq = true; in check_set_rcv_irq()
1520 smi_info->irq_enable_broken = true; in check_set_rcv_irq()
1533 return -ENOMEM; in try_enable_event_buffer()
1537 smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); in try_enable_event_buffer()
1545 resp_len = smi_info->handlers->get_result(smi_info->si_sm, in try_enable_event_buffer()
1553 rv = -EINVAL; in try_enable_event_buffer()
1559 smi_info->supports_event_msg_buff = true; in try_enable_event_buffer()
1566 smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3); in try_enable_event_buffer()
1574 resp_len = smi_info->handlers->get_result(smi_info->si_sm, in try_enable_event_buffer()
1581 rv = -EINVAL; in try_enable_event_buffer()
1590 rv = -ENOENT; in try_enable_event_buffer()
1592 smi_info->supports_event_msg_buff = true; in try_enable_event_buffer()
1616 return snprintf(buf, 10, "%s\n", si_to_str[smi_info->io.si_type]); in type_show()
1625 int enabled = smi_info->io.irq && !smi_info->interrupt_disabled; in interrupts_enabled_show()
1651 si_to_str[smi_info->io.si_type], in params_show()
1652 addr_space_to_str[smi_info->io.addr_space], in params_show()
1653 smi_info->io.addr_data, in params_show()
1654 smi_info->io.regspacing, in params_show()
1655 smi_info->io.regsize, in params_show()
1656 smi_info->io.regshift, in params_show()
1657 smi_info->io.irq, in params_show()
1658 smi_info->io.slave_addr); in params_show()
1686 * @info - smi_info structure with msg_flags set
1689 * Returns 1 indicating need to re-run handle_flags().
1693 smi_info->msg_flags = ((smi_info->msg_flags & ~OEM_DATA_AVAIL) | in oem_data_avail_to_receive_msg_avail()
1700 * @info - smi_info.device_id must be populated
1704 * it's safe to do so. Such systems will de-assert OEM1_DATA_AVAIL
1708 * As Dell has no plans to release IPMI 1.5 firmware that *ever*
1716 * IPMI Version = 0x51 IPMI 1.5
1719 * Additionally, PowerEdge systems with IPMI < 1.5 may also assert
1729 struct ipmi_device_id *id = &smi_info->device_id; in setup_dell_poweredge_oem_data_handler()
1730 if (id->manufacturer_id == DELL_IANA_MFR_ID) { in setup_dell_poweredge_oem_data_handler()
1731 if (id->device_id == DELL_POWEREDGE_8G_BMC_DEVICE_ID && in setup_dell_poweredge_oem_data_handler()
1732 id->device_revision == DELL_POWEREDGE_8G_BMC_DEVICE_REV && in setup_dell_poweredge_oem_data_handler()
1733 id->ipmi_version == DELL_POWEREDGE_8G_BMC_IPMI_VERSION) { in setup_dell_poweredge_oem_data_handler()
1734 smi_info->oem_data_avail_handler = in setup_dell_poweredge_oem_data_handler()
1739 smi_info->oem_data_avail_handler = in setup_dell_poweredge_oem_data_handler()
1748 struct ipmi_smi_msg *msg = smi_info->curr_msg; in return_hosed_msg_badsize()
1751 msg->rsp[0] = msg->data[0] | 4; in return_hosed_msg_badsize()
1752 msg->rsp[1] = msg->data[1]; in return_hosed_msg_badsize()
1753 msg->rsp[2] = CANNOT_RETURN_REQUESTED_LENGTH; in return_hosed_msg_badsize()
1754 msg->rsp_size = 3; in return_hosed_msg_badsize()
1755 smi_info->curr_msg = NULL; in return_hosed_msg_badsize()
1761 * @info - smi_info.device_id must be populated
1763 * Dell PowerEdge servers with the BT interface (x6xx and 1750) will
1767 * callers to try again with a different-sized buffer, which succeeds.
1777 unsigned char *data = smi_info->curr_msg->data; in dell_poweredge_bt_xaction_handler()
1778 unsigned int size = smi_info->curr_msg->data_size; in dell_poweredge_bt_xaction_handler()
1795 * @info - smi_info.device_id must be filled in already
1803 struct ipmi_device_id *id = &smi_info->device_id; in setup_dell_poweredge_bt_xaction_handler()
1804 if (id->manufacturer_id == DELL_IANA_MFR_ID && in setup_dell_poweredge_bt_xaction_handler()
1805 smi_info->io.si_type == SI_BT) in setup_dell_poweredge_bt_xaction_handler()
1811 * @info - smi_info.device_id must be filled in already
1835 if (smi_info->thread != NULL) { in stop_timer_and_thread()
1836 kthread_stop(smi_info->thread); in stop_timer_and_thread()
1837 smi_info->thread = NULL; in stop_timer_and_thread()
1840 smi_info->timer_can_start = false; in stop_timer_and_thread()
1841 del_timer_sync(&smi_info->si_timer); in stop_timer_and_thread()
1849 if (e->io.addr_space != info->io.addr_space) in find_dup_si()
1851 if (e->io.addr_data == info->io.addr_data) { in find_dup_si()
1857 if (info->io.slave_addr && !e->io.slave_addr) in find_dup_si()
1858 e->io.slave_addr = info->io.slave_addr; in find_dup_si()
1872 * If the user gave us a hard-coded device at the same in ipmi_si_add_smi()
1876 if (io->addr_source != SI_HARDCODED && io->addr_source != SI_HOTMOD && in ipmi_si_add_smi()
1877 ipmi_si_hardcode_match(io->addr_space, io->addr_data)) { in ipmi_si_add_smi()
1878 dev_info(io->dev, in ipmi_si_add_smi()
1879 "Hard-coded device at this address already exists"); in ipmi_si_add_smi()
1880 return -ENODEV; in ipmi_si_add_smi()
1883 if (!io->io_setup) { in ipmi_si_add_smi()
1884 if (io->addr_space == IPMI_IO_ADDR_SPACE) { in ipmi_si_add_smi()
1885 io->io_setup = ipmi_si_port_setup; in ipmi_si_add_smi()
1886 } else if (io->addr_space == IPMI_MEM_ADDR_SPACE) { in ipmi_si_add_smi()
1887 io->io_setup = ipmi_si_mem_setup; in ipmi_si_add_smi()
1889 return -EINVAL; in ipmi_si_add_smi()
1895 return -ENOMEM; in ipmi_si_add_smi()
1896 spin_lock_init(&new_smi->si_lock); in ipmi_si_add_smi()
1898 new_smi->io = *io; in ipmi_si_add_smi()
1903 if (new_smi->io.addr_source == SI_ACPI && in ipmi_si_add_smi()
1904 dup->io.addr_source == SI_SMBIOS) { in ipmi_si_add_smi()
1906 dev_info(dup->io.dev, in ipmi_si_add_smi()
1907 "Removing SMBIOS-specified %s state machine in favor of ACPI\n", in ipmi_si_add_smi()
1908 si_to_str[new_smi->io.si_type]); in ipmi_si_add_smi()
1911 dev_info(new_smi->io.dev, in ipmi_si_add_smi()
1912 "%s-specified %s state machine: duplicate\n", in ipmi_si_add_smi()
1913 ipmi_addr_src_to_str(new_smi->io.addr_source), in ipmi_si_add_smi()
1914 si_to_str[new_smi->io.si_type]); in ipmi_si_add_smi()
1915 rv = -EBUSY; in ipmi_si_add_smi()
1921 pr_info("Adding %s-specified %s state machine\n", in ipmi_si_add_smi()
1922 ipmi_addr_src_to_str(new_smi->io.addr_source), in ipmi_si_add_smi()
1923 si_to_str[new_smi->io.si_type]); in ipmi_si_add_smi()
1925 list_add_tail(&new_smi->link, &smi_infos); in ipmi_si_add_smi()
1944 pr_info("Trying %s-specified %s state machine at %s address 0x%lx, slave address 0x%x, irq %d\n", in try_smi_init()
1945 ipmi_addr_src_to_str(new_smi->io.addr_source), in try_smi_init()
1946 si_to_str[new_smi->io.si_type], in try_smi_init()
1947 addr_space_to_str[new_smi->io.addr_space], in try_smi_init()
1948 new_smi->io.addr_data, in try_smi_init()
1949 new_smi->io.slave_addr, new_smi->io.irq); in try_smi_init()
1951 switch (new_smi->io.si_type) { in try_smi_init()
1953 new_smi->handlers = &kcs_smi_handlers; in try_smi_init()
1957 new_smi->handlers = &smic_smi_handlers; in try_smi_init()
1961 new_smi->handlers = &bt_smi_handlers; in try_smi_init()
1966 rv = -EIO; in try_smi_init()
1970 new_smi->si_num = smi_num; in try_smi_init()
1973 if (!new_smi->io.dev) { in try_smi_init()
1974 pr_err("IPMI interface added with no device\n"); in try_smi_init()
1975 rv = -EIO; in try_smi_init()
1980 new_smi->si_sm = kmalloc(new_smi->handlers->size(), GFP_KERNEL); in try_smi_init()
1981 if (!new_smi->si_sm) { in try_smi_init()
1982 rv = -ENOMEM; in try_smi_init()
1985 new_smi->io.io_size = new_smi->handlers->init_data(new_smi->si_sm, in try_smi_init()
1986 &new_smi->io); in try_smi_init()
1989 rv = new_smi->io.io_setup(&new_smi->io); in try_smi_init()
1991 dev_err(new_smi->io.dev, "Could not set up I/O space\n"); in try_smi_init()
1995 /* Do low-level detection first. */ in try_smi_init()
1996 if (new_smi->handlers->detect(new_smi->si_sm)) { in try_smi_init()
1997 if (new_smi->io.addr_source) in try_smi_init()
1998 dev_err(new_smi->io.dev, in try_smi_init()
2000 rv = -ENODEV; in try_smi_init()
2010 if (new_smi->io.addr_source) in try_smi_init()
2011 dev_err(new_smi->io.dev, in try_smi_init()
2020 new_smi->waiting_msg = NULL; in try_smi_init()
2021 new_smi->curr_msg = NULL; in try_smi_init()
2022 atomic_set(&new_smi->req_events, 0); in try_smi_init()
2023 new_smi->run_to_completion = false; in try_smi_init()
2025 atomic_set(&new_smi->stats[i], 0); in try_smi_init()
2027 new_smi->interrupt_disabled = true; in try_smi_init()
2028 atomic_set(&new_smi->need_watch, 0); in try_smi_init()
2032 new_smi->has_event_buffer = true; in try_smi_init()
2041 * IRQ is defined to be set when non-zero. req_events will in try_smi_init()
2044 if (new_smi->io.irq) { in try_smi_init()
2045 new_smi->interrupt_disabled = false; in try_smi_init()
2046 atomic_set(&new_smi->req_events, 1); in try_smi_init()
2049 dev_set_drvdata(new_smi->io.dev, new_smi); in try_smi_init()
2050 rv = device_add_group(new_smi->io.dev, &ipmi_si_dev_attr_group); in try_smi_init()
2052 dev_err(new_smi->io.dev, in try_smi_init()
2057 new_smi->dev_group_added = true; in try_smi_init()
2061 new_smi->io.dev, in try_smi_init()
2062 new_smi->io.slave_addr); in try_smi_init()
2064 dev_err(new_smi->io.dev, in try_smi_init()
2073 dev_info(new_smi->io.dev, "IPMI %s interface initialized\n", in try_smi_init()
2074 si_to_str[new_smi->io.si_type]); in try_smi_init()
2076 WARN_ON(new_smi->io.dev->init_name != NULL); in try_smi_init()
2079 if (rv && new_smi->io.io_cleanup) { in try_smi_init()
2080 new_smi->io.io_cleanup(&new_smi->io); in try_smi_init()
2081 new_smi->io.io_cleanup = NULL; in try_smi_init()
2097 pr_info("IPMI System Interface driver\n"); in init_ipmi_si()
2114 if (e->io.irq && (!type || e->io.addr_source == type)) { in init_ipmi_si()
2116 type = e->io.addr_source; in init_ipmi_si()
2128 if (!e->io.irq && (!type || e->io.addr_source == type)) { in init_ipmi_si()
2130 type = e->io.addr_source; in init_ipmi_si()
2147 return -ENODEV; in init_ipmi_si()
2159 if (smi_info->dev_group_added) { in shutdown_smi()
2160 device_remove_group(smi_info->io.dev, &ipmi_si_dev_attr_group); in shutdown_smi()
2161 smi_info->dev_group_added = false; in shutdown_smi()
2163 if (smi_info->io.dev) in shutdown_smi()
2164 dev_set_drvdata(smi_info->io.dev, NULL); in shutdown_smi()
2170 smi_info->interrupt_disabled = true; in shutdown_smi()
2171 if (smi_info->io.irq_cleanup) { in shutdown_smi()
2172 smi_info->io.irq_cleanup(&smi_info->io); in shutdown_smi()
2173 smi_info->io.irq_cleanup = NULL; in shutdown_smi()
2189 while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) { in shutdown_smi()
2193 if (smi_info->handlers) in shutdown_smi()
2195 while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) { in shutdown_smi()
2199 if (smi_info->handlers) in shutdown_smi()
2200 smi_info->handlers->cleanup(smi_info->si_sm); in shutdown_smi()
2202 if (smi_info->io.io_cleanup) { in shutdown_smi()
2203 smi_info->io.io_cleanup(&smi_info->io); in shutdown_smi()
2204 smi_info->io.io_cleanup = NULL; in shutdown_smi()
2207 kfree(smi_info->si_sm); in shutdown_smi()
2208 smi_info->si_sm = NULL; in shutdown_smi()
2210 smi_info->intf = NULL; in shutdown_smi()
2215 * smi_info->intf check.
2222 list_del(&smi_info->link); in cleanup_one_si()
2224 if (smi_info->intf) in cleanup_one_si()
2225 ipmi_unregister_smi(smi_info->intf); in cleanup_one_si()
2236 if (e->io.dev == dev) { in ipmi_si_remove_by_dev()
2253 if (e->io.addr_space != addr_space) in ipmi_si_remove_by_data()
2255 if (e->io.si_type != si_type) in ipmi_si_remove_by_data()
2257 if (e->io.addr_data == addr) { in ipmi_si_remove_by_data()
2258 dev = get_device(e->io.dev); in ipmi_si_remove_by_data()
2290 MODULE_ALIAS("platform:dmi-ipmi-si");
2293 MODULE_DESCRIPTION("Interface to the IPMI driver for the KCS, SMIC, and BT system interfaces.");