Skip to content

Commit

Permalink
pcmcia: vrc4173_cardu: Fix error path for pci_release_regions and pci…
Browse files Browse the repository at this point in the history
…_disable_device

- pci_release_regions called during return error path.
- pci_disable_device called for cases where earlier it was enabled.
- code duplication avoided/reduced by adding resource release at goto statements.

Signed-off-by: Rahul Ruikar <rahul.ruikar@gmail.com>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
  • Loading branch information
Rahul Ruikar authored and Dominik Brodowski committed Oct 5, 2010
1 parent 1c4a77b commit 1ab488d
Showing 1 changed file with 39 additions and 19 deletions.
58 changes: 39 additions & 19 deletions drivers/pcmcia/vrc4173_cardu.c
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,7 @@ static int __devinit vrc4173_cardu_probe(struct pci_dev *dev,
{
vrc4173_socket_t *socket;
unsigned long start, len, flags;
int slot, err;
int slot, err, ret;

slot = vrc4173_cardu_slots++;
socket = &cardu_sockets[slot];
Expand All @@ -474,43 +474,63 @@ static int __devinit vrc4173_cardu_probe(struct pci_dev *dev,
return err;

start = pci_resource_start(dev, 0);
if (start == 0)
return -ENODEV;
if (start == 0) {
ret = -ENODEV;
goto disable;
}

len = pci_resource_len(dev, 0);
if (len == 0)
return -ENODEV;
if (len == 0) {
ret = -ENODEV;
goto disable;
}

if (((flags = pci_resource_flags(dev, 0)) & IORESOURCE_MEM) == 0)
return -EBUSY;
flags = pci_resource_flags(dev, 0);
if ((flags & IORESOURCE_MEM) == 0) {
ret = -EBUSY;
goto disable;
}

if ((err = pci_request_regions(dev, socket->name)) < 0)
return err;
err = pci_request_regions(dev, socket->name);
if (err < 0) {
ret = err;
goto disable;
}

socket->base = ioremap(start, len);
if (socket->base == NULL)
return -ENODEV;
if (socket->base == NULL) {
ret = -ENODEV;
goto release;
}

socket->dev = dev;

socket->pcmcia_socket = pcmcia_register_socket(slot, &cardu_operations, 1);
if (socket->pcmcia_socket == NULL) {
iounmap(socket->base);
socket->base = NULL;
return -ENOMEM;
ret = -ENOMEM;
goto unmap;
}

if (request_irq(dev->irq, cardu_interrupt, IRQF_SHARED, socket->name, socket) < 0) {
pcmcia_unregister_socket(socket->pcmcia_socket);
socket->pcmcia_socket = NULL;
iounmap(socket->base);
socket->base = NULL;
return -EBUSY;
ret = -EBUSY;
goto unregister;
}

printk(KERN_INFO "%s at %#08lx, IRQ %d\n", socket->name, start, dev->irq);

return 0;

unregister:
pcmcia_unregister_socket(socket->pcmcia_socket);
socket->pcmcia_socket = NULL;
unmap:
iounmap(socket->base);
socket->base = NULL;
release:
pci_release_regions(dev);
disable:
pci_disable_device(dev);
return ret;
}

static int __devinit vrc4173_cardu_setup(char *options)
Expand Down

0 comments on commit 1ab488d

Please sign in to comment.