|
@@ -541,19 +541,17 @@ static void au1000_reset_mac(struct net_device *dev)
|
|
|
* these are not descriptors sitting in memory.
|
|
|
*/
|
|
|
static void
|
|
|
-au1000_setup_hw_rings(struct au1000_private *aup, u32 rx_base, u32 tx_base)
|
|
|
+au1000_setup_hw_rings(struct au1000_private *aup, void __iomem *tx_base)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
|
for (i = 0; i < NUM_RX_DMA; i++) {
|
|
|
- aup->rx_dma_ring[i] =
|
|
|
- (struct rx_dma *)
|
|
|
- (rx_base + sizeof(struct rx_dma)*i);
|
|
|
+ aup->rx_dma_ring[i] = (struct rx_dma *)
|
|
|
+ (tx_base + 0x100 + sizeof(struct rx_dma) * i);
|
|
|
}
|
|
|
for (i = 0; i < NUM_TX_DMA; i++) {
|
|
|
- aup->tx_dma_ring[i] =
|
|
|
- (struct tx_dma *)
|
|
|
- (tx_base + sizeof(struct tx_dma)*i);
|
|
|
+ aup->tx_dma_ring[i] = (struct tx_dma *)
|
|
|
+ (tx_base + sizeof(struct tx_dma) * i);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1026,7 +1024,7 @@ static int __devinit au1000_probe(struct platform_device *pdev)
|
|
|
struct net_device *dev = NULL;
|
|
|
struct db_dest *pDB, *pDBfree;
|
|
|
int irq, i, err = 0;
|
|
|
- struct resource *base, *macen;
|
|
|
+ struct resource *base, *macen, *macdma;
|
|
|
|
|
|
base = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
if (!base) {
|
|
@@ -1049,6 +1047,13 @@ static int __devinit au1000_probe(struct platform_device *pdev)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ macdma = platform_get_resource(pdev, IORESOURCE_MEM, 2);
|
|
|
+ if (!macdma) {
|
|
|
+ dev_err(&pdev->dev, "failed to retrieve MACDMA registers\n");
|
|
|
+ err = -ENODEV;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
if (!request_mem_region(base->start, resource_size(base),
|
|
|
pdev->name)) {
|
|
|
dev_err(&pdev->dev, "failed to request memory region for base registers\n");
|
|
@@ -1063,6 +1068,13 @@ static int __devinit au1000_probe(struct platform_device *pdev)
|
|
|
goto err_request;
|
|
|
}
|
|
|
|
|
|
+ if (!request_mem_region(macdma->start, resource_size(macdma),
|
|
|
+ pdev->name)) {
|
|
|
+ dev_err(&pdev->dev, "failed to request MACDMA memory region\n");
|
|
|
+ err = -ENXIO;
|
|
|
+ goto err_macdma;
|
|
|
+ }
|
|
|
+
|
|
|
dev = alloc_etherdev(sizeof(struct au1000_private));
|
|
|
if (!dev) {
|
|
|
dev_err(&pdev->dev, "alloc_etherdev failed\n");
|
|
@@ -1109,10 +1121,14 @@ static int __devinit au1000_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
aup->mac_id = pdev->id;
|
|
|
|
|
|
- if (pdev->id == 0)
|
|
|
- au1000_setup_hw_rings(aup, MAC0_RX_DMA_ADDR, MAC0_TX_DMA_ADDR);
|
|
|
- else if (pdev->id == 1)
|
|
|
- au1000_setup_hw_rings(aup, MAC1_RX_DMA_ADDR, MAC1_TX_DMA_ADDR);
|
|
|
+ aup->macdma = ioremap_nocache(macdma->start, resource_size(macdma));
|
|
|
+ if (!aup->macdma) {
|
|
|
+ dev_err(&pdev->dev, "failed to ioremap MACDMA registers\n");
|
|
|
+ err = -ENXIO;
|
|
|
+ goto err_remap3;
|
|
|
+ }
|
|
|
+
|
|
|
+ au1000_setup_hw_rings(aup, aup->macdma);
|
|
|
|
|
|
/* set a random MAC now in case platform_data doesn't provide one */
|
|
|
random_ether_addr(dev->dev_addr);
|
|
@@ -1252,6 +1268,8 @@ err_out:
|
|
|
err_mdiobus_reg:
|
|
|
mdiobus_free(aup->mii_bus);
|
|
|
err_mdiobus_alloc:
|
|
|
+ iounmap(aup->macdma);
|
|
|
+err_remap3:
|
|
|
iounmap(aup->enable);
|
|
|
err_remap2:
|
|
|
iounmap(aup->mac);
|
|
@@ -1261,6 +1279,8 @@ err_remap1:
|
|
|
err_vaddr:
|
|
|
free_netdev(dev);
|
|
|
err_alloc:
|
|
|
+ release_mem_region(macdma->start, resource_size(macdma));
|
|
|
+err_macdma:
|
|
|
release_mem_region(macen->start, resource_size(macen));
|
|
|
err_request:
|
|
|
release_mem_region(base->start, resource_size(base));
|
|
@@ -1293,9 +1313,13 @@ static int __devexit au1000_remove(struct platform_device *pdev)
|
|
|
(NUM_TX_BUFFS + NUM_RX_BUFFS),
|
|
|
(void *)aup->vaddr, aup->dma_addr);
|
|
|
|
|
|
+ iounmap(aup->macdma);
|
|
|
iounmap(aup->mac);
|
|
|
iounmap(aup->enable);
|
|
|
|
|
|
+ base = platform_get_resource(pdev, IORESOURCE_MEM, 2);
|
|
|
+ release_mem_region(base->start, resource_size(base));
|
|
|
+
|
|
|
base = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
release_mem_region(base->start, resource_size(base));
|
|
|
|