File: /usr/src/linux/drivers/net/ni5010.c

1     /*	ni5010.c: A network driver for the MiCom-Interlan NI5010 ethercard.
2      *
3      *	Copyright 1996,1997 Jan-Pascal van Best and Andreas Mohr.
4      *
5      *	This software may be used and distributed according to the terms
6      *	of the GNU General Public License, incorporated herein by reference.
7      *
8      * 	The authors may be reached as:
9      *		jvbest@wi.leidenuniv.nl		a.mohr@mailto.de
10      * 	or by snail mail as
11      * 		Jan-Pascal van Best		Andreas Mohr
12      *		Klikspaanweg 58-4		Stauferstr. 6
13      *		2324 LZ  Leiden			D-71272 Renningen
14      *		The Netherlands			Germany
15      *
16      *	Sources:
17      * 	 	Donald Becker's "skeleton.c"
18      *  		Crynwr ni5010 packet driver
19      *
20      *	Changes:
21      *		v0.0: First test version
22      *		v0.1: First working version
23      *		v0.2:
24      *		v0.3->v0.90: Now demand setting io and irq when loading as module
25      *	970430	v0.91: modified for Linux 2.1.14
26      *		v0.92: Implemented Andreas' (better) NI5010 probe
27      *	970503	v0.93: Fixed auto-irq failure on warm reboot (JB)
28      *	970623	v1.00: First kernel version (AM)
29      *	970814	v1.01: Added detection of onboard receive buffer size (AM)
30      *	Bugs:
31      *		- None known...
32      *		- Note that you have to patch ifconfig for the new /proc/net/dev
33      *		format. It gives incorrect stats otherwise.
34      *
35      *	To do:
36      *		Fix all bugs :-)
37      *		Move some stuff to chipset_init()
38      *		Handle xmt errors other than collisions
39      *		Complete merge with Andreas' driver
40      *		Implement ring buffers (Is this useful? You can't squeeze
41      *			too many packet in a 2k buffer!)
42      *		Implement DMA (Again, is this useful? Some docs says DMA is
43      *			slower than programmed I/O)
44      *
45      *	Compile with:
46      *		gcc -O2 -fomit-frame-pointer -m486 -D__KERNEL__ \
47      *			-DMODULE -c ni5010.c 
48      *
49      *	Insert with e.g.:
50      *		insmod ni5010.o io=0x300 irq=5 	
51      */
52     
53     #include <linux/module.h>
54     #include <linux/kernel.h>
55     #include <linux/string.h>
56     #include <linux/errno.h>
57     #include <linux/ioport.h>
58     #include <linux/slab.h>
59     #include <linux/interrupt.h>
60     #include <linux/delay.h>
61     #include <linux/init.h>
62     #include <asm/bitops.h>
63     #include <asm/io.h>
64     #include <asm/dma.h>
65     
66     #include <linux/netdevice.h>
67     #include <linux/etherdevice.h>
68     #include <linux/skbuff.h>
69     
70     #include "ni5010.h"
71     
72     static const char *boardname = "NI5010";
73     static char *version =
74     	"ni5010.c: v1.00 06/23/97 Jan-Pascal van Best and Andreas Mohr\n";
75     	
76     /* bufsize_rcv == 0 means autoprobing */
77     static unsigned int bufsize_rcv;
78     
79     #define jumpered_interrupts	/* IRQ line jumpered on board */
80     #undef jumpered_dma		/* No DMA used */
81     #undef FULL_IODETECT		/* Only detect in portlist */
82     
83     #ifndef FULL_IODETECT
84     /* A zero-terminated list of I/O addresses to be probed. */
85     static unsigned int ni5010_portlist[] __initdata =
86     	{ 0x300, 0x320, 0x340, 0x360, 0x380, 0x3a0, 0 };
87     #endif
88     
89     /* Use 0 for production, 1 for verification, >2 for debug */
90     #ifndef NI5010_DEBUG
91     #define NI5010_DEBUG 0
92     #endif
93     
94     /* Information that needs to be kept for each board. */
95     struct ni5010_local {
96     	struct net_device_stats stats;
97     	int o_pkt_size;
98     	int i_pkt_size;
99     };
100     
101     /* Index to functions, as function prototypes. */
102     
103     extern int 	ni5010_probe(struct net_device *dev);
104     static int	ni5010_probe1(struct net_device *dev, int ioaddr);
105     static int	ni5010_open(struct net_device *dev);
106     static int	ni5010_send_packet(struct sk_buff *skb, struct net_device *dev);
107     static void	ni5010_interrupt(int irq, void *dev_id, struct pt_regs *regs);
108     static void	ni5010_rx(struct net_device *dev);
109     static void	ni5010_timeout(struct net_device *dev);
110     static int	ni5010_close(struct net_device *dev);
111     static struct net_device_stats *ni5010_get_stats(struct net_device *dev);
112     static void 	ni5010_set_multicast_list(struct net_device *dev);
113     static void	reset_receiver(struct net_device *dev);
114     
115     static int	process_xmt_interrupt(struct net_device *dev);
116     #define tx_done(dev) 1
117     static void	hardware_send_packet(struct net_device *dev, char *buf, int length);
118     static void 	chipset_init(struct net_device *dev, int startp);
119     static void	dump_packet(void *buf, int len);
120     static void 	ni5010_show_registers(struct net_device *dev);
121     
122     
123     int __init ni5010_probe(struct net_device *dev)
124     {
125     	int *port;
126     	int base_addr = dev->base_addr;
127     
128             PRINTK2((KERN_DEBUG "%s: Entering ni5010_probe\n", dev->name));
129     
130     	SET_MODULE_OWNER(dev);
131     
132     	if (base_addr > 0x1ff)		/* Check a single specified location. */
133     		return ni5010_probe1(dev, base_addr);
134     	else if (base_addr != 0)	/* Don't probe at all. */
135     		return -ENXIO;
136     
137     #ifdef FULL_IODETECT
138     		for (int ioaddr=0x200; ioaddr<0x400; ioaddr+=0x20) {
139     			if (check_region(ioaddr, NI5010_IO_EXTENT))
140     				continue;
141     			if (ni5010_probe1(dev, ioaddr) == 0)
142     				return 0;
143     		}
144     #else
145     		for (port = ni5010_portlist; *port; port++) {
146     			int ioaddr = *port;
147     			if (check_region(ioaddr, NI5010_IO_EXTENT))
148     				continue;
149     			if (ni5010_probe1(dev, ioaddr) == 0)
150     				return 0;
151     		}
152     #endif	/* FULL_IODETECT */
153     	return -ENODEV;
154     }
155     
156     static inline int rd_port(int ioaddr)
157     {
158     	inb(IE_RBUF);
159     	return inb(IE_SAPROM);
160     }
161     
162     static void __init trigger_irq(int ioaddr)
163     {
164     		outb(0x00, EDLC_RESET);	/* Clear EDLC hold RESET state */
165     		outb(0x00, IE_RESET);	/* Board reset */
166     		outb(0x00, EDLC_XMASK);	/* Disable all Xmt interrupts */
167     		outb(0x00, EDLC_RMASK); /* Disable all Rcv interrupt */
168     		outb(0xff, EDLC_XCLR);	/* Clear all pending Xmt interrupts */
169     		outb(0xff, EDLC_RCLR);	/* Clear all pending Rcv interrupts */
170     		/*
171     		 * Transmit packet mode: Ignore parity, Power xcvr,
172     		 * 	Enable loopback
173     		 */
174     		outb(XMD_IG_PAR | XMD_T_MODE | XMD_LBC, EDLC_XMODE);
175     		outb(RMD_BROADCAST, EDLC_RMODE); /* Receive normal&broadcast */
176     		outb(XM_ALL, EDLC_XMASK);	/* Enable all Xmt interrupts */
177     		udelay(50);			/* FIXME: Necessary? */
178     		outb(MM_EN_XMT|MM_MUX, IE_MMODE); /* Start transmission */
179     }
180     
181     /*
182      *      This is the real probe routine.  Linux has a history of friendly device
183      *      probes on the ISA bus.  A good device probes avoids doing writes, and
184      *      verifies that the correct device exists and functions.
185      */
186     
187     static int __init ni5010_probe1(struct net_device *dev, int ioaddr)
188     {
189     	static unsigned version_printed;
190     	int i;
191     	unsigned int data = 0;
192     	int boguscount = 40;
193     
194     	/*
195     	 * This is no "official" probe method, I've rather tested which
196     	 * probe works best with my seven NI5010 cards
197     	 * (they have very different serial numbers)
198     	 * Suggestions or failure reports are very, very welcome !
199     	 * But I think it is a relatively good probe method
200     	 * since it doesn't use any "outb"
201     	 * It should be nearly 100% reliable !
202     	 * well-known WARNING: this probe method (like many others)
203     	 * will hang the system if a NE2000 card region is probed !
204     	 *
205     	 *   - Andreas
206     	 */
207     	
208      	PRINTK2((KERN_DEBUG "%s: entering ni5010_probe1(%#3x)\n", 
209      		dev->name, ioaddr));
210     
211     	if (inb(ioaddr+0) == 0xff) return -ENODEV;
212     
213     	while ( (rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr) &
214     		 rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr)) != 0xff)
215     	{
216     		if (boguscount-- == 0) return -ENODEV;
217     	}
218     
219     	PRINTK2((KERN_DEBUG "%s: I/O #1 passed!\n", dev->name));
220     
221     	for (i=0; i<32; i++)
222     		if ( (data = rd_port(ioaddr)) != 0xff) break;
223     	if (data==0xff) return -ENODEV;
224     
225     	PRINTK2((KERN_DEBUG "%s: I/O #2 passed!\n", dev->name));
226     
227     	if (		(data == SA_ADDR0) &&
228     	     (rd_port(ioaddr) == SA_ADDR1) &&
229     	     (rd_port(ioaddr) == SA_ADDR2) ) {
230     		for (i=0; i<4; i++) rd_port(ioaddr);
231     		if ( (rd_port(ioaddr) != NI5010_MAGICVAL1) ||
232     		     (rd_port(ioaddr) != NI5010_MAGICVAL2) ) {
233     		     	return -ENODEV;
234     		}
235     	} else return -ENODEV;
236     	
237     	PRINTK2((KERN_DEBUG "%s: I/O #3 passed!\n", dev->name));
238     
239     	if (NI5010_DEBUG && version_printed++ == 0)
240     		printk(KERN_INFO "%s", version);
241     
242     	printk("NI5010 ethercard probe at 0x%x: ", ioaddr);
243     
244     	dev->base_addr = ioaddr;
245     
246     	for (i=0; i<6; i++) {
247     		outw(i, IE_GP);
248     		printk("%2.2x ", dev->dev_addr[i] = inb(IE_SAPROM));
249     	}
250     
251     	PRINTK2((KERN_DEBUG "%s: I/O #4 passed!\n", dev->name));
252     
253     #ifdef jumpered_interrupts
254     	if (dev->irq == 0xff)
255     		;
256     	else if (dev->irq < 2) {
257     		PRINTK2((KERN_DEBUG "%s: I/O #5 passed!\n", dev->name));
258     
259     		autoirq_setup(0);
260     		trigger_irq(ioaddr);
261     		dev->irq = autoirq_report(2);
262     
263     		PRINTK2((KERN_DEBUG "%s: I/O #6 passed!\n", dev->name));
264     
265     		if (dev->irq == 0) {
266     			printk(KERN_WARNING "%s: no IRQ found!\n", dev->name);
267     			return -EAGAIN;
268     		}
269     		PRINTK2((KERN_DEBUG "%s: I/O #7 passed!\n", dev->name));
270     	} else if (dev->irq == 2) {
271     		dev->irq = 9;
272     	}
273     #endif	/* jumpered_irq */
274     	PRINTK2((KERN_DEBUG "%s: I/O #9 passed!\n", dev->name));
275     
276     	/* DMA is not supported (yet?), so no use detecting it */
277     
278     	if (dev->priv == NULL) {
279     		dev->priv = kmalloc(sizeof(struct ni5010_local), GFP_KERNEL|GFP_DMA);
280     		if (dev->priv == NULL) {
281     			printk(KERN_WARNING "%s: Failed to allocate private memory\n", dev->name);
282     			return -ENOMEM;
283     		}
284     	}
285     
286     	PRINTK2((KERN_DEBUG "%s: I/O #10 passed!\n", dev->name));
287     
288     /* get the size of the onboard receive buffer
289      * higher addresses than bufsize are wrapped into real buffer
290      * i.e. data for offs. 0x801 is written to 0x1 with a 2K onboard buffer
291      */
292     	if (!bufsize_rcv) {
293             	outb(1, IE_MMODE);      /* Put Rcv buffer on system bus */
294             	outw(0, IE_GP);		/* Point GP at start of packet */
295             	outb(0, IE_RBUF);	/* set buffer byte 0 to 0 */
296             	for (i = 1; i < 0xff; i++) {
297                     	outw(i << 8, IE_GP); /* Point GP at packet size to be tested */
298                     	outb(i, IE_RBUF);
299                     	outw(0x0, IE_GP); /* Point GP at start of packet */
300                     	data = inb(IE_RBUF);
301                     	if (data == i) break;
302             	}
303     		bufsize_rcv = i << 8;
304             	outw(0, IE_GP);		/* Point GP at start of packet */
305             	outb(0, IE_RBUF);	/* set buffer byte 0 to 0 again */
306     	}
307             printk("// bufsize rcv/xmt=%d/%d\n", bufsize_rcv, NI5010_BUFSIZE);
308     	memset(dev->priv, 0, sizeof(struct ni5010_local));
309     
310     	/* Grab the region so we can find another board if autoIRQ fails. */
311     	request_region(ioaddr, NI5010_IO_EXTENT, boardname);
312     	
313     	dev->open		= ni5010_open;
314     	dev->stop		= ni5010_close;
315     	dev->hard_start_xmit	= ni5010_send_packet;
316     	dev->get_stats		= ni5010_get_stats;
317     	dev->set_multicast_list = ni5010_set_multicast_list;
318     	dev->tx_timeout		= ni5010_timeout;
319     	dev->watchdog_timeo	= HZ/20;
320     
321     	/* Fill in the fields of the device structure with ethernet values. */
322     	ether_setup(dev);
323     	
324     	dev->flags &= ~IFF_MULTICAST;	/* Multicast doesn't work */
325     
326     	/* Shut up the ni5010 */
327     	outb(0, EDLC_RMASK);	/* Mask all receive interrupts */
328     	outb(0, EDLC_XMASK);	/* Mask all xmit interrupts */
329     	outb(0xff, EDLC_RCLR);	/* Kill all pending rcv interrupts */
330     	outb(0xff, EDLC_XCLR); 	/* Kill all pending xmt interrupts */
331     
332     	printk(KERN_INFO "%s: NI5010 found at 0x%x, using IRQ %d", dev->name, ioaddr, dev->irq);
333     	if (dev->dma) printk(" & DMA %d", dev->dma);
334     	printk(".\n");
335     
336     	printk(KERN_INFO "Join the NI5010 driver development team!\n");
337     	printk(KERN_INFO "Mail to a.mohr@mailto.de or jvbest@wi.leidenuniv.nl\n");
338     	return 0;
339     }
340     
341     /* 
342      * Open/initialize the board.  This is called (in the current kernel)
343      * sometime after booting when the 'ifconfig' program is run.
344      *
345      * This routine should set everything up anew at each open, even
346      * registers that "should" only need to be set once at boot, so that
347      * there is non-reboot way to recover if something goes wrong.
348      */
349        
350     static int ni5010_open(struct net_device *dev)
351     {
352     	int ioaddr = dev->base_addr;
353     	int i;
354     
355     	PRINTK2((KERN_DEBUG "%s: entering ni5010_open()\n", dev->name)); 
356     	
357     	if (request_irq(dev->irq, &ni5010_interrupt, 0, boardname, dev)) {
358     		printk(KERN_WARNING "%s: Cannot get irq %#2x\n", dev->name, dev->irq);
359     		return -EAGAIN;
360     	}
361     	PRINTK3((KERN_DEBUG "%s: passed open() #1\n", dev->name));
362             /*
363              * Always allocate the DMA channel after the IRQ,
364              * and clean up on failure.
365              */
366     #ifdef jumpered_dma
367             if (request_dma(dev->dma, cardname)) {
368     		printk(KERN_WARNING "%s: Cannot get dma %#2x\n", dev->name, dev->dma);
369                     free_irq(dev->irq, NULL);
370                     return -EAGAIN;
371             }
372     #endif	/* jumpered_dma */
373     
374     	PRINTK3((KERN_DEBUG "%s: passed open() #2\n", dev->name));
375     	/* Reset the hardware here.  Don't forget to set the station address. */
376     
377     	outb(RS_RESET, EDLC_RESET);	/* Hold up EDLC_RESET while configing board */
378     	outb(0, IE_RESET);		/* Hardware reset of ni5010 board */
379     	outb(XMD_LBC, EDLC_XMODE);	/* Only loopback xmits */
380     
381     	PRINTK3((KERN_DEBUG "%s: passed open() #3\n", dev->name));
382     	/* Set the station address */
383     	for(i = 0;i < 6; i++) {
384     		outb(dev->dev_addr[i], EDLC_ADDR + i);
385     	}
386     	
387     	PRINTK3((KERN_DEBUG "%s: Initialising ni5010\n", dev->name)); 
388     	outb(0, EDLC_XMASK);	/* No xmit interrupts for now */
389     	outb(XMD_IG_PAR | XMD_T_MODE | XMD_LBC, EDLC_XMODE); 
390     				/* Normal packet xmit mode */
391     	outb(0xff, EDLC_XCLR);	/* Clear all pending xmit interrupts */
392     	outb(RMD_BROADCAST, EDLC_RMODE);
393     				/* Receive broadcast and normal packets */
394     	reset_receiver(dev);	/* Ready ni5010 for receiving packets */
395     	
396     	outb(0, EDLC_RESET);	/* Un-reset the ni5010 */
397     	
398     	netif_start_queue(dev);
399     		
400     	if (NI5010_DEBUG) ni5010_show_registers(dev); 
401     
402     	PRINTK((KERN_DEBUG "%s: open successful\n", dev->name));
403          	return 0;
404     }
405     
406     static void reset_receiver(struct net_device *dev)
407     {
408     	int ioaddr = dev->base_addr;
409     	
410     	PRINTK3((KERN_DEBUG "%s: resetting receiver\n", dev->name));
411     	outw(0, IE_GP);		/* Receive packet at start of buffer */
412     	outb(0xff, EDLC_RCLR);	/* Clear all pending rcv interrupts */
413     	outb(0, IE_MMODE);	/* Put EDLC to rcv buffer */
414     	outb(MM_EN_RCV, IE_MMODE); /* Enable rcv */
415     	outb(0xff, EDLC_RMASK);	/* Enable all rcv interrupts */
416     }
417     
418     static void ni5010_timeout(struct net_device *dev)
419     {
420     	printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name,
421     		   tx_done(dev) ? "IRQ conflict" : "network cable problem");
422     	/* Try to restart the adaptor. */
423     	/* FIXME: Give it a real kick here */
424     	chipset_init(dev, 1);
425     	dev->trans_start = jiffies;
426     	netif_wake_queue(dev);
427     }
428     
429     static int ni5010_send_packet(struct sk_buff *skb, struct net_device *dev)
430     {
431     	int length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
432     
433     	PRINTK2((KERN_DEBUG "%s: entering ni5010_send_packet\n", dev->name));
434     
435     	/* 
436              * Block sending
437     	 */
438     	
439     	netif_stop_queue(dev);
440     	hardware_send_packet(dev, (unsigned char *)skb->data, length);
441     	dev->trans_start = jiffies;
442     	dev_kfree_skb (skb);
443     	return 0;
444     }
445     
446     /* 
447      * The typical workload of the driver:
448      * Handle the network interface interrupts. 
449      */
450     static void  ni5010_interrupt(int irq, void *dev_id, struct pt_regs *regs)
451     {
452     	struct net_device *dev = dev_id;
453     	struct ni5010_local *lp;
454     	int ioaddr, status;
455     	int xmit_was_error = 0;
456     
457     	PRINTK2((KERN_DEBUG "%s: entering ni5010_interrupt\n", dev->name));
458     
459     	ioaddr = dev->base_addr;
460     	lp = (struct ni5010_local *)dev->priv;
461     	
462     	status = inb(IE_ISTAT); 
463     	PRINTK3((KERN_DEBUG "%s: IE_ISTAT = %#02x\n", dev->name, status));
464     		
465             if ((status & IS_R_INT) == 0) ni5010_rx(dev);
466     
467             if ((status & IS_X_INT) == 0) {
468                     xmit_was_error = process_xmt_interrupt(dev);
469             }
470     
471             if ((status & IS_DMA_INT) == 0) {
472                     PRINTK((KERN_DEBUG "%s: DMA complete (?)\n", dev->name));
473                     outb(0, IE_DMA_RST); /* Reset DMA int */
474             }
475     
476     	if (!xmit_was_error) 
477     		reset_receiver(dev); 
478     	return;
479     }
480     
481     
482     static void dump_packet(void *buf, int len)
483     {
484     	int i;
485     	
486     	printk(KERN_DEBUG "Packet length = %#4x\n", len);
487     	for (i = 0; i < len; i++){
488     		if (i % 16 == 0) printk(KERN_DEBUG "%#4.4x", i);
489     		if (i % 2 == 0) printk(" ");
490     		printk("%2.2x", ((unsigned char *)buf)[i]);
491     		if (i % 16 == 15) printk("\n");
492     	}
493     	printk("\n");
494     	
495     	return;
496     }
497     
498     /* We have a good packet, get it out of the buffer. */
499     static void ni5010_rx(struct net_device *dev)
500     {
501     	struct ni5010_local *lp = (struct ni5010_local *)dev->priv;
502     	int ioaddr = dev->base_addr;
503     	unsigned char rcv_stat;
504     	struct sk_buff *skb;
505     	
506     	PRINTK2((KERN_DEBUG "%s: entering ni5010_rx()\n", dev->name)); 
507     	
508     	rcv_stat = inb(EDLC_RSTAT);
509     	PRINTK3((KERN_DEBUG "%s: EDLC_RSTAT = %#2x\n", dev->name, rcv_stat)); 
510     	
511     	if ( (rcv_stat & RS_VALID_BITS) != RS_PKT_OK) {
512     		PRINTK((KERN_INFO "%s: receive error.\n", dev->name));
513     		lp->stats.rx_errors++;
514     		if (rcv_stat & RS_RUNT) lp->stats.rx_length_errors++;
515     		if (rcv_stat & RS_ALIGN) lp->stats.rx_frame_errors++;
516     		if (rcv_stat & RS_CRC_ERR) lp->stats.rx_crc_errors++;
517     		if (rcv_stat & RS_OFLW) lp->stats.rx_fifo_errors++;
518             	outb(0xff, EDLC_RCLR); /* Clear the interrupt */
519     		return;
520     	}
521     	
522             outb(0xff, EDLC_RCLR);  /* Clear the interrupt */
523     
524     	lp->i_pkt_size = inw(IE_RCNT);
525     	if (lp->i_pkt_size > ETH_FRAME_LEN || lp->i_pkt_size < 10 ) {
526     		PRINTK((KERN_DEBUG "%s: Packet size error, packet size = %#4.4x\n", 
527     			dev->name, lp->i_pkt_size));
528     		lp->stats.rx_errors++;
529     		lp->stats.rx_length_errors++;
530     		return;
531     	}
532     
533     	/* Malloc up new buffer. */
534     	skb = dev_alloc_skb(lp->i_pkt_size + 3);
535     	if (skb == NULL) {
536     		printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
537     		lp->stats.rx_dropped++;
538     		return;
539     	}
540     	
541     	skb->dev = dev;
542     	skb_reserve(skb, 2);
543     	
544     	/* Read packet into buffer */
545             outb(MM_MUX, IE_MMODE); /* Rcv buffer to system bus */
546     	outw(0, IE_GP);	/* Seek to beginning of packet */
547     	insb(IE_RBUF, skb_put(skb, lp->i_pkt_size), lp->i_pkt_size); 
548     	
549     	if (NI5010_DEBUG >= 4) 
550     		dump_packet(skb->data, skb->len); 
551     		
552     	skb->protocol = eth_type_trans(skb,dev);
553     	netif_rx(skb);
554     	dev->last_rx = jiffies;
555     	lp->stats.rx_packets++;
556     	lp->stats.rx_bytes += lp->i_pkt_size;
557     
558     	PRINTK2((KERN_DEBUG "%s: Received packet, size=%#4.4x\n", 
559     		dev->name, lp->i_pkt_size));
560     	
561     }
562     
563     static int process_xmt_interrupt(struct net_device *dev)
564     {
565     	struct ni5010_local *lp = (struct ni5010_local *)dev->priv;
566     	int ioaddr = dev->base_addr;
567     	int xmit_stat;
568     
569     	PRINTK2((KERN_DEBUG "%s: entering process_xmt_interrupt\n", dev->name));
570     
571     	xmit_stat = inb(EDLC_XSTAT);
572     	PRINTK3((KERN_DEBUG "%s: EDLC_XSTAT = %2.2x\n", dev->name, xmit_stat));
573     	
574     	outb(0, EDLC_XMASK);	/* Disable xmit IRQ's */
575     	outb(0xff, EDLC_XCLR);	/* Clear all pending xmit IRQ's */
576     	
577     	if (xmit_stat & XS_COLL){
578     		PRINTK((KERN_DEBUG "%s: collision detected, retransmitting\n", 
579     			dev->name));
580     		outw(NI5010_BUFSIZE - lp->o_pkt_size, IE_GP);
581     		/* outb(0, IE_MMODE); */ /* xmt buf on sysbus FIXME: needed ? */
582     		outb(MM_EN_XMT | MM_MUX, IE_MMODE);
583     		outb(XM_ALL, EDLC_XMASK); /* Enable xmt IRQ's */
584     		lp->stats.collisions++;
585     		return 1;
586     	}
587     
588     	/* FIXME: handle other xmt error conditions */
589     
590     	lp->stats.tx_packets++;
591     	lp->stats.tx_bytes += lp->o_pkt_size;
592     	netif_wake_queue(dev);
593     			
594     	PRINTK2((KERN_DEBUG "%s: sent packet, size=%#4.4x\n", 
595     		dev->name, lp->o_pkt_size));
596     
597     	return 0;
598     }
599     
600     /* The inverse routine to ni5010_open(). */
601     static int ni5010_close(struct net_device *dev)
602     {
603     	int ioaddr = dev->base_addr;
604     
605     	PRINTK2((KERN_DEBUG "%s: entering ni5010_close\n", dev->name));
606     #ifdef jumpered_interrupts	
607     	free_irq(dev->irq, NULL);
608     #endif
609     	/* Put card in held-RESET state */
610     	outb(0, IE_MMODE);
611     	outb(RS_RESET, EDLC_RESET);
612     
613     	netif_stop_queue(dev);
614     	
615     	PRINTK((KERN_DEBUG "%s: %s closed down\n", dev->name, boardname));
616     	return 0;
617     
618     }
619     
620     /* Get the current statistics.	This may be called with the card open or
621        closed. */
622     static struct net_device_stats *ni5010_get_stats(struct net_device *dev)
623     {
624     	struct ni5010_local *lp = (struct ni5010_local *)dev->priv;
625     
626     	PRINTK2((KERN_DEBUG "%s: entering ni5010_get_stats\n", dev->name));
627     	
628     	if (NI5010_DEBUG) ni5010_show_registers(dev);
629     	
630     	/* cli(); */
631     	/* Update the statistics from the device registers. */
632     	/* We do this in the interrupt handler */
633     	/* sti(); */
634     
635     	return &lp->stats;
636     }
637     
638     /* Set or clear the multicast filter for this adaptor.
639        num_addrs == -1      Promiscuous mode, receive all packets
640        num_addrs == 0       Normal mode, clear multicast list
641        num_addrs > 0        Multicast mode, receive normal and MC packets, and do
642                             best-effort filtering.
643     */
644     static void ni5010_set_multicast_list(struct net_device *dev)
645     {
646     	short ioaddr = dev->base_addr;  
647     
648     	PRINTK2((KERN_DEBUG "%s: entering set_multicast_list\n", dev->name));
649     
650     	if (dev->flags&IFF_PROMISC || dev->flags&IFF_ALLMULTI) {
651     		dev->flags |= IFF_PROMISC;
652     		outb(RMD_PROMISC, EDLC_RMODE); /* Enable promiscuous mode */
653     		PRINTK((KERN_DEBUG "%s: Entering promiscuous mode\n", dev->name));
654     	} else if (dev->mc_list) {
655     		/* Sorry, multicast not supported */
656     		PRINTK((KERN_DEBUG "%s: No multicast, entering broadcast mode\n", dev->name));
657     		outb(RMD_BROADCAST, EDLC_RMODE);
658     	} else {
659     		PRINTK((KERN_DEBUG "%s: Entering broadcast mode\n", dev->name));
660     		outb(RMD_BROADCAST, EDLC_RMODE);  /* Disable promiscuous mode, use normal mode */
661     	}
662     }
663     
664     static void hardware_send_packet(struct net_device *dev, char *buf, int length)
665     {
666     	struct ni5010_local *lp = (struct ni5010_local *)dev->priv;
667     	int ioaddr = dev->base_addr;
668     	unsigned long flags;
669     	unsigned int buf_offs;
670     
671     	PRINTK2((KERN_DEBUG "%s: entering hardware_send_packet\n", dev->name));
672     	
673             if (length > ETH_FRAME_LEN) {
674                     PRINTK((KERN_WARNING "%s: packet too large, not possible\n",
675                             dev->name));
676                     return;
677             }
678     
679     	if (NI5010_DEBUG) ni5010_show_registers(dev);
680     
681     	if (inb(IE_ISTAT) & IS_EN_XMT) {
682     		PRINTK((KERN_WARNING "%s: sending packet while already transmitting, not possible\n", 
683     			dev->name));
684     		return;
685     	}
686     	
687     	if (NI5010_DEBUG > 3) dump_packet(buf, length);
688     
689             buf_offs = NI5010_BUFSIZE - length;
690             lp->o_pkt_size = length;
691     
692     	save_flags(flags);	
693     	cli();
694     
695     	outb(0, EDLC_RMASK);	/* Mask all receive interrupts */
696     	outb(0, IE_MMODE);	/* Put Xmit buffer on system bus */
697     	outb(0xff, EDLC_RCLR);	/* Clear out pending rcv interrupts */
698     
699     	outw(buf_offs, IE_GP); /* Point GP at start of packet */
700     	outsb(IE_XBUF, buf, length); /* Put data in buffer */
701     	outw(buf_offs, IE_GP); /* Rewrite where packet starts */
702     
703     	/* should work without that outb() (Crynwr used it) */
704     	/*outb(MM_MUX, IE_MMODE);*/ /* Xmt buffer to EDLC bus */
705     	outb(MM_EN_XMT | MM_MUX, IE_MMODE); /* Begin transmission */
706     	outb(XM_ALL, EDLC_XMASK); /* Cause interrupt after completion or fail */
707     
708     	restore_flags(flags);
709     
710     	netif_wake_queue(dev);
711     	
712     	if (NI5010_DEBUG) ni5010_show_registers(dev);	
713     }
714     
715     static void chipset_init(struct net_device *dev, int startp)
716     {
717     	/* FIXME: Move some stuff here */
718     	PRINTK3((KERN_DEBUG "%s: doing NOTHING in chipset_init\n", dev->name));
719     }
720     
721     static void ni5010_show_registers(struct net_device *dev)
722     {
723     	int ioaddr = dev->base_addr;
724     	
725     	PRINTK3((KERN_DEBUG "%s: XSTAT %#2.2x\n", dev->name, inb(EDLC_XSTAT)));
726     	PRINTK3((KERN_DEBUG "%s: XMASK %#2.2x\n", dev->name, inb(EDLC_XMASK)));
727     	PRINTK3((KERN_DEBUG "%s: RSTAT %#2.2x\n", dev->name, inb(EDLC_RSTAT)));
728     	PRINTK3((KERN_DEBUG "%s: RMASK %#2.2x\n", dev->name, inb(EDLC_RMASK)));
729     	PRINTK3((KERN_DEBUG "%s: RMODE %#2.2x\n", dev->name, inb(EDLC_RMODE)));
730     	PRINTK3((KERN_DEBUG "%s: XMODE %#2.2x\n", dev->name, inb(EDLC_XMODE)));
731     	PRINTK3((KERN_DEBUG "%s: ISTAT %#2.2x\n", dev->name, inb(IE_ISTAT)));
732     }
733     
734     #ifdef MODULE
735     static struct net_device dev_ni5010;
736     static int io;
737     static int irq;
738     
739     MODULE_PARM(io, "i");
740     MODULE_PARM(irq, "i");
741     MODULE_PARM_DESC(io, "ni5010 I/O base address");
742     MODULE_PARM_DESC(irq, "ni5010 IRQ number");
743     
744     int init_module(void)
745     {
746     	int result;
747     	
748     	PRINTK2((KERN_DEBUG "%s: entering init_module\n", boardname));
749     	/*
750     	if(io <= 0 || irq == 0){
751     	   	printk(KERN_WARNING "%s: Autoprobing not allowed for modules.\n", boardname);
752     		printk(KERN_WARNING "%s: Set symbols 'io' and 'irq'\n", boardname);
753     	   	return -EINVAL;
754     	}
755     	*/
756     	if (io <= 0){
757     		printk(KERN_WARNING "%s: Autoprobing for modules is hazardous, trying anyway..\n", boardname);
758     	}
759     
760     	PRINTK2((KERN_DEBUG "%s: init_module irq=%#2x, io=%#3x\n", boardname, irq, io));
761             dev_ni5010.irq=irq;
762             dev_ni5010.base_addr=io;
763     	dev_ni5010.init=ni5010_probe;
764             if ((result = register_netdev(&dev_ni5010)) != 0) {
765             	PRINTK((KERN_WARNING "%s: register_netdev returned %d.\n", 
766             		boardname, result));
767                     return -EIO;
768             }
769             return 0;
770     }
771     
772     void
773     cleanup_module(void)
774     {
775     	PRINTK2((KERN_DEBUG "%s: entering cleanup_module\n", boardname));
776     
777             unregister_netdev(&dev_ni5010);
778     
779     	release_region(dev_ni5010.base_addr, NI5010_IO_EXTENT);
780     	if (dev_ni5010.priv != NULL){
781     	        kfree(dev_ni5010.priv);
782     	        dev_ni5010.priv = NULL;
783     	}
784     }
785     #endif /* MODULE */
786     
787     /*
788      * Local variables:
789      *  compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c ni5010.c"
790      *  version-control: t
791      *  kept-new-versions: 5
792      *  tab-width: 4
793      * End:
794      */
795