Commit af736fed authored by David S. Miller's avatar David S. Miller

sunlance: Convert to pure OF driver.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent db1a8611
...@@ -92,6 +92,8 @@ static char lancestr[] = "LANCE"; ...@@ -92,6 +92,8 @@ static char lancestr[] = "LANCE";
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -99,7 +101,6 @@ static char lancestr[] = "LANCE"; ...@@ -99,7 +101,6 @@ static char lancestr[] = "LANCE";
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/byteorder.h> /* Used by the checksum routines */ #include <asm/byteorder.h> /* Used by the checksum routines */
#include <asm/idprom.h> #include <asm/idprom.h>
#include <asm/sbus.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/auxio.h> /* For tpe-link-test? setting */ #include <asm/auxio.h> /* For tpe-link-test? setting */
#include <asm/irq.h> #include <asm/irq.h>
...@@ -264,7 +265,8 @@ struct lance_private { ...@@ -264,7 +265,8 @@ struct lance_private {
char *name; char *name;
dma_addr_t init_block_dvma; dma_addr_t init_block_dvma;
struct net_device *dev; /* Backpointer */ struct net_device *dev; /* Backpointer */
struct sbus_dev *sdev; struct of_device *op;
struct of_device *lebuffer;
struct timer_list multicast_timer; struct timer_list multicast_timer;
}; };
...@@ -1273,7 +1275,7 @@ static void lance_set_multicast_retry(unsigned long _opaque) ...@@ -1273,7 +1275,7 @@ static void lance_set_multicast_retry(unsigned long _opaque)
static void lance_free_hwresources(struct lance_private *lp) static void lance_free_hwresources(struct lance_private *lp)
{ {
if (lp->lregs) if (lp->lregs)
sbus_iounmap(lp->lregs, LANCE_REG_SIZE); of_iounmap(&lp->op->resource[0], lp->lregs, LANCE_REG_SIZE);
if (lp->dregs) { if (lp->dregs) {
struct of_device *ledma = lp->ledma; struct of_device *ledma = lp->ledma;
...@@ -1281,10 +1283,10 @@ static void lance_free_hwresources(struct lance_private *lp) ...@@ -1281,10 +1283,10 @@ static void lance_free_hwresources(struct lance_private *lp)
resource_size(&ledma->resource[0])); resource_size(&ledma->resource[0]));
} }
if (lp->init_block_iomem) { if (lp->init_block_iomem) {
sbus_iounmap(lp->init_block_iomem, of_iounmap(&lp->lebuffer->resource[0], lp->init_block_iomem,
sizeof(struct lance_init_block)); sizeof(struct lance_init_block));
} else if (lp->init_block_mem) { } else if (lp->init_block_mem) {
dma_free_coherent(&lp->sdev->ofdev.dev, dma_free_coherent(&lp->op->dev,
sizeof(struct lance_init_block), sizeof(struct lance_init_block),
lp->init_block_mem, lp->init_block_mem,
lp->init_block_dvma); lp->init_block_dvma);
...@@ -1294,12 +1296,8 @@ static void lance_free_hwresources(struct lance_private *lp) ...@@ -1294,12 +1296,8 @@ static void lance_free_hwresources(struct lance_private *lp)
/* Ethtool support... */ /* Ethtool support... */
static void sparc_lance_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) static void sparc_lance_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
{ {
struct lance_private *lp = netdev_priv(dev);
strcpy(info->driver, "sunlance"); strcpy(info->driver, "sunlance");
strcpy(info->version, "2.02"); strcpy(info->version, "2.02");
sprintf(info->bus_info, "SBUS:%d",
lp->sdev->slot);
} }
static u32 sparc_lance_get_link(struct net_device *dev) static u32 sparc_lance_get_link(struct net_device *dev)
...@@ -1315,16 +1313,16 @@ static const struct ethtool_ops sparc_lance_ethtool_ops = { ...@@ -1315,16 +1313,16 @@ static const struct ethtool_ops sparc_lance_ethtool_ops = {
.get_link = sparc_lance_get_link, .get_link = sparc_lance_get_link,
}; };
static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, static int __devinit sparc_lance_probe_one(struct of_device *op,
struct of_device *ledma, struct of_device *ledma,
struct sbus_dev *lebuffer) struct of_device *lebuffer)
{ {
struct device_node *dp = op->node;
static unsigned version_printed; static unsigned version_printed;
struct device_node *dp = sdev->ofdev.node;
struct net_device *dev;
struct lance_private *lp; struct lance_private *lp;
int i; struct net_device *dev;
DECLARE_MAC_BUF(mac); DECLARE_MAC_BUF(mac);
int i;
dev = alloc_etherdev(sizeof(struct lance_private) + 8); dev = alloc_etherdev(sizeof(struct lance_private) + 8);
if (!dev) if (!dev)
...@@ -1345,8 +1343,8 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, ...@@ -1345,8 +1343,8 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev,
dev->dev_addr[i] = idprom->id_ethaddr[i]; dev->dev_addr[i] = idprom->id_ethaddr[i];
/* Get the IO region */ /* Get the IO region */
lp->lregs = sbus_ioremap(&sdev->resource[0], 0, lp->lregs = of_ioremap(&op->resource[0], 0,
LANCE_REG_SIZE, lancestr); LANCE_REG_SIZE, lancestr);
if (!lp->lregs) { if (!lp->lregs) {
printk(KERN_ERR "SunLance: Cannot map registers.\n"); printk(KERN_ERR "SunLance: Cannot map registers.\n");
goto fail; goto fail;
...@@ -1364,7 +1362,8 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, ...@@ -1364,7 +1362,8 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev,
} }
} }
lp->sdev = sdev; lp->op = op;
lp->lebuffer = lebuffer;
if (lebuffer) { if (lebuffer) {
/* sanity check */ /* sanity check */
if (lebuffer->resource[0].start & 7) { if (lebuffer->resource[0].start & 7) {
...@@ -1372,8 +1371,8 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, ...@@ -1372,8 +1371,8 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev,
goto fail; goto fail;
} }
lp->init_block_iomem = lp->init_block_iomem =
sbus_ioremap(&lebuffer->resource[0], 0, of_ioremap(&lebuffer->resource[0], 0,
sizeof(struct lance_init_block), "lebuffer"); sizeof(struct lance_init_block), "lebuffer");
if (!lp->init_block_iomem) { if (!lp->init_block_iomem) {
printk(KERN_ERR "SunLance: Cannot map PIO buffer.\n"); printk(KERN_ERR "SunLance: Cannot map PIO buffer.\n");
goto fail; goto fail;
...@@ -1385,10 +1384,10 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, ...@@ -1385,10 +1384,10 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev,
lp->tx = lance_tx_pio; lp->tx = lance_tx_pio;
} else { } else {
lp->init_block_mem = lp->init_block_mem =
dma_alloc_coherent(&sdev->ofdev.dev, dma_alloc_coherent(&op->dev,
sizeof(struct lance_init_block), sizeof(struct lance_init_block),
&lp->init_block_dvma, GFP_ATOMIC); &lp->init_block_dvma, GFP_ATOMIC);
if (!lp->init_block_mem || lp->init_block_dvma == 0) { if (!lp->init_block_mem) {
printk(KERN_ERR "SunLance: Cannot allocate consistent DMA memory.\n"); printk(KERN_ERR "SunLance: Cannot allocate consistent DMA memory.\n");
goto fail; goto fail;
} }
...@@ -1407,8 +1406,9 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, ...@@ -1407,8 +1406,9 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev,
lp->burst_sizes = 0; lp->burst_sizes = 0;
if (lp->ledma) { if (lp->ledma) {
struct device_node *ledma_dp = ledma->node; struct device_node *ledma_dp = ledma->node;
const char *prop; struct device_node *sbus_dp;
unsigned int sbmask; unsigned int sbmask;
const char *prop;
u32 csr; u32 csr;
/* Find burst-size property for ledma */ /* Find burst-size property for ledma */
...@@ -1416,7 +1416,8 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, ...@@ -1416,7 +1416,8 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev,
"burst-sizes", 0); "burst-sizes", 0);
/* ledma may be capable of fast bursts, but sbus may not. */ /* ledma may be capable of fast bursts, but sbus may not. */
sbmask = of_getintprop_default(ledma_dp, "burst-sizes", sbus_dp = ledma_dp->parent;
sbmask = of_getintprop_default(sbus_dp, "burst-sizes",
DMA_BURSTBITS); DMA_BURSTBITS);
lp->burst_sizes &= sbmask; lp->burst_sizes &= sbmask;
...@@ -1463,7 +1464,7 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, ...@@ -1463,7 +1464,7 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev,
lp->dregs = NULL; lp->dregs = NULL;
lp->dev = dev; lp->dev = dev;
SET_NETDEV_DEV(dev, &sdev->ofdev.dev); SET_NETDEV_DEV(dev, &op->dev);
dev->open = &lance_open; dev->open = &lance_open;
dev->stop = &lance_close; dev->stop = &lance_close;
dev->hard_start_xmit = &lance_start_xmit; dev->hard_start_xmit = &lance_start_xmit;
...@@ -1472,9 +1473,7 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, ...@@ -1472,9 +1473,7 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev,
dev->set_multicast_list = &lance_set_multicast; dev->set_multicast_list = &lance_set_multicast;
dev->ethtool_ops = &sparc_lance_ethtool_ops; dev->ethtool_ops = &sparc_lance_ethtool_ops;
dev->irq = sdev->irqs[0]; dev->irq = op->irqs[0];
dev->dma = 0;
/* We cannot sleep if the chip is busy during a /* We cannot sleep if the chip is busy during a
* multicast list update event, because such events * multicast list update event, because such events
...@@ -1490,7 +1489,7 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev, ...@@ -1490,7 +1489,7 @@ static int __devinit sparc_lance_probe_one(struct sbus_dev *sdev,
goto fail; goto fail;
} }
dev_set_drvdata(&sdev->ofdev.dev, lp); dev_set_drvdata(&op->dev, lp);
printk(KERN_INFO "%s: LANCE %s\n", printk(KERN_INFO "%s: LANCE %s\n",
dev->name, print_mac(mac, dev->dev_addr)); dev->name, print_mac(mac, dev->dev_addr));
...@@ -1540,31 +1539,25 @@ static int __exit sunlance_sun4_remove(void) ...@@ -1540,31 +1539,25 @@ static int __exit sunlance_sun4_remove(void)
#else /* !CONFIG_SUN4 */ #else /* !CONFIG_SUN4 */
static int __devinit sunlance_sbus_probe(struct of_device *dev, const struct of_device_id *match) static int __devinit sunlance_sbus_probe(struct of_device *op, const struct of_device_id *match)
{ {
struct sbus_dev *sdev = to_sbus_device(&dev->dev); struct of_device *parent = to_of_device(op->dev.parent);
struct device_node *parent_dp = parent->node;
int err; int err;
if (sdev->parent) { if (!strcmp(parent_dp->name, "ledma")) {
struct device_node *parent_node = sdev->parent->ofdev.node; err = sparc_lance_probe_one(op, parent, NULL);
struct of_device *parent; } else if (!strcmp(parent_dp->name, "lebuffer")) {
err = sparc_lance_probe_one(op, NULL, parent);
parent = of_find_device_by_node(parent_node);
if (parent && !strcmp(parent->node->name, "ledma")) {
err = sparc_lance_probe_one(sdev, parent, NULL);
} else if (parent && !strcmp(parent->node->name, "lebuffer")) {
err = sparc_lance_probe_one(sdev, NULL, to_sbus_device(&parent->dev));
} else
err = sparc_lance_probe_one(sdev, NULL, NULL);
} else } else
err = sparc_lance_probe_one(sdev, NULL, NULL); err = sparc_lance_probe_one(op, NULL, NULL);
return err; return err;
} }
static int __devexit sunlance_sbus_remove(struct of_device *dev) static int __devexit sunlance_sbus_remove(struct of_device *op)
{ {
struct lance_private *lp = dev_get_drvdata(&dev->dev); struct lance_private *lp = dev_get_drvdata(&op->dev);
struct net_device *net_dev = lp->dev; struct net_device *net_dev = lp->dev;
unregister_netdev(net_dev); unregister_netdev(net_dev);
...@@ -1573,7 +1566,7 @@ static int __devexit sunlance_sbus_remove(struct of_device *dev) ...@@ -1573,7 +1566,7 @@ static int __devexit sunlance_sbus_remove(struct of_device *dev)
free_netdev(net_dev); free_netdev(net_dev);
dev_set_drvdata(&dev->dev, NULL); dev_set_drvdata(&op->dev, NULL);
return 0; return 0;
} }
...@@ -1598,7 +1591,7 @@ static struct of_platform_driver sunlance_sbus_driver = { ...@@ -1598,7 +1591,7 @@ static struct of_platform_driver sunlance_sbus_driver = {
/* Find all the lance cards on the system and initialize them */ /* Find all the lance cards on the system and initialize them */
static int __init sparc_lance_init(void) static int __init sparc_lance_init(void)
{ {
return of_register_driver(&sunlance_sbus_driver, &sbus_bus_type); return of_register_driver(&sunlance_sbus_driver, &of_bus_type);
} }
#endif /* !CONFIG_SUN4 */ #endif /* !CONFIG_SUN4 */
......
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