Commit 2ec7ed67 authored by dann frazier's avatar dann frazier Committed by Wim Van Sebroeck

watchdog: hpwdt (11/12): move NMI-decoding init and exit to seperate functions

Move NMI-decoding initialisation and exit code to seperate functions so that
we can ifdef-out parts of it in the future.

Also, this is for a device, so let's use dev_info instead of printk.
Signed-off-by: default avatardann frazier <dannf@hp.com>
Acked-by: default avatarThomas Mingarelli <Thomas.Mingarelli@hp.com>
Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
parent 34572b29
...@@ -653,7 +653,65 @@ static void __devinit hpwdt_check_nmi_decoding(struct pci_dev *dev) ...@@ -653,7 +653,65 @@ static void __devinit hpwdt_check_nmi_decoding(struct pci_dev *dev)
dev_warn(&dev->dev, "NMI decoding is disabled. " dev_warn(&dev->dev, "NMI decoding is disabled. "
"Your kernel does not support a NMI Watchdog.\n"); "Your kernel does not support a NMI Watchdog.\n");
} }
#endif #endif /* ARCH_HAS_NMI_WATCHDOG */
static int __devinit hpwdt_init_nmi_decoding(struct pci_dev *dev)
{
int retval;
/*
* We need to map the ROM to get the CRU service.
* For 32 bit Operating Systems we need to go through the 32 Bit
* BIOS Service Directory
* For 64 bit Operating Systems we get that service through SMBIOS.
*/
retval = detect_cru_service();
if (retval < 0) {
dev_warn(&dev->dev,
"Unable to detect the %d Bit CRU Service.\n",
HPWDT_ARCH);
return retval;
}
/*
* We know this is the only CRU call we need to make so lets keep as
* few instructions as possible once the NMI comes in.
*/
cmn_regs.u1.rah = 0x0D;
cmn_regs.u1.ral = 0x02;
/*
* If the priority is set to 1, then we will be put first on the
* die notify list to handle a critical NMI. The default is to
* be last so other users of the NMI signal can function.
*/
if (priority)
die_notifier.priority = 0x7FFFFFFF;
retval = register_die_notifier(&die_notifier);
if (retval != 0) {
dev_warn(&dev->dev,
"Unable to register a die notifier (err=%d).\n",
retval);
if (cru_rom_addr)
iounmap(cru_rom_addr);
}
dev_info(&dev->dev,
"HP Watchdog Timer Driver: NMI decoding initialized"
", allow kernel dump: %s (default = 0/OFF)"
", priority: %s (default = 0/LAST).\n",
(allow_kdump == 0) ? "OFF" : "ON",
(priority == 0) ? "LAST" : "FIRST");
return 0;
}
static void __devexit hpwdt_exit_nmi_decoding(void)
{
unregister_die_notifier(&die_notifier);
if (cru_rom_addr)
iounmap(cru_rom_addr);
}
static int __devinit hpwdt_init_one(struct pci_dev *dev, static int __devinit hpwdt_init_one(struct pci_dev *dev,
const struct pci_device_id *ent) const struct pci_device_id *ent)
...@@ -697,42 +755,10 @@ static int __devinit hpwdt_init_one(struct pci_dev *dev, ...@@ -697,42 +755,10 @@ static int __devinit hpwdt_init_one(struct pci_dev *dev,
if (hpwdt_change_timer(soft_margin)) if (hpwdt_change_timer(soft_margin))
hpwdt_change_timer(DEFAULT_MARGIN); hpwdt_change_timer(DEFAULT_MARGIN);
/* /* Initialize NMI Decoding functionality */
* We need to map the ROM to get the CRU service. retval = hpwdt_init_nmi_decoding(dev);
* For 32 bit Operating Systems we need to go through the 32 Bit if (retval != 0)
* BIOS Service Directory goto error_init_nmi_decoding;
* For 64 bit Operating Systems we get that service through SMBIOS.
*/
retval = detect_cru_service();
if (retval < 0) {
dev_warn(&dev->dev,
"Unable to detect the %d Bit CRU Service.\n",
HPWDT_ARCH);
goto error_get_cru;
}
/*
* We know this is the only CRU call we need to make so lets keep as
* few instructions as possible once the NMI comes in.
*/
cmn_regs.u1.rah = 0x0D;
cmn_regs.u1.ral = 0x02;
/*
* If the priority is set to 1, then we will be put first on the
* die notify list to handle a critical NMI. The default is to
* be last so other users of the NMI signal can function.
*/
if (priority)
die_notifier.priority = 0x7FFFFFFF;
retval = register_die_notifier(&die_notifier);
if (retval != 0) {
dev_warn(&dev->dev,
"Unable to register a die notifier (err=%d).\n",
retval);
goto error_die_notifier;
}
retval = misc_register(&hpwdt_miscdev); retval = misc_register(&hpwdt_miscdev);
if (retval < 0) { if (retval < 0) {
...@@ -742,23 +768,14 @@ static int __devinit hpwdt_init_one(struct pci_dev *dev, ...@@ -742,23 +768,14 @@ static int __devinit hpwdt_init_one(struct pci_dev *dev,
goto error_misc_register; goto error_misc_register;
} }
printk(KERN_INFO dev_info(&dev->dev, "HP Watchdog Timer Driver: %s"
"hp Watchdog Timer Driver: %s" ", timer margin: %d seconds (nowayout=%d).\n",
", timer margin: %d seconds (nowayout=%d)" HPWDT_VERSION, soft_margin, nowayout);
", allow kernel dump: %s (default = 0/OFF)"
", priority: %s (default = 0/LAST).\n",
HPWDT_VERSION, soft_margin, nowayout,
(allow_kdump == 0) ? "OFF" : "ON",
(priority == 0) ? "LAST" : "FIRST");
return 0; return 0;
error_misc_register: error_misc_register:
unregister_die_notifier(&die_notifier); hpwdt_exit_nmi_decoding();
error_die_notifier: error_init_nmi_decoding:
if (cru_rom_addr)
iounmap(cru_rom_addr);
error_get_cru:
pci_iounmap(dev, pci_mem_addr); pci_iounmap(dev, pci_mem_addr);
error_pci_iomap: error_pci_iomap:
pci_disable_device(dev); pci_disable_device(dev);
...@@ -771,10 +788,7 @@ static void __devexit hpwdt_exit(struct pci_dev *dev) ...@@ -771,10 +788,7 @@ static void __devexit hpwdt_exit(struct pci_dev *dev)
hpwdt_stop(); hpwdt_stop();
misc_deregister(&hpwdt_miscdev); misc_deregister(&hpwdt_miscdev);
unregister_die_notifier(&die_notifier); hpwdt_exit_nmi_decoding();
if (cru_rom_addr)
iounmap(cru_rom_addr);
pci_iounmap(dev, pci_mem_addr); pci_iounmap(dev, pci_mem_addr);
pci_disable_device(dev); pci_disable_device(dev);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment