3629 goto out;
3630 }
3631
3632
3633
3634
3635
3636 run_to_completion = intf->run_to_completion;
3637 if (!run_to_completion)
3638 spin_lock_irqsave(&intf->waiting_msgs_lock, flags);
3639 if (!list_empty(&intf->waiting_msgs)) {
3640 list_add_tail(&msg->link, &intf->waiting_msgs);
3641 if (!run_to_completion)
3642 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
3643 goto out;
3644 }
3645 if (!run_to_completion)
3646 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
3647
3648 rv = handle_new_recv_msg(intf, msg);
3649 if (rv > 0) {
3650
3651
3652
3653
3654 run_to_completion = intf->run_to_completion;
3655 if (!run_to_completion)
3656 spin_lock_irqsave(&intf->waiting_msgs_lock, flags);
3657 list_add_tail(&msg->link, &intf->waiting_msgs);
3658 if (!run_to_completion)
3659 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
3660 } else if (rv == 0) {
3661 ipmi_free_smi_msg(msg);
3662 }
3663
3664 out:
3665 return;
3666}
3667EXPORT_SYMBOL(ipmi_smi_msg_received);
3668
3669void ipmi_smi_watchdog_pretimeout(ipmi_smi_t intf)