Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 84c3ea01 authored by Jochen Friedrich's avatar Jochen Friedrich Committed by Jeff Garzik
Browse files

[netdrvr] Convert madgemc to new MCA API.



Now that all tms380 devices have a valid
struct device with dma_mask, remove dmalimit from tmsdev_init().

Kconfig: depend tms380tr and madgemc on MCA.
abyss.c, proteon.c, skisa.c, tmspci.c, tms380tr.h:
  remove dmalimit parameter from tmsdev_init().
tms380tr.c: use device->dma_mask instead of dmalimit.
madgemc.c: move to new MCA API using struct device.

Signed-off-by: default avatarJochen Friedrich <jochen@scram.de>
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 9f7f0098
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ config 3C359

config TMS380TR
	tristate "Generic TMS380 Token Ring ISA/PCI adapter support"
	depends on TR && (PCI || ISA)
	depends on TR && (PCI || ISA || MCA)
	select FW_LOADER
	---help---
	  This driver provides generic support for token ring adapters
@@ -158,7 +158,7 @@ config ABYSS

config MADGEMC
	tristate "Madge Smart 16/4 Ringnode MicroChannel"
	depends on TR && TMS380TR && MCA_LEGACY
	depends on TR && TMS380TR && MCA
	help
	  This tms380 module supports the Madge Smart 16/4 MC16 and MC32
	  MicroChannel adapters.
+1 −1
Original line number Diff line number Diff line
@@ -139,7 +139,7 @@ static int __devinit abyss_attach(struct pci_dev *pdev, const struct pci_device_
	 */
	dev->base_addr += 0x10;
		
	ret = tmsdev_init(dev, PCI_MAX_ADDRESS, &pdev->dev);
	ret = tmsdev_init(dev, &pdev->dev);
	if (ret) {
		printk("%s: unable to get memory for dev->priv.\n", 
		       dev->name);
+259 −262
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@
static const char version[] = "madgemc.c: v0.91 23/01/2000 by Adam Fritzler\n";

#include <linux/module.h>
#include <linux/mca-legacy.h>
#include <linux/mca.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/pci.h>
@@ -38,9 +38,7 @@ static const char version[] = "madgemc.c: v0.91 23/01/2000 by Adam Fritzler\n";
#define MADGEMC_IO_EXTENT 32
#define MADGEMC_SIF_OFFSET 0x08

struct madgemc_card {
	struct net_device *dev;

struct card_info {
	/*
	 * These are read from the BIA ROM.
	 */
@@ -57,16 +55,12 @@ struct madgemc_card {
	unsigned int arblevel:4;
	unsigned int ringspeed:2; /* 0 = 4mb, 1 = 16, 2 = Auto/none */
	unsigned int cabletype:1; /* 0 = RJ45, 1 = DB9 */

	struct madgemc_card *next;
};
static struct madgemc_card *madgemc_card_list;


static int madgemc_open(struct net_device *dev);
static int madgemc_close(struct net_device *dev);
static int madgemc_chipset_init(struct net_device *dev);
static void madgemc_read_rom(struct madgemc_card *card);
static void madgemc_read_rom(struct net_device *dev, struct card_info *card);
static unsigned short madgemc_setnselout_pins(struct net_device *dev);
static void madgemc_setcabletype(struct net_device *dev, int type);

@@ -151,58 +145,39 @@ static void madgemc_sifwritew(struct net_device *dev, unsigned short val, unsign



static int __init madgemc_probe(void)
static int __devinit madgemc_probe(struct device *device)
{	
	static int versionprinted;
	struct net_device *dev;
	struct net_local *tp;
	struct madgemc_card *card;
	int i,slot = 0;
	__u8 posreg[4];

	if (!MCA_bus)
		return -1;	
 
	while (slot != MCA_NOTFOUND) {
		/*
		 * Currently we only support the MC16/32 (MCA ID 002d)
		 */
		slot = mca_find_unused_adapter(0x002d, slot);
		if (slot == MCA_NOTFOUND)
			break;
	struct card_info *card;
	struct mca_device *mdev = to_mca_device(device);
	int ret = 0, i = 0;

		/*
		 * If we get here, we have an adapter.
		 */
	if (versionprinted++ == 0)
		printk("%s", version);

	if(mca_device_claimed(mdev))
		return -EBUSY;
	mca_device_set_claim(mdev, 1);

	dev = alloc_trdev(sizeof(struct net_local));
		if (dev == NULL) {
	if (!dev) {
		printk("madgemc: unable to allocate dev space\n");
			if (madgemc_card_list)
				return 0;
			return -1;
		mca_device_set_claim(mdev, 0);
		ret = -ENOMEM;
		goto getout;
	}

	SET_MODULE_OWNER(dev);
	dev->dma = 0;

		/*
		 * Fetch MCA config registers
		 */
		for(i=0;i<4;i++)
			posreg[i] = mca_read_stored_pos(slot, i+2);
		
		card = kmalloc(sizeof(struct madgemc_card), GFP_KERNEL);
	card = kmalloc(sizeof(struct card_info), GFP_KERNEL);
	if (card==NULL) {
		printk("madgemc: unable to allocate card struct\n");
			free_netdev(dev);
			if (madgemc_card_list)
				return 0;
			return -1;
		ret = -ENOMEM;
		goto getout1;
	}
		card->dev = dev;

	/*
	 * Parse configuration information.  This all comes
@@ -214,14 +189,14 @@ static int __init madgemc_probe(void)
	 * Base address 
	 */
	dev->base_addr = 0x0a20 + 
			((posreg[2] & MC16_POS2_ADDR2)?0x0400:0) +
			((posreg[0] & MC16_POS0_ADDR1)?0x1000:0) +
			((posreg[3] & MC16_POS3_ADDR3)?0x2000:0);
		((mdev->pos[2] & MC16_POS2_ADDR2)?0x0400:0) +
		((mdev->pos[0] & MC16_POS0_ADDR1)?0x1000:0) +
		((mdev->pos[3] & MC16_POS3_ADDR3)?0x2000:0);

	/*
	 * Interrupt line
	 */
		switch(posreg[0] >> 6) { /* upper two bits */
	switch(mdev->pos[0] >> 6) { /* upper two bits */
		case 0x1: dev->irq = 3; break;
		case 0x2: dev->irq = 9; break; /* IRQ 2 = IRQ 9 */
		case 0x3: dev->irq = 10; break;
@@ -230,34 +205,36 @@ static int __init madgemc_probe(void)

	if (dev->irq == 0) {
		printk("%s: invalid IRQ\n", dev->name);
			goto getout1;
		ret = -EBUSY;
		goto getout2;
	}

	if (!request_region(dev->base_addr, MADGEMC_IO_EXTENT, 
			   "madgemc")) {
			printk(KERN_INFO "madgemc: unable to setup Smart MC in slot %d because of I/O base conflict at 0x%04lx\n", slot, dev->base_addr);
		printk(KERN_INFO "madgemc: unable to setup Smart MC in slot %d because of I/O base conflict at 0x%04lx\n", mdev->slot, dev->base_addr);
		dev->base_addr += MADGEMC_SIF_OFFSET;
			goto getout1;
		ret = -EBUSY;
		goto getout2;
	}
	dev->base_addr += MADGEMC_SIF_OFFSET;
	
	/*
	 * Arbitration Level
	 */
		card->arblevel = ((posreg[0] >> 1) & 0x7) + 8;
	card->arblevel = ((mdev->pos[0] >> 1) & 0x7) + 8;

	/*
	 * Burst mode and Fairness
	 */
		card->burstmode = ((posreg[2] >> 6) & 0x3);
		card->fairness = ((posreg[2] >> 4) & 0x1);
	card->burstmode = ((mdev->pos[2] >> 6) & 0x3);
	card->fairness = ((mdev->pos[2] >> 4) & 0x1);

	/*
	 * Ring Speed
	 */
		if ((posreg[1] >> 2)&0x1)
	if ((mdev->pos[1] >> 2)&0x1)
		card->ringspeed = 2; /* not selected */
		else if ((posreg[2] >> 5) & 0x1)
	else if ((mdev->pos[2] >> 5) & 0x1)
		card->ringspeed = 1; /* 16Mb */
	else
		card->ringspeed = 0; /* 4Mb */
@@ -265,7 +242,7 @@ static int __init madgemc_probe(void)
	/* 
	 * Cable type
	 */
		if ((posreg[1] >> 6)&0x1)
	if ((mdev->pos[1] >> 6)&0x1)
		card->cabletype = 1; /* STP/DB9 */
	else
		card->cabletype = 0; /* UTP/RJ-45 */
@@ -276,16 +253,17 @@ static int __init madgemc_probe(void)
	 * bits on the card, so we must ensure above that 
	 * the base address is free of conflict (request_region above).
	 */
		madgemc_read_rom(card);
	madgemc_read_rom(dev, card);
		
	if (card->manid != 0x4d) { /* something went wrong */
		printk(KERN_INFO "%s: Madge MC ROM read failed (unknown manufacturer ID %02x)\n", dev->name, card->manid);
			goto getout;
		goto getout3;
	}
		
	if ((card->cardtype != 0x08) && (card->cardtype != 0x0d)) {
		printk(KERN_INFO "%s: Madge MC ROM read failed (unknown card ID %02x)\n", dev->name, card->cardtype);
			goto getout;
		ret = -EIO;
		goto getout3;
	}
	       
	/* All cards except Rev 0 and 1 MC16's have 256kb of RAM */
@@ -334,16 +312,17 @@ static int __init madgemc_probe(void)
	outb(0, dev->base_addr + MC_CONTROL_REG0); /* sanity */
	madgemc_setsifsel(dev, 1);
	if (request_irq(dev->irq, madgemc_interrupt, SA_SHIRQ,
			       "madgemc", dev)) 
			goto getout;
		       "madgemc", dev)) {
		ret = -EBUSY;
		goto getout3;
	}

	madgemc_chipset_init(dev); /* enables interrupts! */
	madgemc_setcabletype(dev, card->cabletype);

	/* Setup MCA structures */
		mca_set_adapter_name(slot, (card->cardtype == 0x08)?MADGEMC16_CARDNAME:MADGEMC32_CARDNAME);
		mca_set_adapter_procfn(slot, madgemc_mcaproc, dev);
		mca_mark_as_used(slot);
	mca_device_set_name(mdev, (card->cardtype == 0x08)?MADGEMC16_CARDNAME:MADGEMC32_CARDNAME);
	mca_set_adapter_procfn(mdev->slot, madgemc_mcaproc, dev);

	printk("%s:     Ring Station Address: ", dev->name);
	printk("%2.2x", dev->dev_addr[0]);
@@ -351,19 +330,11 @@ static int __init madgemc_probe(void)
		printk(":%2.2x", dev->dev_addr[i]);
	printk("\n");

		/* XXX is ISA_MAX_ADDRESS correct here? */
		if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL)) {
	if (tmsdev_init(dev, device)) {
		printk("%s: unable to get memory for dev->priv.\n", 
		       dev->name);
			release_region(dev->base_addr-MADGEMC_SIF_OFFSET, 
			       MADGEMC_IO_EXTENT); 
			
			kfree(card);
			tmsdev_term(dev);
			free_netdev(dev);
			if (madgemc_card_list)
				return 0;
			return -1;
		ret = -ENOMEM;
		goto getout4;
	}
	tp = netdev_priv(dev);

@@ -385,27 +356,26 @@ static int __init madgemc_probe(void)
	dev->open = madgemc_open;
	dev->stop = madgemc_close;

		if (register_netdev(dev) == 0) {
			/* Enlist in the card list */
			card->next = madgemc_card_list;
			madgemc_card_list = card;
			slot++;
			continue; /* successful, try to find another */
		}
	tp->tmspriv = card;
	dev_set_drvdata(device, dev);

	if (register_netdev(dev) == 0)
		return 0;

	dev_set_drvdata(device, NULL);
	ret = -ENOMEM;
getout4:
	free_irq(dev->irq, dev);
	getout:
getout3:
	release_region(dev->base_addr-MADGEMC_SIF_OFFSET, 
		       MADGEMC_IO_EXTENT); 
	getout1:
getout2:
	kfree(card);
getout1:
	free_netdev(dev);
		slot++;
	}

	if (madgemc_card_list)
		return 0;
	return -1;
getout:
	mca_device_set_claim(mdev, 0);
	return ret;
}

/*
@@ -664,12 +634,12 @@ static void madgemc_chipset_close(struct net_device *dev)
 * is complete.
 *
 */
static void madgemc_read_rom(struct madgemc_card *card)
static void madgemc_read_rom(struct net_device *dev, struct card_info *card)
{
	unsigned long ioaddr;
	unsigned char reg0, reg1, tmpreg0, i;

	ioaddr = card->dev->base_addr;
	ioaddr = dev->base_addr;

	reg0 = inb(ioaddr + MC_CONTROL_REG0);
	reg1 = inb(ioaddr + MC_CONTROL_REG1);
@@ -686,9 +656,9 @@ static void madgemc_read_rom(struct madgemc_card *card)
	outb(tmpreg0 | MC_CONTROL_REG0_PAGE, ioaddr + MC_CONTROL_REG0);

	/* Read BIA */
	card->dev->addr_len = 6;
	dev->addr_len = 6;
	for (i = 0; i < 6; i++)
		card->dev->dev_addr[i] = inb(ioaddr + MC_ROM_BIA_START + i);
		dev->dev_addr[i] = inb(ioaddr + MC_ROM_BIA_START + i);
	
	/* Restore original register values */
	outb(reg0, ioaddr + MC_CONTROL_REG0);
@@ -721,14 +691,10 @@ static int madgemc_close(struct net_device *dev)
static int madgemc_mcaproc(char *buf, int slot, void *d) 
{	
	struct net_device *dev = (struct net_device *)d;
	struct madgemc_card *curcard = madgemc_card_list;
	struct net_local *tp = dev->priv;
	struct card_info *curcard = tp->tmspriv;
	int len = 0;
	
	while (curcard) { /* search for card struct */
		if (curcard->dev == dev)
			break;
		curcard = curcard->next;
	}
	len += sprintf(buf+len, "-------\n");
	if (curcard) {
		struct net_local *tp = netdev_priv(dev);
@@ -763,25 +729,56 @@ static int madgemc_mcaproc(char *buf, int slot, void *d)
	return len;
}

static void __exit madgemc_exit(void)
static int __devexit madgemc_remove(struct device *device)
{
	struct net_device *dev;
	struct madgemc_card *this_card;
	struct net_device *dev = dev_get_drvdata(device);
	struct net_local *tp;
        struct card_info *card;

	if (!dev)
		BUG();

	tp = dev->priv;
	card = tp->tmspriv;
	kfree(card);
	tp->tmspriv = NULL;

	while (madgemc_card_list) {
		dev = madgemc_card_list->dev;
	unregister_netdev(dev);
	release_region(dev->base_addr-MADGEMC_SIF_OFFSET, MADGEMC_IO_EXTENT);
	free_irq(dev->irq, dev);
	tmsdev_term(dev);
	free_netdev(dev);
		this_card = madgemc_card_list;
		madgemc_card_list = this_card->next;
		kfree(this_card);
	dev_set_drvdata(device, NULL);

	return 0;
}

static short madgemc_adapter_ids[] __initdata = {
	0x002d,
	0x0000
};

static struct mca_driver madgemc_driver = {
	.id_table = madgemc_adapter_ids,
	.driver = {
		.name = "madgemc",
		.bus = &mca_bus_type,
		.probe = madgemc_probe,
		.remove = __devexit_p(madgemc_remove),
	},
};

static int __init madgemc_init (void)
{
	return mca_register_driver (&madgemc_driver);
}

static void __exit madgemc_exit (void)
{
	mca_unregister_driver (&madgemc_driver);
}

module_init(madgemc_probe);
module_init(madgemc_init);
module_exit(madgemc_exit);

MODULE_LICENSE("GPL");
+1 −1
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ static int __init setup_card(struct net_device *dev, struct device *pdev)

	err = -EIO;
	pdev->dma_mask = &dma_mask;
	if (tmsdev_init(dev, ISA_MAX_ADDRESS, pdev))
	if (tmsdev_init(dev, pdev))
		goto out4;

	dev->base_addr &= ~3; 
+1 −1
Original line number Diff line number Diff line
@@ -162,7 +162,7 @@ static int __init setup_card(struct net_device *dev, struct device *pdev)

	err = -EIO;
	pdev->dma_mask = &dma_mask;
	if (tmsdev_init(dev, ISA_MAX_ADDRESS, pdev))
	if (tmsdev_init(dev, pdev))
		goto out4;

	dev->base_addr &= ~3; 
Loading