[PATCH] tms380tr: move to DMA API
This patch makes tms380tr use the new DMA API. Now that on Alpha, this API also supports bus master DMA for ISA (platform) devices, i changed the driver to use this new API. This also works around a bug in the firmware loader: The example provided in Documentation/firmware_class no longer works, as the firmware loader now calls get_kobj_path_length() and the kernel promptly oopses, as the home-grown device doesn't have a parent. Of course, this doesn't happen with a "real" device which has its bus (or pseudo bus in the case of platform) as parent. Converted tms380tr to use new DMA API: - proteon.c, skisa.c: use platform pseudo bus to create a struct device - Space.c: delete init hooks - abyss.c, tmspci.c: pass struct device to tms380tr.c - tms380tr.c, tms380tr.h: new DMA API, use real device fo firmware loader Signed-off-by: Jochen Friedrich <jochen@scram.de> Cc: Jeff Garzik <jgarzik@pobox.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
This commit is contained in:
committed by
Jeff Garzik
parent
6b38aefe92
commit
504ff16cec
@@ -68,8 +68,7 @@ static int dmalist[] __initdata = {
|
||||
};
|
||||
|
||||
static char isa_cardname[] = "SK NET TR 4/16 ISA\0";
|
||||
|
||||
struct net_device *sk_isa_probe(int unit);
|
||||
static u64 dma_mask = ISA_MAX_ADDRESS;
|
||||
static int sk_isa_open(struct net_device *dev);
|
||||
static void sk_isa_read_eeprom(struct net_device *dev);
|
||||
static unsigned short sk_isa_setnselout_pins(struct net_device *dev);
|
||||
@@ -133,7 +132,7 @@ static int __init sk_isa_probe1(struct net_device *dev, int ioaddr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init setup_card(struct net_device *dev)
|
||||
static int __init setup_card(struct net_device *dev, struct device *pdev)
|
||||
{
|
||||
struct net_local *tp;
|
||||
static int versionprinted;
|
||||
@@ -154,7 +153,7 @@ static int __init setup_card(struct net_device *dev)
|
||||
}
|
||||
}
|
||||
if (err)
|
||||
goto out4;
|
||||
goto out5;
|
||||
|
||||
/* At this point we have found a valid card. */
|
||||
|
||||
@@ -162,14 +161,15 @@ static int __init setup_card(struct net_device *dev)
|
||||
printk(KERN_DEBUG "%s", version);
|
||||
|
||||
err = -EIO;
|
||||
if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL))
|
||||
pdev->dma_mask = &dma_mask;
|
||||
if (tmsdev_init(dev, ISA_MAX_ADDRESS, pdev))
|
||||
goto out4;
|
||||
|
||||
dev->base_addr &= ~3;
|
||||
|
||||
sk_isa_read_eeprom(dev);
|
||||
|
||||
printk(KERN_DEBUG "%s: Ring Station Address: ", dev->name);
|
||||
printk(KERN_DEBUG "skisa.c: Ring Station Address: ");
|
||||
printk("%2.2x", dev->dev_addr[0]);
|
||||
for (j = 1; j < 6; j++)
|
||||
printk(":%2.2x", dev->dev_addr[j]);
|
||||
@@ -202,7 +202,7 @@ static int __init setup_card(struct net_device *dev)
|
||||
|
||||
if(irqlist[j] == 0)
|
||||
{
|
||||
printk(KERN_INFO "%s: AutoSelect no IRQ available\n", dev->name);
|
||||
printk(KERN_INFO "skisa.c: AutoSelect no IRQ available\n");
|
||||
goto out3;
|
||||
}
|
||||
}
|
||||
@@ -213,15 +213,15 @@ static int __init setup_card(struct net_device *dev)
|
||||
break;
|
||||
if (irqlist[j] == 0)
|
||||
{
|
||||
printk(KERN_INFO "%s: Illegal IRQ %d specified\n",
|
||||
dev->name, dev->irq);
|
||||
printk(KERN_INFO "skisa.c: Illegal IRQ %d specified\n",
|
||||
dev->irq);
|
||||
goto out3;
|
||||
}
|
||||
if (request_irq(dev->irq, tms380tr_interrupt, 0,
|
||||
isa_cardname, dev))
|
||||
{
|
||||
printk(KERN_INFO "%s: Selected IRQ %d not available\n",
|
||||
dev->name, dev->irq);
|
||||
printk(KERN_INFO "skisa.c: Selected IRQ %d not available\n",
|
||||
dev->irq);
|
||||
goto out3;
|
||||
}
|
||||
}
|
||||
@@ -237,7 +237,7 @@ static int __init setup_card(struct net_device *dev)
|
||||
|
||||
if(dmalist[j] == 0)
|
||||
{
|
||||
printk(KERN_INFO "%s: AutoSelect no DMA available\n", dev->name);
|
||||
printk(KERN_INFO "skisa.c: AutoSelect no DMA available\n");
|
||||
goto out2;
|
||||
}
|
||||
}
|
||||
@@ -248,25 +248,25 @@ static int __init setup_card(struct net_device *dev)
|
||||
break;
|
||||
if (dmalist[j] == 0)
|
||||
{
|
||||
printk(KERN_INFO "%s: Illegal DMA %d specified\n",
|
||||
dev->name, dev->dma);
|
||||
printk(KERN_INFO "skisa.c: Illegal DMA %d specified\n",
|
||||
dev->dma);
|
||||
goto out2;
|
||||
}
|
||||
if (request_dma(dev->dma, isa_cardname))
|
||||
{
|
||||
printk(KERN_INFO "%s: Selected DMA %d not available\n",
|
||||
dev->name, dev->dma);
|
||||
printk(KERN_INFO "skisa.c: Selected DMA %d not available\n",
|
||||
dev->dma);
|
||||
goto out2;
|
||||
}
|
||||
}
|
||||
|
||||
printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n",
|
||||
dev->name, dev->base_addr, dev->irq, dev->dma);
|
||||
|
||||
err = register_netdev(dev);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n",
|
||||
dev->name, dev->base_addr, dev->irq, dev->dma);
|
||||
|
||||
return 0;
|
||||
out:
|
||||
free_dma(dev->dma);
|
||||
@@ -275,33 +275,11 @@ out2:
|
||||
out3:
|
||||
tmsdev_term(dev);
|
||||
out4:
|
||||
release_region(dev->base_addr, SK_ISA_IO_EXTENT);
|
||||
release_region(dev->base_addr, SK_ISA_IO_EXTENT);
|
||||
out5:
|
||||
return err;
|
||||
}
|
||||
|
||||
struct net_device * __init sk_isa_probe(int unit)
|
||||
{
|
||||
struct net_device *dev = alloc_trdev(sizeof(struct net_local));
|
||||
int err = 0;
|
||||
|
||||
if (!dev)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
if (unit >= 0) {
|
||||
sprintf(dev->name, "tr%d", unit);
|
||||
netdev_boot_setup_check(dev);
|
||||
}
|
||||
|
||||
err = setup_card(dev);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
return dev;
|
||||
out:
|
||||
free_netdev(dev);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reads MAC address from adapter RAM, which should've read it from
|
||||
* the onboard ROM.
|
||||
@@ -361,8 +339,6 @@ static int sk_isa_open(struct net_device *dev)
|
||||
return tms380tr_open(dev);
|
||||
}
|
||||
|
||||
#ifdef MODULE
|
||||
|
||||
#define ISATR_MAX_ADAPTERS 3
|
||||
|
||||
static int io[ISATR_MAX_ADAPTERS];
|
||||
@@ -375,13 +351,23 @@ module_param_array(io, int, NULL, 0);
|
||||
module_param_array(irq, int, NULL, 0);
|
||||
module_param_array(dma, int, NULL, 0);
|
||||
|
||||
static struct net_device *sk_isa_dev[ISATR_MAX_ADAPTERS];
|
||||
static struct platform_device *sk_isa_dev[ISATR_MAX_ADAPTERS];
|
||||
|
||||
int init_module(void)
|
||||
static struct device_driver sk_isa_driver = {
|
||||
.name = "skisa",
|
||||
.bus = &platform_bus_type,
|
||||
};
|
||||
|
||||
static int __init sk_isa_init(void)
|
||||
{
|
||||
struct net_device *dev;
|
||||
struct platform_device *pdev;
|
||||
int i, num = 0, err = 0;
|
||||
|
||||
err = driver_register(&sk_isa_driver);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
|
||||
dev = alloc_trdev(sizeof(struct net_local));
|
||||
if (!dev)
|
||||
@@ -390,12 +376,15 @@ int init_module(void)
|
||||
dev->base_addr = io[i];
|
||||
dev->irq = irq[i];
|
||||
dev->dma = dma[i];
|
||||
err = setup_card(dev);
|
||||
|
||||
pdev = platform_device_register_simple("skisa",
|
||||
i, NULL, 0);
|
||||
err = setup_card(dev, &pdev->dev);
|
||||
if (!err) {
|
||||
sk_isa_dev[i] = dev;
|
||||
sk_isa_dev[i] = pdev;
|
||||
dev_set_drvdata(&sk_isa_dev[i]->dev, dev);
|
||||
++num;
|
||||
} else {
|
||||
platform_device_unregister(pdev);
|
||||
free_netdev(dev);
|
||||
}
|
||||
}
|
||||
@@ -409,23 +398,28 @@ int init_module(void)
|
||||
return (0);
|
||||
}
|
||||
|
||||
void cleanup_module(void)
|
||||
static void __exit sk_isa_cleanup(void)
|
||||
{
|
||||
struct net_device *dev;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
|
||||
struct net_device *dev = sk_isa_dev[i];
|
||||
struct platform_device *pdev = sk_isa_dev[i];
|
||||
|
||||
if (!dev)
|
||||
if (!pdev)
|
||||
continue;
|
||||
|
||||
dev = dev_get_drvdata(&pdev->dev);
|
||||
unregister_netdev(dev);
|
||||
release_region(dev->base_addr, SK_ISA_IO_EXTENT);
|
||||
free_irq(dev->irq, dev);
|
||||
free_dma(dev->dma);
|
||||
tmsdev_term(dev);
|
||||
free_netdev(dev);
|
||||
dev_set_drvdata(&pdev->dev, NULL);
|
||||
platform_device_unregister(pdev);
|
||||
}
|
||||
driver_unregister(&sk_isa_driver);
|
||||
}
|
||||
#endif /* MODULE */
|
||||
|
||||
module_init(sk_isa_init);
|
||||
module_exit(sk_isa_cleanup);
|
||||
|
Reference in New Issue
Block a user