forked from Minki/linux
3c59x: fix PCI resource management
The driver wrongly claimed I/O ports at an address returned by pci_iomap() -- even if it was passed an MMIO address. Fix this by claiming/releasing all PCI resources in the PCI driver's probe()/remove() methods instead and get rid of 'must_free_region' flag weirdness (why would Cardbus claim anything for us?). Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
79e0c19e85
commit
4b264a1676
@ -632,7 +632,6 @@ struct vortex_private {
|
||||
pm_state_valid:1, /* pci_dev->saved_config_space has sane contents */
|
||||
open:1,
|
||||
medialock:1,
|
||||
must_free_region:1, /* Flag: if zero, Cardbus owns the I/O region */
|
||||
large_frames:1, /* accept large frames */
|
||||
handling_irq:1; /* private in_irq indicator */
|
||||
/* {get|set}_wol operations are already serialized by rtnl.
|
||||
@ -1012,6 +1011,12 @@ static int vortex_init_one(struct pci_dev *pdev,
|
||||
if (rc < 0)
|
||||
goto out;
|
||||
|
||||
rc = pci_request_regions(pdev, DRV_NAME);
|
||||
if (rc < 0) {
|
||||
pci_disable_device(pdev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
unit = vortex_cards_found;
|
||||
|
||||
if (global_use_mmio < 0 && (unit >= MAX_UNITS || use_mmio[unit] < 0)) {
|
||||
@ -1027,6 +1032,7 @@ static int vortex_init_one(struct pci_dev *pdev,
|
||||
if (!ioaddr) /* If mapping fails, fall-back to BAR 0... */
|
||||
ioaddr = pci_iomap(pdev, 0, 0);
|
||||
if (!ioaddr) {
|
||||
pci_release_regions(pdev);
|
||||
pci_disable_device(pdev);
|
||||
rc = -ENOMEM;
|
||||
goto out;
|
||||
@ -1036,6 +1042,7 @@ static int vortex_init_one(struct pci_dev *pdev,
|
||||
ent->driver_data, unit);
|
||||
if (rc < 0) {
|
||||
pci_iounmap(pdev, ioaddr);
|
||||
pci_release_regions(pdev);
|
||||
pci_disable_device(pdev);
|
||||
goto out;
|
||||
}
|
||||
@ -1178,11 +1185,6 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq,
|
||||
|
||||
/* PCI-only startup logic */
|
||||
if (pdev) {
|
||||
/* EISA resources already marked, so only PCI needs to do this here */
|
||||
/* Ignore return value, because Cardbus drivers already allocate for us */
|
||||
if (request_region(dev->base_addr, vci->io_size, print_name) != NULL)
|
||||
vp->must_free_region = 1;
|
||||
|
||||
/* enable bus-mastering if necessary */
|
||||
if (vci->flags & PCI_USES_MASTER)
|
||||
pci_set_master(pdev);
|
||||
@ -1220,7 +1222,7 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq,
|
||||
&vp->rx_ring_dma);
|
||||
retval = -ENOMEM;
|
||||
if (!vp->rx_ring)
|
||||
goto free_region;
|
||||
goto free_device;
|
||||
|
||||
vp->tx_ring = (struct boom_tx_desc *)(vp->rx_ring + RX_RING_SIZE);
|
||||
vp->tx_ring_dma = vp->rx_ring_dma + sizeof(struct boom_rx_desc) * RX_RING_SIZE;
|
||||
@ -1484,9 +1486,7 @@ free_ring:
|
||||
+ sizeof(struct boom_tx_desc) * TX_RING_SIZE,
|
||||
vp->rx_ring,
|
||||
vp->rx_ring_dma);
|
||||
free_region:
|
||||
if (vp->must_free_region)
|
||||
release_region(dev->base_addr, vci->io_size);
|
||||
free_device:
|
||||
free_netdev(dev);
|
||||
pr_err(PFX "vortex_probe1 fails. Returns %d\n", retval);
|
||||
out:
|
||||
@ -3254,8 +3254,9 @@ static void vortex_remove_one(struct pci_dev *pdev)
|
||||
+ sizeof(struct boom_tx_desc) * TX_RING_SIZE,
|
||||
vp->rx_ring,
|
||||
vp->rx_ring_dma);
|
||||
if (vp->must_free_region)
|
||||
release_region(dev->base_addr, vp->io_size);
|
||||
|
||||
pci_release_regions(pdev);
|
||||
|
||||
free_netdev(dev);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user