Commit 54403b6f authored by Sergei Shtylyov's avatar Sergei Shtylyov Committed by Greg Kroah-Hartman

3c59x: fix PCI resource management

[ Upstream commit 4b264a16 ]

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: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent efefe3bd
...@@ -632,7 +632,6 @@ struct vortex_private { ...@@ -632,7 +632,6 @@ struct vortex_private {
pm_state_valid:1, /* pci_dev->saved_config_space has sane contents */ pm_state_valid:1, /* pci_dev->saved_config_space has sane contents */
open:1, open:1,
medialock:1, medialock:1,
must_free_region:1, /* Flag: if zero, Cardbus owns the I/O region */
large_frames:1, /* accept large frames */ large_frames:1, /* accept large frames */
handling_irq:1; /* private in_irq indicator */ handling_irq:1; /* private in_irq indicator */
/* {get|set}_wol operations are already serialized by rtnl. /* {get|set}_wol operations are already serialized by rtnl.
...@@ -1012,6 +1011,12 @@ static int vortex_init_one(struct pci_dev *pdev, ...@@ -1012,6 +1011,12 @@ static int vortex_init_one(struct pci_dev *pdev,
if (rc < 0) if (rc < 0)
goto out; goto out;
rc = pci_request_regions(pdev, DRV_NAME);
if (rc < 0) {
pci_disable_device(pdev);
goto out;
}
unit = vortex_cards_found; unit = vortex_cards_found;
if (global_use_mmio < 0 && (unit >= MAX_UNITS || use_mmio[unit] < 0)) { 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, ...@@ -1027,6 +1032,7 @@ static int vortex_init_one(struct pci_dev *pdev,
if (!ioaddr) /* If mapping fails, fall-back to BAR 0... */ if (!ioaddr) /* If mapping fails, fall-back to BAR 0... */
ioaddr = pci_iomap(pdev, 0, 0); ioaddr = pci_iomap(pdev, 0, 0);
if (!ioaddr) { if (!ioaddr) {
pci_release_regions(pdev);
pci_disable_device(pdev); pci_disable_device(pdev);
rc = -ENOMEM; rc = -ENOMEM;
goto out; goto out;
...@@ -1036,6 +1042,7 @@ static int vortex_init_one(struct pci_dev *pdev, ...@@ -1036,6 +1042,7 @@ static int vortex_init_one(struct pci_dev *pdev,
ent->driver_data, unit); ent->driver_data, unit);
if (rc < 0) { if (rc < 0) {
pci_iounmap(pdev, ioaddr); pci_iounmap(pdev, ioaddr);
pci_release_regions(pdev);
pci_disable_device(pdev); pci_disable_device(pdev);
goto out; goto out;
} }
...@@ -1178,11 +1185,6 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq, ...@@ -1178,11 +1185,6 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq,
/* PCI-only startup logic */ /* PCI-only startup logic */
if (pdev) { 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 */ /* enable bus-mastering if necessary */
if (vci->flags & PCI_USES_MASTER) if (vci->flags & PCI_USES_MASTER)
pci_set_master(pdev); pci_set_master(pdev);
...@@ -1220,7 +1222,7 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq, ...@@ -1220,7 +1222,7 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq,
&vp->rx_ring_dma); &vp->rx_ring_dma);
retval = -ENOMEM; retval = -ENOMEM;
if (!vp->rx_ring) 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 = (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; vp->tx_ring_dma = vp->rx_ring_dma + sizeof(struct boom_rx_desc) * RX_RING_SIZE;
...@@ -1484,9 +1486,7 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq, ...@@ -1484,9 +1486,7 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq,
+ sizeof(struct boom_tx_desc) * TX_RING_SIZE, + sizeof(struct boom_tx_desc) * TX_RING_SIZE,
vp->rx_ring, vp->rx_ring,
vp->rx_ring_dma); vp->rx_ring_dma);
free_region: free_device:
if (vp->must_free_region)
release_region(dev->base_addr, vci->io_size);
free_netdev(dev); free_netdev(dev);
pr_err(PFX "vortex_probe1 fails. Returns %d\n", retval); pr_err(PFX "vortex_probe1 fails. Returns %d\n", retval);
out: out:
...@@ -3254,8 +3254,9 @@ static void vortex_remove_one(struct pci_dev *pdev) ...@@ -3254,8 +3254,9 @@ static void vortex_remove_one(struct pci_dev *pdev)
+ sizeof(struct boom_tx_desc) * TX_RING_SIZE, + sizeof(struct boom_tx_desc) * TX_RING_SIZE,
vp->rx_ring, vp->rx_ring,
vp->rx_ring_dma); vp->rx_ring_dma);
if (vp->must_free_region)
release_region(dev->base_addr, vp->io_size); pci_release_regions(pdev);
free_netdev(dev); free_netdev(dev);
} }
......
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