diff options
author | Corey Minyard <cminyard@mvista.com> | 2016-01-06 10:32:06 -0500 |
---|---|---|
committer | Corey Minyard <cminyard@mvista.com> | 2016-03-18 08:01:23 -0400 |
commit | 21c8f9154d9b3d2d84b619c2afdb6965f9d57975 (patch) | |
tree | deab024c41de970b95229f5d552a2c456076fffb /drivers/char | |
parent | 9dffdb38d864ae89e16ff7b3a09451270736e35b (diff) |
ipmi_ssif: Fix logic around alert handling
There was a mistake in the logic, if an alert came in very quickly
it would hang the driver.
Signed-off-by: Corey Minyard <cminyard@mvista.com>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/ipmi/ipmi_ssif.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c index 5f1c3d08ba65..8b3be8b92573 100644 --- a/drivers/char/ipmi/ipmi_ssif.c +++ b/drivers/char/ipmi/ipmi_ssif.c | |||
@@ -920,23 +920,18 @@ static void msg_written_handler(struct ssif_info *ssif_info, int result, | |||
920 | msg_done_handler(ssif_info, -EIO, NULL, 0); | 920 | msg_done_handler(ssif_info, -EIO, NULL, 0); |
921 | } | 921 | } |
922 | } else { | 922 | } else { |
923 | /* Ready to request the result. */ | ||
923 | unsigned long oflags, *flags; | 924 | unsigned long oflags, *flags; |
924 | bool got_alert; | ||
925 | 925 | ||
926 | ssif_inc_stat(ssif_info, sent_messages); | 926 | ssif_inc_stat(ssif_info, sent_messages); |
927 | ssif_inc_stat(ssif_info, sent_messages_parts); | 927 | ssif_inc_stat(ssif_info, sent_messages_parts); |
928 | 928 | ||
929 | flags = ipmi_ssif_lock_cond(ssif_info, &oflags); | 929 | flags = ipmi_ssif_lock_cond(ssif_info, &oflags); |
930 | got_alert = ssif_info->got_alert; | 930 | if (ssif_info->got_alert) { |
931 | if (got_alert) { | 931 | /* The result is already ready, just start it. */ |
932 | ssif_info->got_alert = false; | 932 | ssif_info->got_alert = false; |
933 | ssif_info->waiting_alert = false; | ||
934 | } | ||
935 | |||
936 | if (got_alert) { | ||
937 | ipmi_ssif_unlock_cond(ssif_info, flags); | 933 | ipmi_ssif_unlock_cond(ssif_info, flags); |
938 | /* The alert already happened, try now. */ | 934 | start_get(ssif_info); |
939 | retry_timeout((unsigned long) ssif_info); | ||
940 | } else { | 935 | } else { |
941 | /* Wait a jiffie then request the next message */ | 936 | /* Wait a jiffie then request the next message */ |
942 | ssif_info->waiting_alert = true; | 937 | ssif_info->waiting_alert = true; |