static void handle_flags(struct smi_info *smi_info) { retry: if (smi_info->msg_flags & WDT_PRE_TIMEOUT_INT) { /* Watchdog pre-timeout */ smi_inc_stat(smi_info, watchdog_pretimeouts); start_clear_flags(smi_info); smi_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT; if (smi_info->intf) ipmi_smi_watchdog_pretimeout(smi_info->intf); } else if (smi_info->msg_flags & RECEIVE_MSG_AVAIL) { /* Messages available. */ smi_info->curr_msg = alloc_msg_handle_irq(smi_info); if (!smi_info->curr_msg) return; start_getting_msg_queue(smi_info); } else if (smi_info->msg_flags & EVENT_MSG_BUFFER_FULL) { /* Events available. */ smi_info->curr_msg = alloc_msg_handle_irq(smi_info); if (!smi_info->curr_msg) return; start_getting_events(smi_info); } else if (smi_info->msg_flags & OEM_DATA_AVAIL && smi_info->oem_data_avail_handler) { if (smi_info->oem_data_avail_handler(smi_info)) goto retry; } else smi_info->si_state = SI_NORMAL; }
static void handle_flags(struct kcs_info *kcs_info) { if (kcs_info->msg_flags & WDT_PRE_TIMEOUT_INT) { /* Watchdog pre-timeout */ start_clear_flags(kcs_info); kcs_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT; spin_unlock(&(kcs_info->kcs_lock)); ipmi_smi_watchdog_pretimeout(kcs_info->intf); spin_lock(&(kcs_info->kcs_lock)); } else if (kcs_info->msg_flags & RECEIVE_MSG_AVAIL) { /* Messages available. */ kcs_info->curr_msg = ipmi_alloc_smi_msg(); if (!kcs_info->curr_msg) { disable_kcs_irq(kcs_info); kcs_info->kcs_state = KCS_NORMAL; return; } enable_kcs_irq(kcs_info); kcs_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); kcs_info->curr_msg->data[1] = IPMI_GET_MSG_CMD; kcs_info->curr_msg->data_size = 2; kcs_smi_handlers.start_transaction( kcs_info->kcs_sm, kcs_info->curr_msg->data, kcs_info->curr_msg->data_size); kcs_info->kcs_state = KCS_GETTING_MESSAGES; } else if (kcs_info->msg_flags & EVENT_MSG_BUFFER_FULL) { /* Events available. */ kcs_info->curr_msg = ipmi_alloc_smi_msg(); if (!kcs_info->curr_msg) { disable_kcs_irq(kcs_info); kcs_info->kcs_state = KCS_NORMAL; return; } enable_kcs_irq(kcs_info); kcs_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); kcs_info->curr_msg->data[1] = IPMI_READ_EVENT_MSG_BUFFER_CMD; kcs_info->curr_msg->data_size = 2; kcs_smi_handlers.start_transaction( kcs_info->kcs_sm, kcs_info->curr_msg->data, kcs_info->curr_msg->data_size); kcs_info->kcs_state = KCS_GETTING_EVENTS; } else { kcs_info->kcs_state = KCS_NORMAL; } }