[netdrvr] ibmlana: move away from legacy MCA API
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
fbe02d6d87
commit
3df5920c46
|
@ -83,7 +83,7 @@ History:
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/mca-legacy.h>
|
#include <linux/mca.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
|
@ -161,13 +161,13 @@ static void PrTime(void)
|
||||||
|
|
||||||
/* deduce resources out of POS registers */
|
/* deduce resources out of POS registers */
|
||||||
|
|
||||||
static void getaddrs(int slot, int *base, int *memlen, int *iobase,
|
static void getaddrs(struct mca_device *mdev, int *base, int *memlen,
|
||||||
int *irq, ibmlana_medium * medium)
|
int *iobase, int *irq, ibmlana_medium *medium)
|
||||||
{
|
{
|
||||||
u_char pos0, pos1;
|
u_char pos0, pos1;
|
||||||
|
|
||||||
pos0 = mca_read_stored_pos(slot, 2);
|
pos0 = mca_device_read_stored_pos(mdev, 2);
|
||||||
pos1 = mca_read_stored_pos(slot, 3);
|
pos1 = mca_device_read_stored_pos(mdev, 3);
|
||||||
|
|
||||||
*base = 0xc0000 + ((pos1 & 0xf0) << 9);
|
*base = 0xc0000 + ((pos1 & 0xf0) << 9);
|
||||||
*memlen = (pos1 & 0x01) ? 0x8000 : 0x4000;
|
*memlen = (pos1 & 0x01) ? 0x8000 : 0x4000;
|
||||||
|
@ -744,6 +744,7 @@ static irqreturn_t irq_handler(int dummy, void *device)
|
||||||
|
|
||||||
/* MCA info */
|
/* MCA info */
|
||||||
|
|
||||||
|
#if 0 /* info available elsewhere, but this is kept for reference */
|
||||||
static int ibmlana_getinfo(char *buf, int slot, void *d)
|
static int ibmlana_getinfo(char *buf, int slot, void *d)
|
||||||
{
|
{
|
||||||
int len = 0, i;
|
int len = 0, i;
|
||||||
|
@ -771,6 +772,7 @@ static int ibmlana_getinfo(char *buf, int slot, void *d)
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* open driver. Means also initialization and start of LANCE */
|
/* open driver. Means also initialization and start of LANCE */
|
||||||
|
|
||||||
|
@ -894,19 +896,26 @@ static int ibmlana_irq;
|
||||||
static int ibmlana_io;
|
static int ibmlana_io;
|
||||||
static int startslot; /* counts through slots when probing multiple devices */
|
static int startslot; /* counts through slots when probing multiple devices */
|
||||||
|
|
||||||
static int ibmlana_probe(struct net_device **dev_out)
|
static short ibmlana_adapter_ids[] __initdata = {
|
||||||
|
IBM_LANA_ID,
|
||||||
|
0x0000
|
||||||
|
};
|
||||||
|
|
||||||
|
static char *ibmlana_adapter_names[] __initdata = {
|
||||||
|
"IBM LAN Adapter/A",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static int ibmlana_init_one(struct device *kdev)
|
||||||
{
|
{
|
||||||
|
struct mca_device *mdev = to_mca_device(kdev);
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
int slot, z, rc;
|
int slot = mdev->slot, z, rc;
|
||||||
int base = 0, irq = 0, iobase = 0, memlen = 0;
|
int base = 0, irq = 0, iobase = 0, memlen = 0;
|
||||||
ibmlana_priv *priv;
|
ibmlana_priv *priv;
|
||||||
ibmlana_medium medium;
|
ibmlana_medium medium;
|
||||||
DECLARE_MAC_BUF(mac);
|
DECLARE_MAC_BUF(mac);
|
||||||
|
|
||||||
/* can't work without an MCA bus ;-) */
|
|
||||||
if (MCA_bus == 0)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
dev = alloc_etherdev(sizeof(ibmlana_priv));
|
dev = alloc_etherdev(sizeof(ibmlana_priv));
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -917,25 +926,16 @@ static int ibmlana_probe(struct net_device **dev_out)
|
||||||
base = dev->mem_start;
|
base = dev->mem_start;
|
||||||
irq = dev->irq;
|
irq = dev->irq;
|
||||||
|
|
||||||
for (slot = startslot; (slot = mca_find_adapter(IBM_LANA_ID, slot)) != -1; slot++) {
|
/* deduce card addresses */
|
||||||
/* deduce card addresses */
|
getaddrs(mdev, &base, &memlen, &iobase, &irq, &medium);
|
||||||
getaddrs(slot, &base, &memlen, &iobase, &irq, &medium);
|
|
||||||
|
|
||||||
/* slot already in use ? */
|
/* were we looking for something different ? */
|
||||||
if (mca_is_adapter_used(slot))
|
if (dev->irq && dev->irq != irq) {
|
||||||
continue;
|
rc = -ENODEV;
|
||||||
/* were we looking for something different ? */
|
goto err_out;
|
||||||
if (dev->irq && dev->irq != irq)
|
|
||||||
continue;
|
|
||||||
if (dev->mem_start && dev->mem_start != base)
|
|
||||||
continue;
|
|
||||||
/* found something that matches */
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
if (dev->mem_start && dev->mem_start != base) {
|
||||||
/* nothing found ? */
|
rc = -ENODEV;
|
||||||
if (slot == -1) {
|
|
||||||
rc = (base != 0 || irq != 0) ? -ENXIO : -ENODEV;
|
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -952,11 +952,10 @@ static int ibmlana_probe(struct net_device **dev_out)
|
||||||
|
|
||||||
priv = netdev_priv(dev);
|
priv = netdev_priv(dev);
|
||||||
priv->slot = slot;
|
priv->slot = slot;
|
||||||
priv->realirq = irq;
|
priv->realirq = mca_device_transform_irq(mdev, irq);
|
||||||
priv->medium = medium;
|
priv->medium = medium;
|
||||||
spin_lock_init(&priv->lock);
|
spin_lock_init(&priv->lock);
|
||||||
|
|
||||||
|
|
||||||
/* set base + irq for this device (irq not allocated so far) */
|
/* set base + irq for this device (irq not allocated so far) */
|
||||||
|
|
||||||
dev->irq = 0;
|
dev->irq = 0;
|
||||||
|
@ -972,18 +971,14 @@ static int ibmlana_probe(struct net_device **dev_out)
|
||||||
goto err_out_reg;
|
goto err_out_reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make procfs entries */
|
mca_device_set_name(mdev, ibmlana_adapter_names[mdev->index]);
|
||||||
mca_set_adapter_name(slot, "IBM LAN Adapter/A");
|
mca_device_set_claim(mdev, 1);
|
||||||
mca_set_adapter_procfn(slot, (MCA_ProcFn) ibmlana_getinfo, dev);
|
|
||||||
|
|
||||||
mca_mark_as_used(slot);
|
|
||||||
|
|
||||||
/* set methods */
|
/* set methods */
|
||||||
|
|
||||||
dev->open = ibmlana_open;
|
dev->open = ibmlana_open;
|
||||||
dev->stop = ibmlana_close;
|
dev->stop = ibmlana_close;
|
||||||
dev->hard_start_xmit = ibmlana_tx;
|
dev->hard_start_xmit = ibmlana_tx;
|
||||||
dev->do_ioctl = NULL;
|
|
||||||
dev->set_multicast_list = ibmlana_set_multicast_list;
|
dev->set_multicast_list = ibmlana_set_multicast_list;
|
||||||
dev->flags |= IFF_MULTICAST;
|
dev->flags |= IFF_MULTICAST;
|
||||||
|
|
||||||
|
@ -1013,13 +1008,11 @@ static int ibmlana_probe(struct net_device **dev_out)
|
||||||
if (rc)
|
if (rc)
|
||||||
goto err_out_claimed;
|
goto err_out_claimed;
|
||||||
|
|
||||||
*dev_out = dev;
|
dev_set_drvdata(kdev, dev);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_out_claimed:
|
err_out_claimed:
|
||||||
mca_mark_as_unused(priv->slot);
|
mca_device_set_claim(mdev, 0);
|
||||||
mca_set_adapter_name(priv->slot, "");
|
|
||||||
mca_set_adapter_procfn(priv->slot, NULL, NULL);
|
|
||||||
iounmap(priv->base);
|
iounmap(priv->base);
|
||||||
err_out_reg:
|
err_out_reg:
|
||||||
release_region(iobase, IBM_LANA_IORANGE);
|
release_region(iobase, IBM_LANA_IORANGE);
|
||||||
|
@ -1028,59 +1021,49 @@ err_out:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ibmlana_remove_one(struct net_device *_dev)
|
static int ibmlana_remove_one(struct device *kdev)
|
||||||
{
|
{
|
||||||
struct net_device *dev = _dev;
|
struct mca_device *mdev = to_mca_device(kdev);
|
||||||
|
struct net_device *dev = dev_get_drvdata(kdev);
|
||||||
ibmlana_priv *priv = netdev_priv(dev);
|
ibmlana_priv *priv = netdev_priv(dev);
|
||||||
|
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
/*DeinitBoard(dev); */
|
/*DeinitBoard(dev); */
|
||||||
release_region(dev->base_addr, IBM_LANA_IORANGE);
|
release_region(dev->base_addr, IBM_LANA_IORANGE);
|
||||||
mca_mark_as_unused(priv->slot);
|
mca_device_set_claim(mdev, 0);
|
||||||
mca_set_adapter_name(priv->slot, "");
|
|
||||||
mca_set_adapter_procfn(priv->slot, NULL, NULL);
|
|
||||||
iounmap(priv->base);
|
iounmap(priv->base);
|
||||||
free_netdev(dev);
|
free_netdev(dev);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------
|
||||||
* modularization support
|
* modularization support
|
||||||
* ------------------------------------------------------------------------ */
|
* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
#define DEVMAX 5
|
|
||||||
|
|
||||||
static struct net_device *moddevs[DEVMAX];
|
|
||||||
|
|
||||||
module_param_named(irq, ibmlana_irq, int, 0);
|
module_param_named(irq, ibmlana_irq, int, 0);
|
||||||
module_param_named(io, ibmlana_io, int, 0);
|
module_param_named(io, ibmlana_io, int, 0);
|
||||||
MODULE_PARM_DESC(irq, "IBM LAN/A IRQ number");
|
MODULE_PARM_DESC(irq, "IBM LAN/A IRQ number");
|
||||||
MODULE_PARM_DESC(io, "IBM LAN/A I/O base address");
|
MODULE_PARM_DESC(io, "IBM LAN/A I/O base address");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
|
static struct mca_driver ibmlana_driver = {
|
||||||
|
.id_table = ibmlana_adapter_ids,
|
||||||
|
.driver = {
|
||||||
|
.name = "ibmlana",
|
||||||
|
.bus = &mca_bus_type,
|
||||||
|
.probe = ibmlana_init_one,
|
||||||
|
.remove = ibmlana_remove_one,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static int __init ibmlana_init_module(void)
|
static int __init ibmlana_init_module(void)
|
||||||
{
|
{
|
||||||
int z;
|
return mca_register_driver(&ibmlana_driver);
|
||||||
|
|
||||||
startslot = 0;
|
|
||||||
for (z = 0; z < DEVMAX; z++) {
|
|
||||||
struct net_device *dev = NULL;
|
|
||||||
|
|
||||||
if (ibmlana_probe(&dev))
|
|
||||||
break;
|
|
||||||
|
|
||||||
moddevs[z] = dev;
|
|
||||||
}
|
|
||||||
return (z > 0) ? 0 : -EIO;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit ibmlana_cleanup_module(void)
|
static void __exit ibmlana_cleanup_module(void)
|
||||||
{
|
{
|
||||||
int z;
|
mca_unregister_driver(&ibmlana_driver);
|
||||||
for (z = 0; z < DEVMAX; z++) {
|
|
||||||
struct net_device *dev = moddevs[z];
|
|
||||||
if (dev)
|
|
||||||
ibmlana_remove_one(dev);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(ibmlana_init_module);
|
module_init(ibmlana_init_module);
|
||||||
|
|
Loading…
Reference in New Issue