Commit fac6ab89 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Linus Torvalds

[PATCH] idt77252.c: add missing pci_enable_device()

Add pci_enable_device()/pci_disable_device().  In the past, drivers often
worked without this, but it is now required in order to route PCI
interrupts correctly.
Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 01af8988
...@@ -3681,18 +3681,25 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) ...@@ -3681,18 +3681,25 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
struct idt77252_dev *card; struct idt77252_dev *card;
struct atm_dev *dev; struct atm_dev *dev;
ushort revision = 0; ushort revision = 0;
int i; int i, err;
if (pci_enable_device(pcidev)) {
printk("idt77252: can't enable PCI device at %s\n", pci_name(pcidev));
return -ENODEV;
}
if (pci_read_config_word(pcidev, PCI_REVISION_ID, &revision)) { if (pci_read_config_word(pcidev, PCI_REVISION_ID, &revision)) {
printk("idt77252-%d: can't read PCI_REVISION_ID\n", index); printk("idt77252-%d: can't read PCI_REVISION_ID\n", index);
return -ENODEV; err = -ENODEV;
goto err_out_disable_pdev;
} }
card = kmalloc(sizeof(struct idt77252_dev), GFP_KERNEL); card = kmalloc(sizeof(struct idt77252_dev), GFP_KERNEL);
if (!card) { if (!card) {
printk("idt77252-%d: can't allocate private data\n", index); printk("idt77252-%d: can't allocate private data\n", index);
return -ENOMEM; err = -ENOMEM;
goto err_out_disable_pdev;
} }
memset(card, 0, sizeof(struct idt77252_dev)); memset(card, 0, sizeof(struct idt77252_dev));
...@@ -3718,23 +3725,21 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) ...@@ -3718,23 +3725,21 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
card->membase = (unsigned long) ioremap(membase, 1024); card->membase = (unsigned long) ioremap(membase, 1024);
if (!card->membase) { if (!card->membase) {
printk("%s: can't ioremap() membase\n", card->name); printk("%s: can't ioremap() membase\n", card->name);
kfree(card); err = -EIO;
return -EIO; goto err_out_free_card;
} }
if (idt77252_preset(card)) { if (idt77252_preset(card)) {
printk("%s: preset failed\n", card->name); printk("%s: preset failed\n", card->name);
iounmap((void *) card->membase); err = -EIO;
kfree(card); goto err_out_iounmap;
return -EIO;
} }
dev = atm_dev_register("idt77252", &idt77252_ops, -1, NULL); dev = atm_dev_register("idt77252", &idt77252_ops, -1, NULL);
if (!dev) { if (!dev) {
printk("%s: can't register atm device\n", card->name); printk("%s: can't register atm device\n", card->name);
iounmap((void *) card->membase); err = -EIO;
kfree(card); goto err_out_iounmap;
return -EIO;
} }
dev->dev_data = card; dev->dev_data = card;
card->atmdev = dev; card->atmdev = dev;
...@@ -3743,9 +3748,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) ...@@ -3743,9 +3748,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
suni_init(dev); suni_init(dev);
if (!dev->phy) { if (!dev->phy) {
printk("%s: can't init SUNI\n", card->name); printk("%s: can't init SUNI\n", card->name);
deinit_card(card); err = -EIO;
kfree(card); goto err_out_deinit_card;
return -EIO;
} }
#endif /* CONFIG_ATM_IDT77252_USE_SUNI */ #endif /* CONFIG_ATM_IDT77252_USE_SUNI */
...@@ -3756,9 +3760,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) ...@@ -3756,9 +3760,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
ioremap(srambase | 0x200000 | (i << 18), 4); ioremap(srambase | 0x200000 | (i << 18), 4);
if (!card->fbq[i]) { if (!card->fbq[i]) {
printk("%s: can't ioremap() FBQ%d\n", card->name, i); printk("%s: can't ioremap() FBQ%d\n", card->name, i);
deinit_card(card); err = -EIO;
kfree(card); goto err_out_deinit_card;
return -EIO;
} }
} }
...@@ -3769,9 +3772,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) ...@@ -3769,9 +3772,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
if (init_card(dev)) { if (init_card(dev)) {
printk("%s: init_card failed\n", card->name); printk("%s: init_card failed\n", card->name);
deinit_card(card); err = -EIO;
kfree(card); goto err_out_deinit_card;
return -EIO;
} }
dev->ci_range.vpi_bits = card->vpibits; dev->ci_range.vpi_bits = card->vpibits;
...@@ -3783,12 +3785,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) ...@@ -3783,12 +3785,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
if (idt77252_dev_open(card)) { if (idt77252_dev_open(card)) {
printk("%s: dev_open failed\n", card->name); printk("%s: dev_open failed\n", card->name);
err = -EIO;
if (dev->phy->stop) goto err_out_stop;
dev->phy->stop(dev);
deinit_card(card);
kfree(card);
return -EIO;
} }
*last = card; *last = card;
...@@ -3796,6 +3794,23 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) ...@@ -3796,6 +3794,23 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
index++; index++;
return 0; return 0;
err_out_stop:
if (dev->phy->stop)
dev->phy->stop(dev);
err_out_deinit_card:
deinit_card(card);
err_out_iounmap:
iounmap((void *) card->membase);
err_out_free_card:
kfree(card);
err_out_disable_pdev:
pci_disable_device(pcidev);
return err;
} }
static struct pci_device_id idt77252_pci_tbl[] = static struct pci_device_id idt77252_pci_tbl[] =
...@@ -3848,6 +3863,7 @@ static void __exit idt77252_exit(void) ...@@ -3848,6 +3863,7 @@ static void __exit idt77252_exit(void)
if (dev->phy->stop) if (dev->phy->stop)
dev->phy->stop(dev); dev->phy->stop(dev);
deinit_card(card); deinit_card(card);
pci_disable_device(card->pcidev);
kfree(card); kfree(card);
} }
......
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