/* * Special call, doesn't claim any locks. This is only to be called * at panic or halt time, in run-to-completion mode, when the caller * is the only CPU and the only thing that will be going is these IPMI * calls. */ static void panic_halt_ipmi_set_timeout(void) { int send_heartbeat_now; int rv; /* Wait for the messages to be free. */ while (atomic_read(&panic_done_count) != 0) ipmi_poll_interface(watchdog_user); rv = i_ipmi_set_timeout(&panic_halt_smi_msg, &panic_halt_recv_msg, &send_heartbeat_now); if (!rv) { atomic_add(2, &panic_done_count); if (send_heartbeat_now) panic_halt_ipmi_heartbeat(); } else printk(KERN_WARNING PFX "Unable to extend the watchdog timeout."); while (atomic_read(&panic_done_count) != 0) ipmi_poll_interface(watchdog_user); }
/* Wait for message to complete, spinning. */ static int ipmi_request_in_rc_mode(ipmi_user_t user, struct ipmi_addr *addr, struct kernel_ipmi_msg *send_msg) { int rv; atomic_set(&dummy_count, 2); rv = ipmi_request_supply_msgs(user, addr, 0, send_msg, NULL, &halt_smi_msg, &halt_recv_msg, 0); if (rv) { atomic_set(&dummy_count, 0); return rv; } /* * Spin until our message is done. */ while (atomic_read(&dummy_count) > 0) { ipmi_poll_interface(user); cpu_relax(); } return halt_recv_msg.msg.data[0]; }