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 static const char * const si_to_str[] = { "invalid", "kcs", "smic", "bt" };
111 /* Number of IPMI events received from the hardware. */
137 * IPMI
142 * Per-OEM handler, called from handle_flags(). Returns 1
143 * when handle_flags() needs to be re-run or 0 indicating it
198 * memory. Once that situation clears up, it will re-enable
248 atomic_inc(&(smi)->stats[SI_STAT_ ## stat])
250 ((unsigned int) atomic_read(&(smi)->stats[SI_STAT_ ## stat]))
287 ipmi_smi_msg_received(smi_info->intf, msg); in deliver_recv_msg()
292 struct ipmi_smi_msg *msg = smi_info->curr_msg; in return_hosed_msg()
299 msg->rsp[0] = msg->data[0] | 4; in return_hosed_msg()
300 msg->rsp[1] = msg->data[1]; in return_hosed_msg()
301 msg->rsp[2] = cCode; in return_hosed_msg()
302 msg->rsp_size = 3; in return_hosed_msg()
304 smi_info->curr_msg = NULL; in return_hosed_msg()
312 if (!smi_info->waiting_msg) { in start_next_msg()
313 smi_info->curr_msg = NULL; in start_next_msg()
318 smi_info->curr_msg = smi_info->waiting_msg; in start_next_msg()
319 smi_info->waiting_msg = NULL; in start_next_msg()
327 err = smi_info->handlers->start_transaction( in start_next_msg()
328 smi_info->si_sm, in start_next_msg()
329 smi_info->curr_msg->data, in start_next_msg()
330 smi_info->curr_msg->data_size); in start_next_msg()
342 if (!smi_info->timer_can_start) in smi_mod_timer()
344 smi_info->last_timeout_jiffies = jiffies; in smi_mod_timer()
345 mod_timer(&smi_info->si_timer, new_val); in smi_mod_timer()
346 smi_info->timer_running = true; in smi_mod_timer()
357 if (smi_info->thread) in start_new_msg()
358 wake_up_process(smi_info->thread); in start_new_msg()
360 smi_info->handlers->start_transaction(smi_info->si_sm, msg, size); in start_new_msg()
371 smi_info->si_state = SI_CHECKING_ENABLES; in start_check_enables()
378 /* Make sure the watchdog pre-timeout flag is not set at startup. */ in start_clear_flags()
384 smi_info->si_state = SI_CLEARING_FLAGS; in start_clear_flags()
389 smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); in start_getting_msg_queue()
390 smi_info->curr_msg->data[1] = IPMI_GET_MSG_CMD; in start_getting_msg_queue()
391 smi_info->curr_msg->data_size = 2; in start_getting_msg_queue()
393 start_new_msg(smi_info, smi_info->curr_msg->data, in start_getting_msg_queue()
394 smi_info->curr_msg->data_size); in start_getting_msg_queue()
395 smi_info->si_state = SI_GETTING_MESSAGES; in start_getting_msg_queue()
400 smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); in start_getting_events()
401 smi_info->curr_msg->data[1] = IPMI_READ_EVENT_MSG_BUFFER_CMD; in start_getting_events()
402 smi_info->curr_msg->data_size = 2; in start_getting_events()
404 start_new_msg(smi_info, smi_info->curr_msg->data, in start_getting_events()
405 smi_info->curr_msg->data_size); in start_getting_events()
406 smi_info->si_state = SI_GETTING_EVENTS; in start_getting_events()
413 * memory, we will re-enable the interrupt.
420 if ((smi_info->io.irq) && (!smi_info->interrupt_disabled)) { in disable_si_irq()
421 smi_info->interrupt_disabled = true; in disable_si_irq()
430 if ((smi_info->io.irq) && (smi_info->interrupt_disabled)) { in enable_si_irq()
431 smi_info->interrupt_disabled = false; in enable_si_irq()
451 smi_info->si_state = SI_NORMAL; in alloc_msg_handle_irq()
462 if (smi_info->msg_flags & WDT_PRE_TIMEOUT_INT) { in handle_flags()
463 /* Watchdog pre-timeout */ in handle_flags()
467 smi_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT; in handle_flags()
468 ipmi_smi_watchdog_pretimeout(smi_info->intf); in handle_flags()
469 } else if (smi_info->msg_flags & RECEIVE_MSG_AVAIL) { in handle_flags()
471 smi_info->curr_msg = alloc_msg_handle_irq(smi_info); in handle_flags()
472 if (!smi_info->curr_msg) in handle_flags()
476 } else if (smi_info->msg_flags & EVENT_MSG_BUFFER_FULL) { in handle_flags()
478 smi_info->curr_msg = alloc_msg_handle_irq(smi_info); in handle_flags()
479 if (!smi_info->curr_msg) in handle_flags()
483 } else if (smi_info->msg_flags & OEM_DATA_AVAIL && in handle_flags()
484 smi_info->oem_data_avail_handler) { in handle_flags()
485 if (smi_info->oem_data_avail_handler(smi_info)) in handle_flags()
488 smi_info->si_state = SI_NORMAL; in handle_flags()
502 if (smi_info->supports_event_msg_buff) in current_global_enables()
505 if (((smi_info->io.irq && !smi_info->interrupt_disabled) || in current_global_enables()
506 smi_info->cannot_disable_irq) && in current_global_enables()
507 !smi_info->irq_enable_broken) in current_global_enables()
510 if (smi_info->supports_event_msg_buff && in current_global_enables()
511 smi_info->io.irq && !smi_info->interrupt_disabled && in current_global_enables()
512 !smi_info->irq_enable_broken) in current_global_enables()
522 u8 irqstate = smi_info->io.inputb(&smi_info->io, IPMI_BT_INTMASK_REG); in check_bt_irq()
530 smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG, in check_bt_irq()
533 smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG, 0); in check_bt_irq()
541 switch (smi_info->si_state) { in handle_transaction_done()
543 if (!smi_info->curr_msg) in handle_transaction_done()
546 smi_info->curr_msg->rsp_size in handle_transaction_done()
547 = smi_info->handlers->get_result( in handle_transaction_done()
548 smi_info->si_sm, in handle_transaction_done()
549 smi_info->curr_msg->rsp, in handle_transaction_done()
557 msg = smi_info->curr_msg; in handle_transaction_done()
558 smi_info->curr_msg = NULL; in handle_transaction_done()
568 len = smi_info->handlers->get_result(smi_info->si_sm, msg, 4); in handle_transaction_done()
571 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
577 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
579 smi_info->msg_flags = msg[3]; in handle_transaction_done()
590 smi_info->handlers->get_result(smi_info->si_sm, msg, 3); in handle_transaction_done()
593 dev_warn(smi_info->io.dev, in handle_transaction_done()
596 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
602 smi_info->curr_msg->rsp_size in handle_transaction_done()
603 = smi_info->handlers->get_result( in handle_transaction_done()
604 smi_info->si_sm, in handle_transaction_done()
605 smi_info->curr_msg->rsp, in handle_transaction_done()
613 msg = smi_info->curr_msg; in handle_transaction_done()
614 smi_info->curr_msg = NULL; in handle_transaction_done()
615 if (msg->rsp[2] != 0) { in handle_transaction_done()
617 msg->done(msg); in handle_transaction_done()
620 smi_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; in handle_transaction_done()
640 smi_info->curr_msg->rsp_size in handle_transaction_done()
641 = smi_info->handlers->get_result( in handle_transaction_done()
642 smi_info->si_sm, in handle_transaction_done()
643 smi_info->curr_msg->rsp, in handle_transaction_done()
651 msg = smi_info->curr_msg; in handle_transaction_done()
652 smi_info->curr_msg = NULL; in handle_transaction_done()
653 if (msg->rsp[2] != 0) { in handle_transaction_done()
655 msg->done(msg); in handle_transaction_done()
658 smi_info->msg_flags &= ~RECEIVE_MSG_AVAIL; in handle_transaction_done()
683 smi_info->handlers->get_result(smi_info->si_sm, msg, 4); in handle_transaction_done()
685 dev_warn(smi_info->io.dev, in handle_transaction_done()
687 dev_warn(smi_info->io.dev, in handle_transaction_done()
688 "Maybe ok, but ipmi might run very slowly.\n"); in handle_transaction_done()
689 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
693 if (smi_info->io.si_type == SI_BT) in handle_transaction_done()
694 /* BT has its own interrupt enable bit. */ in handle_transaction_done()
701 smi_info->handlers->start_transaction( in handle_transaction_done()
702 smi_info->si_sm, msg, 3); in handle_transaction_done()
703 smi_info->si_state = SI_SETTING_ENABLES; in handle_transaction_done()
704 } else if (smi_info->supports_event_msg_buff) { in handle_transaction_done()
705 smi_info->curr_msg = ipmi_alloc_smi_msg(); in handle_transaction_done()
706 if (!smi_info->curr_msg) { in handle_transaction_done()
707 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
712 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
721 smi_info->handlers->get_result(smi_info->si_sm, msg, 4); in handle_transaction_done()
723 dev_warn(smi_info->io.dev, in handle_transaction_done()
727 if (smi_info->supports_event_msg_buff) { in handle_transaction_done()
728 smi_info->curr_msg = ipmi_alloc_smi_msg(); in handle_transaction_done()
729 if (!smi_info->curr_msg) { in handle_transaction_done()
730 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
735 smi_info->si_state = SI_NORMAL; in handle_transaction_done()
761 si_sm_result = smi_info->handlers->event(smi_info->si_sm, time); in smi_event_handler()
764 si_sm_result = smi_info->handlers->event(smi_info->si_sm, 0); in smi_event_handler()
778 smi_info->si_state = SI_NORMAL; in smi_event_handler()
779 if (smi_info->curr_msg != NULL) { in smi_event_handler()
794 if (si_sm_result == SI_SM_ATTN || smi_info->got_attn) { in smi_event_handler()
797 if (smi_info->si_state != SI_NORMAL) { in smi_event_handler()
802 smi_info->got_attn = true; in smi_event_handler()
804 smi_info->got_attn = false; in smi_event_handler()
818 smi_info->si_state = SI_GETTING_FLAGS; in smi_event_handler()
833 && (atomic_read(&smi_info->req_events))) { in smi_event_handler()
838 atomic_set(&smi_info->req_events, 0); in smi_event_handler()
846 if (smi_info->supports_event_msg_buff || smi_info->io.irq) { in smi_event_handler()
849 smi_info->curr_msg = alloc_msg_handle_irq(smi_info); in smi_event_handler()
850 if (!smi_info->curr_msg) in smi_event_handler()
858 if (si_sm_result == SI_SM_IDLE && smi_info->timer_running) { in smi_event_handler()
860 if (del_timer(&smi_info->si_timer)) in smi_event_handler()
861 smi_info->timer_running = false; in smi_event_handler()
870 if (smi_info->si_state == SI_NORMAL && smi_info->curr_msg == NULL) { in check_start_timer_thread()
873 if (smi_info->thread) in check_start_timer_thread()
874 wake_up_process(smi_info->thread); in check_start_timer_thread()
887 * Currently, this function is called only in run-to-completion in flush_messages()
888 * mode. This means we are single-threaded, no need for locks. in flush_messages()
905 if (smi_info->run_to_completion) { in sender()
910 smi_info->waiting_msg = msg; in sender()
914 spin_lock_irqsave(&smi_info->si_lock, flags); in sender()
922 BUG_ON(smi_info->waiting_msg); in sender()
923 smi_info->waiting_msg = msg; in sender()
925 spin_unlock_irqrestore(&smi_info->si_lock, flags); in sender()
932 smi_info->run_to_completion = i_run_to_completion; in set_run_to_completion()
938 * Use -1 as a special constant to tell that we are spinning in kipmid
941 #define IPMI_TIME_NOT_BUSY ns_to_ktime(-1ull)
948 if (smi_info->si_num < num_max_busy_us) in ipmi_thread_busy_wait()
949 max_busy_us = kipmid_max_busy_us[smi_info->si_num]; in ipmi_thread_busy_wait()
965 * A busy-waiting loop for speeding up IPMI operation.
968 * that are not BT and do not have interrupts. It starts spinning
971 * Documentation/driver-api/ipmi.rst for details.
984 spin_lock_irqsave(&(smi_info->si_lock), flags); in ipmi_thread()
994 if (smi_result != SI_SM_IDLE && !smi_info->timer_running) in ipmi_thread()
997 spin_unlock_irqrestore(&(smi_info->si_lock), flags); in ipmi_thread()
1009 if (smi_info->in_maintenance_mode) in ipmi_thread()
1014 if (atomic_read(&smi_info->need_watch)) { in ipmi_thread()
1033 bool run_to_completion = smi_info->run_to_completion; in poll()
1041 spin_lock_irqsave(&smi_info->si_lock, flags); in poll()
1044 spin_unlock_irqrestore(&smi_info->si_lock, flags); in poll()
1051 if (!smi_info->has_event_buffer) in request_events()
1054 atomic_set(&smi_info->req_events, 1); in request_events()
1065 atomic_set(&smi_info->need_watch, enable); in set_need_watch()
1066 spin_lock_irqsave(&smi_info->si_lock, flags); in set_need_watch()
1068 spin_unlock_irqrestore(&smi_info->si_lock, flags); in set_need_watch()
1080 spin_lock_irqsave(&(smi_info->si_lock), flags); in smi_timeout()
1084 time_diff = (((long)jiffies_now - (long)smi_info->last_timeout_jiffies) in smi_timeout()
1088 if ((smi_info->io.irq) && (!smi_info->interrupt_disabled)) { in smi_timeout()
1111 smi_info->timer_running = false; in smi_timeout()
1112 spin_unlock_irqrestore(&(smi_info->si_lock), flags); in smi_timeout()
1120 if (smi_info->io.si_type == SI_BT) in ipmi_si_irq_handler()
1121 /* We need to clear the IRQ flag for the BT interface. */ in ipmi_si_irq_handler()
1122 smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG, in ipmi_si_irq_handler()
1126 spin_lock_irqsave(&(smi_info->si_lock), flags); in ipmi_si_irq_handler()
1133 spin_unlock_irqrestore(&(smi_info->si_lock), flags); in ipmi_si_irq_handler()
1143 new_smi->intf = intf; in smi_start_processing()
1146 timer_setup(&new_smi->si_timer, smi_timeout, 0); in smi_start_processing()
1147 new_smi->timer_can_start = true; in smi_start_processing()
1151 if (new_smi->io.irq_setup) { in smi_start_processing()
1152 new_smi->io.irq_handler_data = new_smi; in smi_start_processing()
1153 new_smi->io.irq_setup(&new_smi->io); in smi_start_processing()
1159 if (new_smi->si_num < num_force_kipmid) in smi_start_processing()
1160 enable = force_kipmid[new_smi->si_num]; in smi_start_processing()
1162 * The BT interface is efficient enough to not need a thread, in smi_start_processing()
1165 else if ((new_smi->io.si_type != SI_BT) && (!new_smi->io.irq)) in smi_start_processing()
1169 new_smi->thread = kthread_run(ipmi_thread, new_smi, in smi_start_processing()
1170 "kipmi%d", new_smi->si_num); in smi_start_processing()
1171 if (IS_ERR(new_smi->thread)) { in smi_start_processing()
1172 dev_notice(new_smi->io.dev, "Could not start" 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 " disabled(0). Normally the IPMI driver auto-detects"
1235 "Max time (in microseconds) to busy-wait for IPMI data before"
1236 " sleeping. 0 (default) means to wait forever. Set to 100-500"
1241 if (io->si_type == SI_BT) in ipmi_irq_finish_setup()
1242 /* Enable the interrupt in the BT interface. */ in ipmi_irq_finish_setup()
1243 io->outputb(io, IPMI_BT_INTMASK_REG, in ipmi_irq_finish_setup()
1249 if (io->si_type == SI_BT) in ipmi_irq_start_cleanup()
1250 /* Disable the interrupt in the BT interface. */ in ipmi_irq_start_cleanup()
1251 io->outputb(io, IPMI_BT_INTMASK_REG, 0); in ipmi_irq_start_cleanup()
1257 free_irq(io->irq, io->irq_handler_data); in std_irq_cleanup()
1264 if (!io->irq) in ipmi_std_irq_setup()
1267 rv = request_irq(io->irq, in ipmi_std_irq_setup()
1271 io->irq_handler_data); in ipmi_std_irq_setup()
1273 dev_warn(io->dev, "%s unable to claim interrupt %d," in ipmi_std_irq_setup()
1275 SI_DEVICE_NAME, io->irq); in ipmi_std_irq_setup()
1276 io->irq = 0; in ipmi_std_irq_setup()
1278 io->irq_cleanup = std_irq_cleanup; in ipmi_std_irq_setup()
1280 dev_info(io->dev, "Using irq %d\n", io->irq); in ipmi_std_irq_setup()
1290 smi_result = smi_info->handlers->event(smi_info->si_sm, 0); in wait_for_msg_done()
1295 smi_result = smi_info->handlers->event( in wait_for_msg_done()
1296 smi_info->si_sm, jiffies_to_usecs(1)); in wait_for_msg_done()
1298 smi_result = smi_info->handlers->event( in wait_for_msg_done()
1299 smi_info->si_sm, 0); in wait_for_msg_done()
1306 * the port is probably not an IPMI SMI interface. in wait_for_msg_done()
1308 return -ENODEV; in wait_for_msg_done()
1323 return -ENOMEM; in try_get_dev_id()
1333 smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); in try_get_dev_id()
1339 resp_len = smi_info->handlers->get_result(smi_info->si_sm, in try_get_dev_id()
1344 resp + 2, resp_len - 2, &smi_info->device_id); in try_get_dev_id()
1353 dev_warn(smi_info->io.dev, in try_get_dev_id()
1374 return -ENOMEM; in get_global_enables()
1378 smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); in get_global_enables()
1382 dev_warn(smi_info->io.dev, in get_global_enables()
1388 resp_len = smi_info->handlers->get_result(smi_info->si_sm, in get_global_enables()
1395 dev_warn(smi_info->io.dev, in get_global_enables()
1398 rv = -EINVAL; in get_global_enables()
1421 return -ENOMEM; in set_global_enables()
1426 smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3); in set_global_enables()
1430 dev_warn(smi_info->io.dev, in set_global_enables()
1436 resp_len = smi_info->handlers->get_result(smi_info->si_sm, in set_global_enables()
1442 dev_warn(smi_info->io.dev, in set_global_enables()
1445 rv = -EINVAL; in set_global_enables()
1478 dev_err(smi_info->io.dev, in check_clr_rcv_irq()
1488 dev_warn(smi_info->io.dev, in check_clr_rcv_irq()
1490 smi_info->cannot_disable_irq = true; in check_clr_rcv_irq()
1504 if (!smi_info->io.irq) in check_set_rcv_irq()
1514 dev_err(smi_info->io.dev, in check_set_rcv_irq()
1524 dev_warn(smi_info->io.dev, in check_set_rcv_irq()
1526 smi_info->cannot_disable_irq = true; in check_set_rcv_irq()
1527 smi_info->irq_enable_broken = true; in check_set_rcv_irq()
1540 return -ENOMEM; in try_enable_event_buffer()
1544 smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); in try_enable_event_buffer()
1552 resp_len = smi_info->handlers->get_result(smi_info->si_sm, in try_enable_event_buffer()
1560 rv = -EINVAL; in try_enable_event_buffer()
1566 smi_info->supports_event_msg_buff = true; in try_enable_event_buffer()
1573 smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3); in try_enable_event_buffer()
1581 resp_len = smi_info->handlers->get_result(smi_info->si_sm, in try_enable_event_buffer()
1588 rv = -EINVAL; in try_enable_event_buffer()
1597 rv = -ENOENT; in try_enable_event_buffer()
1599 smi_info->supports_event_msg_buff = true; in try_enable_event_buffer()
1623 return snprintf(buf, 10, "%s\n", si_to_str[smi_info->io.si_type]); in type_show()
1632 int enabled = smi_info->io.irq && !smi_info->interrupt_disabled; in interrupts_enabled_show()
1659 si_to_str[smi_info->io.si_type], in params_show()
1660 addr_space_to_str[smi_info->io.addr_space], in params_show()
1661 smi_info->io.addr_data, in params_show()
1662 smi_info->io.regspacing, in params_show()
1663 smi_info->io.regsize, in params_show()
1664 smi_info->io.regshift, in params_show()
1665 smi_info->io.irq, in params_show()
1666 smi_info->io.slave_addr); in params_show()
1694 * @info - smi_info structure with msg_flags set
1697 * Returns 1 indicating need to re-run handle_flags().
1701 smi_info->msg_flags = ((smi_info->msg_flags & ~OEM_DATA_AVAIL) | in oem_data_avail_to_receive_msg_avail()
1708 * @info - smi_info.device_id must be populated
1712 * it's safe to do so. Such systems will de-assert OEM1_DATA_AVAIL
1716 * As Dell has no plans to release IPMI 1.5 firmware that *ever*
1724 * IPMI Version = 0x51 IPMI 1.5
1727 * Additionally, PowerEdge systems with IPMI < 1.5 may also assert
1737 struct ipmi_device_id *id = &smi_info->device_id; in setup_dell_poweredge_oem_data_handler()
1738 if (id->manufacturer_id == DELL_IANA_MFR_ID) { in setup_dell_poweredge_oem_data_handler()
1739 if (id->device_id == DELL_POWEREDGE_8G_BMC_DEVICE_ID && in setup_dell_poweredge_oem_data_handler()
1740 id->device_revision == DELL_POWEREDGE_8G_BMC_DEVICE_REV && in setup_dell_poweredge_oem_data_handler()
1741 id->ipmi_version == DELL_POWEREDGE_8G_BMC_IPMI_VERSION) { in setup_dell_poweredge_oem_data_handler()
1742 smi_info->oem_data_avail_handler = in setup_dell_poweredge_oem_data_handler()
1747 smi_info->oem_data_avail_handler = in setup_dell_poweredge_oem_data_handler()
1756 struct ipmi_smi_msg *msg = smi_info->curr_msg; in return_hosed_msg_badsize()
1759 msg->rsp[0] = msg->data[0] | 4; in return_hosed_msg_badsize()
1760 msg->rsp[1] = msg->data[1]; in return_hosed_msg_badsize()
1761 msg->rsp[2] = CANNOT_RETURN_REQUESTED_LENGTH; in return_hosed_msg_badsize()
1762 msg->rsp_size = 3; in return_hosed_msg_badsize()
1763 smi_info->curr_msg = NULL; in return_hosed_msg_badsize()
1769 * @info - smi_info.device_id must be populated
1771 * Dell PowerEdge servers with the BT interface (x6xx and 1750) will
1775 * callers to try again with a different-sized buffer, which succeeds.
1785 unsigned char *data = smi_info->curr_msg->data; in dell_poweredge_bt_xaction_handler()
1786 unsigned int size = smi_info->curr_msg->data_size; in dell_poweredge_bt_xaction_handler()
1803 * @info - smi_info.device_id must be filled in already
1811 struct ipmi_device_id *id = &smi_info->device_id; in setup_dell_poweredge_bt_xaction_handler()
1812 if (id->manufacturer_id == DELL_IANA_MFR_ID && in setup_dell_poweredge_bt_xaction_handler()
1813 smi_info->io.si_type == SI_BT) in setup_dell_poweredge_bt_xaction_handler()
1819 * @info - smi_info.device_id must be filled in already
1843 if (smi_info->thread != NULL) { in stop_timer_and_thread()
1844 kthread_stop(smi_info->thread); in stop_timer_and_thread()
1845 smi_info->thread = NULL; in stop_timer_and_thread()
1848 smi_info->timer_can_start = false; in stop_timer_and_thread()
1849 del_timer_sync(&smi_info->si_timer); in stop_timer_and_thread()
1857 if (e->io.addr_space != info->io.addr_space) in find_dup_si()
1859 if (e->io.addr_data == info->io.addr_data) { in find_dup_si()
1865 if (info->io.slave_addr && !e->io.slave_addr) in find_dup_si()
1866 e->io.slave_addr = info->io.slave_addr; in find_dup_si()
1880 * If the user gave us a hard-coded device at the same in ipmi_si_add_smi()
1884 if (io->addr_source != SI_HARDCODED && io->addr_source != SI_HOTMOD && in ipmi_si_add_smi()
1885 ipmi_si_hardcode_match(io->addr_space, io->addr_data)) { in ipmi_si_add_smi()
1886 dev_info(io->dev, in ipmi_si_add_smi()
1887 "Hard-coded device at this address already exists"); in ipmi_si_add_smi()
1888 return -ENODEV; in ipmi_si_add_smi()
1891 if (!io->io_setup) { in ipmi_si_add_smi()
1892 if (io->addr_space == IPMI_IO_ADDR_SPACE) { in ipmi_si_add_smi()
1893 io->io_setup = ipmi_si_port_setup; in ipmi_si_add_smi()
1894 } else if (io->addr_space == IPMI_MEM_ADDR_SPACE) { in ipmi_si_add_smi()
1895 io->io_setup = ipmi_si_mem_setup; in ipmi_si_add_smi()
1897 return -EINVAL; in ipmi_si_add_smi()
1903 return -ENOMEM; in ipmi_si_add_smi()
1904 spin_lock_init(&new_smi->si_lock); in ipmi_si_add_smi()
1906 new_smi->io = *io; in ipmi_si_add_smi()
1911 if (new_smi->io.addr_source == SI_ACPI && in ipmi_si_add_smi()
1912 dup->io.addr_source == SI_SMBIOS) { in ipmi_si_add_smi()
1914 dev_info(dup->io.dev, in ipmi_si_add_smi()
1915 "Removing SMBIOS-specified %s state machine in favor of ACPI\n", in ipmi_si_add_smi()
1916 si_to_str[new_smi->io.si_type]); in ipmi_si_add_smi()
1919 dev_info(new_smi->io.dev, in ipmi_si_add_smi()
1920 "%s-specified %s state machine: duplicate\n", in ipmi_si_add_smi()
1921 ipmi_addr_src_to_str(new_smi->io.addr_source), in ipmi_si_add_smi()
1922 si_to_str[new_smi->io.si_type]); in ipmi_si_add_smi()
1923 rv = -EBUSY; in ipmi_si_add_smi()
1929 pr_info("Adding %s-specified %s state machine\n", in ipmi_si_add_smi()
1930 ipmi_addr_src_to_str(new_smi->io.addr_source), in ipmi_si_add_smi()
1931 si_to_str[new_smi->io.si_type]); in ipmi_si_add_smi()
1933 list_add_tail(&new_smi->link, &smi_infos); in ipmi_si_add_smi()
1952 pr_info("Trying %s-specified %s state machine at %s address 0x%lx, slave address 0x%x, irq %d\n", in try_smi_init()
1953 ipmi_addr_src_to_str(new_smi->io.addr_source), in try_smi_init()
1954 si_to_str[new_smi->io.si_type], in try_smi_init()
1955 addr_space_to_str[new_smi->io.addr_space], in try_smi_init()
1956 new_smi->io.addr_data, in try_smi_init()
1957 new_smi->io.slave_addr, new_smi->io.irq); in try_smi_init()
1959 switch (new_smi->io.si_type) { in try_smi_init()
1961 new_smi->handlers = &kcs_smi_handlers; in try_smi_init()
1965 new_smi->handlers = &smic_smi_handlers; in try_smi_init()
1969 new_smi->handlers = &bt_smi_handlers; in try_smi_init()
1974 rv = -EIO; in try_smi_init()
1978 new_smi->si_num = smi_num; in try_smi_init()
1981 if (!new_smi->io.dev) { in try_smi_init()
1982 pr_err("IPMI interface added with no device\n"); in try_smi_init()
1983 rv = -EIO; in try_smi_init()
1988 new_smi->si_sm = kmalloc(new_smi->handlers->size(), GFP_KERNEL); in try_smi_init()
1989 if (!new_smi->si_sm) { in try_smi_init()
1990 rv = -ENOMEM; in try_smi_init()
1993 new_smi->io.io_size = new_smi->handlers->init_data(new_smi->si_sm, in try_smi_init()
1994 &new_smi->io); in try_smi_init()
1997 rv = new_smi->io.io_setup(&new_smi->io); in try_smi_init()
1999 dev_err(new_smi->io.dev, "Could not set up I/O space\n"); in try_smi_init()
2003 /* Do low-level detection first. */ in try_smi_init()
2004 if (new_smi->handlers->detect(new_smi->si_sm)) { in try_smi_init()
2005 if (new_smi->io.addr_source) in try_smi_init()
2006 dev_err(new_smi->io.dev, in try_smi_init()
2008 rv = -ENODEV; in try_smi_init()
2018 if (new_smi->io.addr_source) in try_smi_init()
2019 dev_err(new_smi->io.dev, in try_smi_init()
2028 new_smi->waiting_msg = NULL; in try_smi_init()
2029 new_smi->curr_msg = NULL; in try_smi_init()
2030 atomic_set(&new_smi->req_events, 0); in try_smi_init()
2031 new_smi->run_to_completion = false; in try_smi_init()
2033 atomic_set(&new_smi->stats[i], 0); in try_smi_init()
2035 new_smi->interrupt_disabled = true; in try_smi_init()
2036 atomic_set(&new_smi->need_watch, 0); in try_smi_init()
2040 new_smi->has_event_buffer = true; in try_smi_init()
2049 * IRQ is defined to be set when non-zero. req_events will in try_smi_init()
2052 if (new_smi->io.irq) { in try_smi_init()
2053 new_smi->interrupt_disabled = false; in try_smi_init()
2054 atomic_set(&new_smi->req_events, 1); in try_smi_init()
2057 dev_set_drvdata(new_smi->io.dev, new_smi); in try_smi_init()
2058 rv = device_add_group(new_smi->io.dev, &ipmi_si_dev_attr_group); in try_smi_init()
2060 dev_err(new_smi->io.dev, in try_smi_init()
2065 new_smi->dev_group_added = true; in try_smi_init()
2069 new_smi->io.dev, in try_smi_init()
2070 new_smi->io.slave_addr); in try_smi_init()
2072 dev_err(new_smi->io.dev, in try_smi_init()
2081 dev_info(new_smi->io.dev, "IPMI %s interface initialized\n", in try_smi_init()
2082 si_to_str[new_smi->io.si_type]); in try_smi_init()
2084 WARN_ON(new_smi->io.dev->init_name != NULL); in try_smi_init()
2087 if (rv && new_smi->io.io_cleanup) { in try_smi_init()
2088 new_smi->io.io_cleanup(&new_smi->io); in try_smi_init()
2089 new_smi->io.io_cleanup = NULL; in try_smi_init()
2105 pr_info("IPMI System Interface driver\n"); in init_ipmi_si()
2122 if (e->io.irq && (!type || e->io.addr_source == type)) { in init_ipmi_si()
2124 type = e->io.addr_source; in init_ipmi_si()
2136 if (!e->io.irq && (!type || e->io.addr_source == type)) { in init_ipmi_si()
2138 type = e->io.addr_source; in init_ipmi_si()
2155 return -ENODEV; in init_ipmi_si()
2167 if (smi_info->dev_group_added) { in shutdown_smi()
2168 device_remove_group(smi_info->io.dev, &ipmi_si_dev_attr_group); in shutdown_smi()
2169 smi_info->dev_group_added = false; in shutdown_smi()
2171 if (smi_info->io.dev) in shutdown_smi()
2172 dev_set_drvdata(smi_info->io.dev, NULL); in shutdown_smi()
2178 smi_info->interrupt_disabled = true; in shutdown_smi()
2179 if (smi_info->io.irq_cleanup) { in shutdown_smi()
2180 smi_info->io.irq_cleanup(&smi_info->io); in shutdown_smi()
2181 smi_info->io.irq_cleanup = NULL; in shutdown_smi()
2197 while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) { in shutdown_smi()
2201 if (smi_info->handlers) in shutdown_smi()
2203 while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) { in shutdown_smi()
2207 if (smi_info->handlers) in shutdown_smi()
2208 smi_info->handlers->cleanup(smi_info->si_sm); in shutdown_smi()
2210 if (smi_info->io.addr_source_cleanup) { in shutdown_smi()
2211 smi_info->io.addr_source_cleanup(&smi_info->io); in shutdown_smi()
2212 smi_info->io.addr_source_cleanup = NULL; in shutdown_smi()
2214 if (smi_info->io.io_cleanup) { in shutdown_smi()
2215 smi_info->io.io_cleanup(&smi_info->io); in shutdown_smi()
2216 smi_info->io.io_cleanup = NULL; in shutdown_smi()
2219 kfree(smi_info->si_sm); in shutdown_smi()
2220 smi_info->si_sm = NULL; in shutdown_smi()
2222 smi_info->intf = NULL; in shutdown_smi()
2227 * smi_info->intf check.
2234 list_del(&smi_info->link); in cleanup_one_si()
2236 if (smi_info->intf) in cleanup_one_si()
2237 ipmi_unregister_smi(smi_info->intf); in cleanup_one_si()
2245 int rv = -ENOENT; in ipmi_si_remove_by_dev()
2249 if (e->io.dev == dev) { in ipmi_si_remove_by_dev()
2269 if (e->io.addr_space != addr_space) in ipmi_si_remove_by_data()
2271 if (e->io.si_type != si_type) in ipmi_si_remove_by_data()
2273 if (e->io.addr_data == addr) { in ipmi_si_remove_by_data()
2274 dev = get_device(e->io.dev); in ipmi_si_remove_by_data()
2306 MODULE_ALIAS("platform:dmi-ipmi-si");
2309 MODULE_DESCRIPTION("Interface to the IPMI driver for the KCS, SMIC, and BT"