]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/char/ipmi/ipmi_watchdog.c
x86, nmi: Wire up NMI handlers to new routines
[karo-tx-linux.git] / drivers / char / ipmi / ipmi_watchdog.c
index 3302586655c4ac821afc90c04dceaa744bb4569c..c2917ffad2c2a311beeeaed7f8171196601d78ff 100644 (file)
@@ -65,6 +65,7 @@
  * mechanism for it at that time.
  */
 #include <asm/kdebug.h>
+#include <asm/nmi.h>
 #define HAVE_DIE_NMI
 #endif
 
@@ -1077,17 +1078,8 @@ static void ipmi_unregister_watchdog(int ipmi_intf)
 
 #ifdef HAVE_DIE_NMI
 static int
-ipmi_nmi(struct notifier_block *self, unsigned long val, void *data)
+ipmi_nmi(unsigned int val, struct pt_regs *regs)
 {
-       struct die_args *args = data;
-
-       if (val != DIE_NMIUNKNOWN)
-               return NOTIFY_OK;
-
-       /* Hack, if it's a memory or I/O error, ignore it. */
-       if (args->err & 0xc0)
-               return NOTIFY_OK;
-
        /*
         * If we get here, it's an NMI that's not a memory or I/O
         * error.  We can't truly tell if it's from IPMI or not
@@ -1097,15 +1089,15 @@ ipmi_nmi(struct notifier_block *self, unsigned long val, void *data)
 
        if (testing_nmi) {
                testing_nmi = 2;
-               return NOTIFY_STOP;
+               return NMI_HANDLED;
        }
 
        /* If we are not expecting a timeout, ignore it. */
        if (ipmi_watchdog_state == WDOG_TIMEOUT_NONE)
-               return NOTIFY_OK;
+               return NMI_DONE;
 
        if (preaction_val != WDOG_PRETIMEOUT_NMI)
-               return NOTIFY_OK;
+               return NMI_DONE;
 
        /*
         * If no one else handled the NMI, we assume it was the IPMI
@@ -1120,12 +1112,8 @@ ipmi_nmi(struct notifier_block *self, unsigned long val, void *data)
                        panic(PFX "pre-timeout");
        }
 
-       return NOTIFY_STOP;
+       return NMI_HANDLED;
 }
-
-static struct notifier_block ipmi_nmi_handler = {
-       .notifier_call = ipmi_nmi
-};
 #endif
 
 static int wdog_reboot_handler(struct notifier_block *this,
@@ -1290,7 +1278,8 @@ static void check_parms(void)
                }
        }
        if (do_nmi && !nmi_handler_registered) {
-               rv = register_die_notifier(&ipmi_nmi_handler);
+               rv = register_nmi_handler(NMI_UNKNOWN, ipmi_nmi, 0,
+                                               "ipmi");
                if (rv) {
                        printk(KERN_WARNING PFX
                               "Can't register nmi handler\n");
@@ -1298,7 +1287,7 @@ static void check_parms(void)
                } else
                        nmi_handler_registered = 1;
        } else if (!do_nmi && nmi_handler_registered) {
-               unregister_die_notifier(&ipmi_nmi_handler);
+               unregister_nmi_handler(NMI_UNKNOWN, "ipmi");
                nmi_handler_registered = 0;
        }
 #endif
@@ -1336,7 +1325,7 @@ static int __init ipmi_wdog_init(void)
        if (rv) {
 #ifdef HAVE_DIE_NMI
                if (nmi_handler_registered)
-                       unregister_die_notifier(&ipmi_nmi_handler);
+                       unregister_nmi_handler(NMI_UNKNOWN, "ipmi");
 #endif
                atomic_notifier_chain_unregister(&panic_notifier_list,
                                                 &wdog_panic_notifier);
@@ -1357,7 +1346,7 @@ static void __exit ipmi_wdog_exit(void)
 
 #ifdef HAVE_DIE_NMI
        if (nmi_handler_registered)
-               unregister_die_notifier(&ipmi_nmi_handler);
+               unregister_nmi_handler(NMI_UNKNOWN, "ipmi");
 #endif
 
        atomic_notifier_chain_unregister(&panic_notifier_list,