diff options
Diffstat (limited to 'drivers/net/cs89x0.c')
-rw-r--r-- | drivers/net/cs89x0.c | 57 |
1 files changed, 41 insertions, 16 deletions
diff --git a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c index b83a1905e..63e190a36 100644 --- a/drivers/net/cs89x0.c +++ b/drivers/net/cs89x0.c @@ -74,13 +74,14 @@ : Use SET_MODULE_OWNER() : Tidied up strange request_irq() abuse in net_open(). -*/ - -static char version[] = -"cs89x0.c: v2.4.0-test11-pre4 Russell Nelson <nelson@crynwr.com>, Andrew Morton <andrewm@uow.edu.au>\n"; - -/* ======================= end of configuration ======================= */ + Andrew Morton : Kernel 2.4.3-pre1 + : Request correct number of pages for DMA (Hugh Dickens) + : Select PP_ChipID _after_ unregister_netdev in cleanup_module() + : because unregister_netdev() calls get_stats. + : Make `version[]' __initdata + : Uninlined the read/write reg/word functions. +*/ /* Always include 'config.h' first in case the user wants to turn on or override something. */ @@ -121,6 +122,7 @@ static char version[] = #include <linux/in.h> #include <linux/slab.h> #include <linux/string.h> +#include <linux/init.h> #include <asm/system.h> #include <asm/bitops.h> #include <asm/io.h> @@ -137,6 +139,9 @@ static char version[] = #include "cs89x0.h" +static char version[] __initdata = +"cs89x0.c: v2.4.3-pre1 Russell Nelson <nelson@crynwr.com>, Andrew Morton <andrewm@uow.edu.au>\n"; + /* First, a few definitions that the brave might change. A zero-terminated list of I/O addresses to be probed. Some special flags.. Addr & 1 = Read back the address port, look for signature and reset @@ -260,7 +265,7 @@ int __init cs89x0_probe(struct net_device *dev) SET_MODULE_OWNER(dev); if (net_debug) - printk("cs89x0:cs89x0_probe()\n"); + printk("cs89x0:cs89x0_probe(0x%x)\n", base_addr); if (base_addr > 0x1ff) /* Check a single specified location. */ return cs89x0_probe1(dev, base_addr); @@ -275,27 +280,27 @@ int __init cs89x0_probe(struct net_device *dev) return -ENODEV; } -extern int inline +static int readreg(struct net_device *dev, int portno) { outw(portno, dev->base_addr + ADD_PORT); return inw(dev->base_addr + DATA_PORT); } -extern void inline +static void writereg(struct net_device *dev, int portno, int value) { outw(portno, dev->base_addr + ADD_PORT); outw(value, dev->base_addr + DATA_PORT); } -extern int inline +static int readword(struct net_device *dev, int portno) { return inw(dev->base_addr + portno); } -extern void inline +static void writeword(struct net_device *dev, int portno, int value) { outw(value, dev->base_addr + portno); @@ -383,7 +388,9 @@ cs89x0_probe1(struct net_device *dev, int ioaddr) lp = (struct net_local *)dev->priv; /* Grab the region so we can find another board if autoIRQ fails. */ - if (!request_region(ioaddr, NETCARD_IO_EXTENT, dev->name)) { + if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, dev->name)) { + printk(KERN_ERR "%s: request_region(0x%x, 0x%x) failed\n", + dev->name, ioaddr, NETCARD_IO_EXTENT); retval = -EBUSY; goto out1; } @@ -393,16 +400,23 @@ cs89x0_probe1(struct net_device *dev, int ioaddr) expect to find the EISA signature word. An IO with a base of 0x3 will skip the test for the ADD_PORT. */ if (ioaddr & 1) { + if (net_debug > 1) + printk(KERN_INFO "%s: odd ioaddr 0x%x\n", dev->name, ioaddr); if ((ioaddr & 2) != 2) if ((inw((ioaddr & ~3)+ ADD_PORT) & ADD_MASK) != ADD_SIG) { + printk(KERN_ERR "%s: bad signature 0x%x\n", + dev->name, inw((ioaddr & ~3)+ ADD_PORT)); retval = -ENODEV; goto out2; } ioaddr &= ~3; outw(PP_ChipID, ioaddr + ADD_PORT); } +printk("PP_addr=0x%x\n", inw(ioaddr + ADD_PORT)); if (inw(ioaddr + DATA_PORT) != CHIP_EISA_ID_SIG) { + printk(KERN_ERR "%s: incorrect signature 0x%x\n", + dev->name, inw(ioaddr + DATA_PORT)); retval = -ENODEV; goto out2; } @@ -480,6 +494,10 @@ cs89x0_probe1(struct net_device *dev, int ioaddr) lp->adapter_cnf |= A_CNF_AUI | A_CNF_10B_T | A_CNF_MEDIA_AUI | A_CNF_MEDIA_10B_T | A_CNF_MEDIA_AUTO; + if (net_debug > 1) + printk(KERN_INFO "%s: PP_LineCTL=0x%x, adapter_cnf=0x%x\n", + dev->name, i, lp->adapter_cnf); + /* IRQ. Other chips already probe, see below. */ if (lp->chip_type == CS8900) lp->isa_config = readreg(dev, PP_CS8900_ISAINT) & INT_NO_MASK; @@ -519,6 +537,9 @@ cs89x0_probe1(struct net_device *dev, int ioaddr) dev->dev_addr[i*2] = eeprom_buff[i]; dev->dev_addr[i*2+1] = eeprom_buff[i] >> 8; } + if (net_debug > 1) + printk(KERN_DEBUG "%s: new adapter_cnf: 0%x\n", + dev->name, lp->adapter_cnf); } /* allow them to force multiple transceivers. If they force multiple, autosense */ @@ -533,6 +554,10 @@ cs89x0_probe1(struct net_device *dev, int ioaddr) else if (lp->force & FORCE_BNC) {lp->adapter_cnf |= A_CNF_MEDIA_10B_2; } } + if (net_debug > 1) + printk(KERN_DEBUG "%s: after force 0x%x, adapter_cnf=0x%x\n", + dev->name, lp->force, lp->adapter_cnf); + /* FIXME: We don't let you set dc-dc polarity or low RX squelch from the command line: add it here */ /* FIXME: We don't let you set the IMM bit from the command line: add it to lp->auto_neg_cnf here */ @@ -615,7 +640,7 @@ cs89x0_probe1(struct net_device *dev, int ioaddr) printk("cs89x0_probe1() successful\n"); return 0; out2: - release_region(ioaddr, NETCARD_IO_EXTENT); + release_region(ioaddr & ~3, NETCARD_IO_EXTENT); out1: kfree(dev->priv); dev->priv = 0; @@ -1075,7 +1100,7 @@ net_open(struct net_device *dev) if (lp->isa_config & ANY_ISA_DMA) { unsigned long flags; lp->dma_buff = (unsigned char *)__get_dma_pages(GFP_KERNEL, - (lp->dmasize * 1024) / PAGE_SIZE); + get_order(lp->dmasize * 1024)); if (!lp->dma_buff) { printk(KERN_ERR "%s: cannot get %dK memory for DMA\n", dev->name, lp->dmasize); @@ -1456,7 +1481,7 @@ net_rx(struct net_device *dev) static void release_dma_buff(struct net_local *lp) { if (lp->dma_buff) { - free_pages((unsigned long)(lp->dma_buff), (lp->dmasize * 1024) / PAGE_SIZE); + free_pages((unsigned long)(lp->dma_buff), get_order(lp->dmasize * 1024)); lp->dma_buff = 0; } } @@ -1690,10 +1715,10 @@ out: void cleanup_module(void) { - outw(PP_ChipID, dev_cs89x0.base_addr + ADD_PORT); if (dev_cs89x0.priv != NULL) { /* Free up the private structure, or leak memory :-) */ unregister_netdev(&dev_cs89x0); + outw(PP_ChipID, dev_cs89x0.base_addr + ADD_PORT); kfree(dev_cs89x0.priv); dev_cs89x0.priv = NULL; /* gets re-allocated by cs89x0_probe1 */ /* If we don't do this, we can't re-insmod it later. */ |