diff options
Diffstat (limited to 'drivers/net/sunlance.c')
-rw-r--r-- | drivers/net/sunlance.c | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/drivers/net/sunlance.c b/drivers/net/sunlance.c index 4e994f87469e..24ffecb1ce23 100644 --- a/drivers/net/sunlance.c +++ b/drivers/net/sunlance.c | |||
@@ -248,7 +248,7 @@ struct lance_private { | |||
248 | int rx_new, tx_new; | 248 | int rx_new, tx_new; |
249 | int rx_old, tx_old; | 249 | int rx_old, tx_old; |
250 | 250 | ||
251 | struct sbus_dma *ledma; /* If set this points to ledma */ | 251 | struct of_device *ledma; /* If set this points to ledma */ |
252 | char tpe; /* cable-selection is TPE */ | 252 | char tpe; /* cable-selection is TPE */ |
253 | char auto_select; /* cable-selection by carrier */ | 253 | char auto_select; /* cable-selection by carrier */ |
254 | char burst_sizes; /* ledma SBus burst sizes */ | 254 | char burst_sizes; /* ledma SBus burst sizes */ |
@@ -1273,6 +1273,12 @@ static void lance_free_hwresources(struct lance_private *lp) | |||
1273 | { | 1273 | { |
1274 | if (lp->lregs) | 1274 | if (lp->lregs) |
1275 | sbus_iounmap(lp->lregs, LANCE_REG_SIZE); | 1275 | sbus_iounmap(lp->lregs, LANCE_REG_SIZE); |
1276 | if (lp->dregs) { | ||
1277 | struct of_device *ledma = lp->ledma; | ||
1278 | |||
1279 | of_iounmap(&ledma->resource[0], lp->dregs, | ||
1280 | resource_size(&ledma->resource[0])); | ||
1281 | } | ||
1276 | if (lp->init_block_iomem) { | 1282 | if (lp->init_block_iomem) { |
1277 | sbus_iounmap(lp->init_block_iomem, | 1283 | sbus_iounmap(lp->init_block_iomem, |
1278 | sizeof(struct lance_init_block)); | 1284 | sizeof(struct lance_init_block)); |
@@ -1309,7 +1315,7 @@ static const struct ethtool_ops sparc_lance_ethtool_ops = { | |||
1309 | }; | 1315 | }; |
1310 | 1316 | ||
1311 | static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, | 1317 | static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, |
1312 | struct sbus_dma *ledma, | 1318 | struct of_device *ledma, |
1313 | struct sbus_dev *lebuffer) | 1319 | struct sbus_dev *lebuffer) |
1314 | { | 1320 | { |
1315 | static unsigned version_printed; | 1321 | static unsigned version_printed; |
@@ -1345,6 +1351,18 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, | |||
1345 | goto fail; | 1351 | goto fail; |
1346 | } | 1352 | } |
1347 | 1353 | ||
1354 | lp->ledma = ledma; | ||
1355 | if (lp->ledma) { | ||
1356 | lp->dregs = of_ioremap(&ledma->resource[0], 0, | ||
1357 | resource_size(&ledma->resource[0]), | ||
1358 | "ledma"); | ||
1359 | if (!lp->dregs) { | ||
1360 | printk(KERN_ERR "SunLance: Cannot map " | ||
1361 | "ledma registers.\n"); | ||
1362 | goto fail; | ||
1363 | } | ||
1364 | } | ||
1365 | |||
1348 | lp->sdev = sdev; | 1366 | lp->sdev = sdev; |
1349 | if (lebuffer) { | 1367 | if (lebuffer) { |
1350 | /* sanity check */ | 1368 | /* sanity check */ |
@@ -1383,11 +1401,10 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, | |||
1383 | LE_C3_BCON)); | 1401 | LE_C3_BCON)); |
1384 | 1402 | ||
1385 | lp->name = lancestr; | 1403 | lp->name = lancestr; |
1386 | lp->ledma = ledma; | ||
1387 | 1404 | ||
1388 | lp->burst_sizes = 0; | 1405 | lp->burst_sizes = 0; |
1389 | if (lp->ledma) { | 1406 | if (lp->ledma) { |
1390 | struct device_node *ledma_dp = ledma->sdev->ofdev.node; | 1407 | struct device_node *ledma_dp = ledma->node; |
1391 | const char *prop; | 1408 | const char *prop; |
1392 | unsigned int sbmask; | 1409 | unsigned int sbmask; |
1393 | u32 csr; | 1410 | u32 csr; |
@@ -1435,8 +1452,6 @@ no_link_test: | |||
1435 | lp->tpe = 1; | 1452 | lp->tpe = 1; |
1436 | } | 1453 | } |
1437 | 1454 | ||
1438 | lp->dregs = ledma->regs; | ||
1439 | |||
1440 | /* Reset ledma */ | 1455 | /* Reset ledma */ |
1441 | csr = sbus_readl(lp->dregs + DMA_CSR); | 1456 | csr = sbus_readl(lp->dregs + DMA_CSR); |
1442 | sbus_writel(csr | DMA_RST_ENET, lp->dregs + DMA_CSR); | 1457 | sbus_writel(csr | DMA_RST_ENET, lp->dregs + DMA_CSR); |
@@ -1486,18 +1501,6 @@ fail: | |||
1486 | return -ENODEV; | 1501 | return -ENODEV; |
1487 | } | 1502 | } |
1488 | 1503 | ||
1489 | /* On 4m, find the associated dma for the lance chip */ | ||
1490 | static struct sbus_dma * __devinit find_ledma(struct sbus_dev *sdev) | ||
1491 | { | ||
1492 | struct sbus_dma *p; | ||
1493 | |||
1494 | for_each_dvma(p) { | ||
1495 | if (p->sdev == sdev) | ||
1496 | return p; | ||
1497 | } | ||
1498 | return NULL; | ||
1499 | } | ||
1500 | |||
1501 | #ifdef CONFIG_SUN4 | 1504 | #ifdef CONFIG_SUN4 |
1502 | 1505 | ||
1503 | #include <asm/sun4paddr.h> | 1506 | #include <asm/sun4paddr.h> |
@@ -1541,13 +1544,13 @@ static int __devinit sunlance_sbus_probe(struct of_device *dev, const struct of_ | |||
1541 | int err; | 1544 | int err; |
1542 | 1545 | ||
1543 | if (sdev->parent) { | 1546 | if (sdev->parent) { |
1544 | struct of_device *parent = &sdev->parent->ofdev; | 1547 | struct device_node *parent_node = sdev->parent->ofdev.node; |
1545 | 1548 | struct of_device *parent; | |
1546 | if (!strcmp(parent->node->name, "ledma")) { | ||
1547 | struct sbus_dma *ledma = find_ledma(to_sbus_device(&parent->dev)); | ||
1548 | 1549 | ||
1549 | err = sparc_lance_probe_one(sdev, ledma, NULL); | 1550 | parent = of_find_device_by_node(parent_node); |
1550 | } else if (!strcmp(parent->node->name, "lebuffer")) { | 1551 | if (parent && !strcmp(parent->node->name, "ledma")) { |
1552 | err = sparc_lance_probe_one(sdev, parent, NULL); | ||
1553 | } else if (parent && !strcmp(parent->node->name, "lebuffer")) { | ||
1551 | err = sparc_lance_probe_one(sdev, NULL, to_sbus_device(&parent->dev)); | 1554 | err = sparc_lance_probe_one(sdev, NULL, to_sbus_device(&parent->dev)); |
1552 | } else | 1555 | } else |
1553 | err = sparc_lance_probe_one(sdev, NULL, NULL); | 1556 | err = sparc_lance_probe_one(sdev, NULL, NULL); |