Commit 85d8c0b0 authored by Sergei Shtylyov's avatar Sergei Shtylyov Committed by james toy

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 probe/remove handlers instead and get
rid of the must_free_region flag weirdness (why would Cardbus claim
anything for us?).

Also, the remove handler was trying to talk to the chip after having
disabled its address decoders (at least on x86) -- fix this and get rid of
useless VORTEX_PCI() calls.

While at it, fix some cases of the overly indented code...

[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: Steffen Klassert <klassert@mathematik.tu-chemnitz.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent be05ead6
...@@ -633,7 +633,6 @@ struct vortex_private { ...@@ -633,7 +633,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 */
int drv_flags; int drv_flags;
u16 status_enable; u16 status_enable;
...@@ -964,7 +963,13 @@ static int __devinit vortex_init_one(struct pci_dev *pdev, ...@@ -964,7 +963,13 @@ static int __devinit vortex_init_one(struct pci_dev *pdev,
/* wake up and enable device */ /* wake up and enable device */
rc = pci_enable_device(pdev); rc = pci_enable_device(pdev);
if (rc < 0) if (rc < 0)
goto out; return rc;
rc = pci_request_regions(pdev, "3c59x");
if (rc < 0) {
pci_disable_device(pdev);
return rc;
}
unit = vortex_cards_found; unit = vortex_cards_found;
...@@ -984,13 +989,13 @@ static int __devinit vortex_init_one(struct pci_dev *pdev, ...@@ -984,13 +989,13 @@ static int __devinit vortex_init_one(struct pci_dev *pdev,
rc = vortex_probe1(&pdev->dev, ioaddr, pdev->irq, rc = vortex_probe1(&pdev->dev, ioaddr, pdev->irq,
ent->driver_data, unit); ent->driver_data, unit);
if (rc < 0) { if (rc < 0) {
pci_release_regions(pdev);
pci_disable_device(pdev); pci_disable_device(pdev);
goto out; return rc;
} }
vortex_cards_found++; vortex_cards_found++;
out:
return rc; return rc;
} }
...@@ -1127,11 +1132,6 @@ static int __devinit vortex_probe1(struct device *gendev, ...@@ -1127,11 +1132,6 @@ static int __devinit vortex_probe1(struct device *gendev,
/* 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);
...@@ -1162,12 +1162,13 @@ static int __devinit vortex_probe1(struct device *gendev, ...@@ -1162,12 +1162,13 @@ static int __devinit vortex_probe1(struct device *gendev,
vp->mii.reg_num_mask = 0x1f; vp->mii.reg_num_mask = 0x1f;
/* Makes sure rings are at least 16 byte aligned. */ /* Makes sure rings are at least 16 byte aligned. */
vp->rx_ring = pci_alloc_consistent(pdev, sizeof(struct boom_rx_desc) * RX_RING_SIZE vp->rx_ring = pci_alloc_consistent(pdev,
+ sizeof(struct boom_tx_desc) * TX_RING_SIZE, sizeof(struct boom_rx_desc) * RX_RING_SIZE +
sizeof(struct boom_tx_desc) * TX_RING_SIZE,
&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;
...@@ -1434,13 +1435,11 @@ static int __devinit vortex_probe1(struct device *gendev, ...@@ -1434,13 +1435,11 @@ static int __devinit vortex_probe1(struct device *gendev,
free_ring: free_ring:
pci_free_consistent(pdev, pci_free_consistent(pdev,
sizeof(struct boom_rx_desc) * RX_RING_SIZE sizeof(struct boom_rx_desc) * RX_RING_SIZE +
+ 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:
...@@ -3168,29 +3167,28 @@ static void __devexit vortex_remove_one(struct pci_dev *pdev) ...@@ -3168,29 +3167,28 @@ static void __devexit vortex_remove_one(struct pci_dev *pdev)
vp = netdev_priv(dev); vp = netdev_priv(dev);
if (vp->cb_fn_base) if (vp->cb_fn_base)
pci_iounmap(VORTEX_PCI(vp), vp->cb_fn_base); pci_iounmap(pdev, vp->cb_fn_base);
unregister_netdev(dev); unregister_netdev(dev);
if (VORTEX_PCI(vp)) { pci_set_power_state(pdev, PCI_D0); /* Go active */
pci_set_power_state(VORTEX_PCI(vp), PCI_D0); /* Go active */
if (vp->pm_state_valid) if (vp->pm_state_valid)
pci_restore_state(VORTEX_PCI(vp)); pci_restore_state(pdev);
pci_disable_device(VORTEX_PCI(vp));
}
/* Should really use issue_and_wait() here */ /* Should really use issue_and_wait() here */
iowrite16(TotalReset | ((vp->drv_flags & EEPROM_RESET) ? 0x04 : 0x14), iowrite16(TotalReset | ((vp->drv_flags & EEPROM_RESET) ? 0x04 : 0x14),
vp->ioaddr + EL3_CMD); vp->ioaddr + EL3_CMD);
pci_iounmap(VORTEX_PCI(vp), vp->ioaddr); pci_iounmap(pdev, vp->ioaddr);
pci_free_consistent(pdev, pci_free_consistent(pdev,
sizeof(struct boom_rx_desc) * RX_RING_SIZE sizeof(struct boom_rx_desc) * RX_RING_SIZE +
+ 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);
pci_disable_device(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