aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/ipmi
diff options
context:
space:
mode:
authorCorey Minyard <cminyard@mvista.com>2007-10-18 06:07:08 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-18 17:37:32 -0400
commitc45adc39156dfb0a296df218d62ba8b68cadf12e (patch)
treefd96c4475d246334b7e295e4f482af5d89422dcd /drivers/char/ipmi
parente8c44319c691dfb4a0b039b095204c040df9b01a (diff)
IPMI: don't init irq until ready
Patrick found a race at startup. Interrupts were being enabled for the IPMI interface before the driver was really ready to handle them. This could result in an oops if something was pending on the interface at startup and interrupt were already enabled (technically shouldn't happen, but need to cover for this in real life). So move the IRQ setup to the code that starts the actual IPMI processing. Signed-off-by: Corey Minyard <cminyard@mvista.com> Cc: Patrick Schoeller <Patrick.Schoeller@hp.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char/ipmi')
-rw-r--r--drivers/char/ipmi/ipmi_si_intf.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c
index c1222e98525d..e018932af795 100644
--- a/drivers/char/ipmi/ipmi_si_intf.c
+++ b/drivers/char/ipmi/ipmi_si_intf.c
@@ -1006,6 +1006,10 @@ static int smi_start_processing(void *send_info,
1006 1006
1007 new_smi->intf = intf; 1007 new_smi->intf = intf;
1008 1008
1009 /* Try to claim any interrupts. */
1010 if (new_smi->irq_setup)
1011 new_smi->irq_setup(new_smi);
1012
1009 /* Set up the timer that drives the interface. */ 1013 /* Set up the timer that drives the interface. */
1010 setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi); 1014 setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi);
1011 new_smi->last_timeout_jiffies = jiffies; 1015 new_smi->last_timeout_jiffies = jiffies;
@@ -2765,10 +2769,6 @@ static int try_smi_init(struct smi_info *new_smi)
2765 setup_oem_data_handler(new_smi); 2769 setup_oem_data_handler(new_smi);
2766 setup_xaction_handlers(new_smi); 2770 setup_xaction_handlers(new_smi);
2767 2771
2768 /* Try to claim any interrupts. */
2769 if (new_smi->irq_setup)
2770 new_smi->irq_setup(new_smi);
2771
2772 INIT_LIST_HEAD(&(new_smi->xmit_msgs)); 2772 INIT_LIST_HEAD(&(new_smi->xmit_msgs));
2773 INIT_LIST_HEAD(&(new_smi->hp_xmit_msgs)); 2773 INIT_LIST_HEAD(&(new_smi->hp_xmit_msgs));
2774 new_smi->curr_msg = NULL; 2774 new_smi->curr_msg = NULL;