Skip to content

Commit b0e4539

Browse files
Florian FainelliJeff Garzik
authored andcommitted
r6040: rework init_one error handling
This patch reworks the error handling in r6040_init_one in order not to leak resources and correcly unmap and release PCI regions of the MAC. Also prefix printk's with the driver name for clarity. Signed-off-by: Florian Fainelli <[email protected]> Signed-off-by: Jeff Garzik <[email protected]>
1 parent 1de9529 commit b0e4539

File tree

1 file changed

+25
-19
lines changed

1 file changed

+25
-19
lines changed

drivers/net/r6040.c

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,48 +1054,54 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
10541054

10551055
err = pci_enable_device(pdev);
10561056
if (err)
1057-
return err;
1057+
goto err_out;
10581058

10591059
/* this should always be supported */
1060-
if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
1060+
err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
1061+
if (err) {
10611062
printk(KERN_ERR DRV_NAME "32-bit PCI DMA addresses"
10621063
"not supported by the card\n");
1063-
return -ENODEV;
1064+
goto err_out;
10641065
}
1065-
if (pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) {
1066+
err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
1067+
if (err) {
10661068
printk(KERN_ERR DRV_NAME "32-bit PCI DMA addresses"
10671069
"not supported by the card\n");
1068-
return -ENODEV;
1070+
goto err_out;
10691071
}
10701072

10711073
/* IO Size check */
10721074
if (pci_resource_len(pdev, 0) < io_size) {
1073-
printk(KERN_ERR "Insufficient PCI resources, aborting\n");
1074-
return -EIO;
1075+
printk(KERN_ERR DRV_NAME "Insufficient PCI resources, aborting\n");
1076+
err = -EIO;
1077+
goto err_out;
10751078
}
10761079

10771080
pioaddr = pci_resource_start(pdev, 0); /* IO map base address */
10781081
pci_set_master(pdev);
10791082

10801083
dev = alloc_etherdev(sizeof(struct r6040_private));
10811084
if (!dev) {
1082-
printk(KERN_ERR "Failed to allocate etherdev\n");
1083-
return -ENOMEM;
1085+
printk(KERN_ERR DRV_NAME "Failed to allocate etherdev\n");
1086+
err = -ENOMEM;
1087+
goto err_out;
10841088
}
10851089
SET_NETDEV_DEV(dev, &pdev->dev);
10861090
lp = netdev_priv(dev);
10871091

1088-
if (pci_request_regions(pdev, DRV_NAME)) {
1092+
err = pci_request_regions(pdev, DRV_NAME);
1093+
1094+
if (err) {
10891095
printk(KERN_ERR DRV_NAME ": Failed to request PCI regions\n");
1090-
err = -ENODEV;
1091-
goto err_out_disable;
1096+
goto err_out_free_dev;
10921097
}
10931098

10941099
ioaddr = pci_iomap(pdev, bar, io_size);
10951100
if (!ioaddr) {
10961101
printk(KERN_ERR "ioremap failed for device %s\n",
10971102
pci_name(pdev));
1098-
return -EIO;
1103+
err = -EIO;
1104+
goto err_out_free_res;
10991105
}
11001106

11011107
/* Init system & device */
@@ -1147,17 +1153,17 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
11471153
err = register_netdev(dev);
11481154
if (err) {
11491155
printk(KERN_ERR DRV_NAME ": Failed to register net device\n");
1150-
goto err_out_res;
1156+
goto err_out_unmap;
11511157
}
11521158
return 0;
11531159

1154-
err_out_res:
1160+
err_out_unmap:
1161+
pci_iounmap(pdev, ioaddr);
1162+
err_out_free_res:
11551163
pci_release_regions(pdev);
1156-
err_out_disable:
1157-
pci_disable_device(pdev);
1158-
pci_set_drvdata(pdev, NULL);
1164+
err_out_free_dev:
11591165
free_netdev(dev);
1160-
1166+
err_out:
11611167
return err;
11621168
}
11631169

0 commit comments

Comments
 (0)