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: dann frazier <dannf@hp.com> Acked-by: Thomas Mingarelli <Thomas.Mingarelli@hp.com> Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
This commit is contained in:
parent
34572b29dd
commit
2ec7ed67dc
|
@ -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,
|
||||||
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,
|
||||||
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)
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue