X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fmisc%2Fibmasm%2Fmodule.c;h=c46da50699ba10b3960db35e8285e3a02c29ca47;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=ee29ced8784bd0b12ad4adcb8811135a3c15f818;hpb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;p=linux-2.6.git diff --git a/drivers/misc/ibmasm/module.c b/drivers/misc/ibmasm/module.c index ee29ced87..c46da5069 100644 --- a/drivers/misc/ibmasm/module.c +++ b/drivers/misc/ibmasm/module.c @@ -57,15 +57,22 @@ #include "remote.h" -static int __init ibmasm_init_one(struct pci_dev *pdev, const struct pci_device_id *id) +static int __devinit ibmasm_init_one(struct pci_dev *pdev, const struct pci_device_id *id) { - int result = -ENOMEM; + int err, result = -ENOMEM; struct service_processor *sp; + if ((err = pci_enable_device(pdev))) { + printk(KERN_ERR "%s: can't enable PCI device at %s\n", + DRIVER_NAME, pci_name(pdev)); + return err; + } + sp = kmalloc(sizeof(struct service_processor), GFP_KERNEL); if (sp == NULL) { dev_err(&pdev->dev, "Failed to allocate memory\n"); - return result; + result = -ENOMEM; + goto error_kmalloc; } memset(sp, 0, sizeof(struct service_processor)); @@ -100,7 +107,7 @@ static int __init ibmasm_init_one(struct pci_dev *pdev, const struct pci_device_ goto error_remote_queue; } - sp->lock = SPIN_LOCK_UNLOCKED; + spin_lock_init(&sp->lock); INIT_LIST_HEAD(&sp->command_queue); result = request_irq(sp->irq, ibmasm_interrupt_handler, SA_SHIRQ, sp->devname, (void*)sp); @@ -148,11 +155,13 @@ error_heartbeat: ibmasm_event_buffer_exit(sp); error_eventbuffer: kfree(sp); +error_kmalloc: + pci_disable_device(pdev); return result; } -static void __exit ibmasm_remove_one(struct pci_dev *pdev) +static void __devexit ibmasm_remove_one(struct pci_dev *pdev) { struct service_processor *sp = (struct service_processor *)pci_get_drvdata(pdev); @@ -166,6 +175,7 @@ static void __exit ibmasm_remove_one(struct pci_dev *pdev) iounmap(sp->base_address); ibmasm_event_buffer_exit(sp); kfree(sp); + pci_disable_device(pdev); } static struct pci_device_id ibmasm_pci_table[] = @@ -199,10 +209,9 @@ static int __init ibmasm_init(void) return result; } result = pci_register_driver(&ibmasm_driver); - if (result <= 0) { - pci_unregister_driver(&ibmasm_driver); + if (result) { ibmasmfs_unregister(); - return -ENODEV; + return result; } ibmasm_register_panic_notifier(); info(DRIVER_DESC " version " DRIVER_VERSION " loaded"); @@ -215,3 +224,4 @@ module_exit(ibmasm_exit); MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICENSE("GPL"); +