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

1     /*
2      * net-3-driver for the NI5210 card (i82586 Ethernet chip)
3      *
4      * This is an extension to the Linux operating system, and is covered by the
5      * same GNU General Public License that covers that work.
6      *
7      * Alphacode 0.82 (96/09/29) for Linux 2.0.0 (or later)
8      * Copyrights (c) 1994,1995,1996 by M.Hipp (hippm@informatik.uni-tuebingen.de)
9      *    [feel free to mail ....]
10      *
11      * when using as module: (no autoprobing!)
12      *   compile with:
13      *       gcc -O2 -fomit-frame-pointer -m486 -D__KERNEL__ -DMODULE -c ni52.c
14      *   run with e.g:
15      *       insmod ni52.o io=0x360 irq=9 memstart=0xd0000 memend=0xd4000
16      *
17      * CAN YOU PLEASE REPORT ME YOUR PERFORMANCE EXPERIENCES !!.
18      *
19      * If you find a bug, please report me:
20      *   The kernel panic output and any kmsg from the ni52 driver
21      *   the ni5210-driver-version and the linux-kernel version
22      *   how many shared memory (memsize) on the netcard,
23      *   bootprom: yes/no, base_addr, mem_start
24      *   maybe the ni5210-card revision and the i82586 version
25      *
26      * autoprobe for: base_addr: 0x300,0x280,0x360,0x320,0x340
27      *                mem_start: 0xd0000,0xd2000,0xc8000,0xca000,0xd4000,0xd6000,
28      *                           0xd8000,0xcc000,0xce000,0xda000,0xdc000
29      *
30      * sources:
31      *   skeleton.c from Donald Becker
32      *
33      * I have also done a look in the following sources: (mail me if you need them)
34      *   crynwr-packet-driver by Russ Nelson
35      *   Garret A. Wollman's (fourth) i82586-driver for BSD
36      *   (before getting an i82596 (yes 596 not 586) manual, the existing drivers helped
37      *    me a lot to understand this tricky chip.)
38      *
39      * Known Problems:
40      *   The internal sysbus seems to be slow. So we often lose packets because of
41      *   overruns while receiving from a fast remote host.
42      *   This can slow down TCP connections. Maybe the newer ni5210 cards are better.
43      *   my experience is, that if a machine sends with more then about 500-600K/s
44      *   the fifo/sysbus overflows.
45      *
46      * IMPORTANT NOTE:
47      *   On fast networks, it's a (very) good idea to have 16K shared memory. With
48      *   8K, we can store only 4 receive frames, so it can (easily) happen that a remote
49      *   machine 'overruns' our system.
50      *
51      * Known i82586/card problems (I'm sure, there are many more!):
52      *   Running the NOP-mode, the i82586 sometimes seems to forget to report
53      *   every xmit-interrupt until we restart the CU.
54      *   Another MAJOR bug is, that the RU sometimes seems to ignore the EL-Bit
55      *   in the RBD-Struct which indicates an end of the RBD queue.
56      *   Instead, the RU fetches another (randomly selected and
57      *   usually used) RBD and begins to fill it. (Maybe, this happens only if
58      *   the last buffer from the previous RFD fits exact into the queue and
59      *   the next RFD can't fetch an initial RBD. Anyone knows more? )
60      *
61      * results from ftp performance tests with Linux 1.2.5
62      *   send and receive about 350-400 KByte/s (peak up to 460 kbytes/s)
63      *   sending in NOP-mode: peak performance up to 530K/s (but better don't run this mode)
64      */
65     
66     /*
67      * 29.Sept.96: virt_to_bus changes for new memory scheme
68      * 19.Feb.96: more Mcast changes, module support (MH)
69      *
70      * 18.Nov.95: Mcast changes (AC).
71      *
72      * 23.April.95: fixed(?) receiving problems by configuring a RFD more
73      *              than the number of RBD's. Can maybe cause other problems.
74      * 18.April.95: Added MODULE support (MH)
75      * 17.April.95: MC related changes in init586() and set_multicast_list().
76      *              removed use of 'jiffies' in init586() (MH)
77      *
78      * 19.Sep.94: Added Multicast support (not tested yet) (MH)
79      *
80      * 18.Sep.94: Workaround for 'EL-Bug'. Removed flexible RBD-handling.
81      *            Now, every RFD has exact one RBD. (MH)
82      *
83      * 14.Sep.94: added promiscuous mode, a few cleanups (MH)
84      *
85      * 19.Aug.94: changed request_irq() parameter (MH)
86      *
87      * 20.July.94: removed cleanup bugs, removed a 16K-mem-probe-bug (MH)
88      *
89      * 19.July.94: lotsa cleanups .. (MH)
90      *
91      * 17.July.94: some patches ... verified to run with 1.1.29 (MH)
92      *
93      * 4.July.94: patches for Linux 1.1.24  (MH)
94      *
95      * 26.March.94: patches for Linux 1.0 and iomem-auto-probe (MH)
96      *
97      * 30.Sep.93: Added nop-chain .. driver now runs with only one Xmit-Buff, too (MH)
98      *
99      * < 30.Sep.93: first versions
100      */
101     
102     static int debuglevel;	/* debug-printk 0: off 1: a few 2: more */
103     static int automatic_resume; /* experimental .. better should be zero */
104     static int rfdadd;	/* rfdadd=1 may be better for 8K MEM cards */
105     static int fifo=0x8;	/* don't change */
106     
107     /* #define REALLY_SLOW_IO */
108     
109     #include <linux/module.h>
110     #include <linux/kernel.h>
111     #include <linux/string.h>
112     #include <linux/errno.h>
113     #include <linux/ioport.h>
114     #include <linux/slab.h>
115     #include <linux/interrupt.h>
116     #include <linux/delay.h>
117     #include <linux/init.h>
118     #include <asm/bitops.h>
119     #include <asm/io.h>
120     
121     #include <linux/netdevice.h>
122     #include <linux/etherdevice.h>
123     #include <linux/skbuff.h>
124     
125     #include "ni52.h"
126     
127     #define DEBUG       /* debug on */
128     #define SYSBUSVAL 1 /* 8 Bit */
129     
130     #define ni_attn586()  {outb(0,dev->base_addr+NI52_ATTENTION);}
131     #define ni_reset586() {outb(0,dev->base_addr+NI52_RESET);}
132     #define ni_disint()   {outb(0,dev->base_addr+NI52_INTDIS);}
133     #define ni_enaint()   {outb(0,dev->base_addr+NI52_INTENA);}
134     
135     #define make32(ptr16) (p->memtop + (short) (ptr16) )
136     #define make24(ptr32) ( ((char *) (ptr32)) - p->base)
137     #define make16(ptr32) ((unsigned short) ((unsigned long)(ptr32) - (unsigned long) p->memtop ))
138     
139     /******************* how to calculate the buffers *****************************
140     
141       * IMPORTANT NOTE: if you configure only one NUM_XMIT_BUFFS, the driver works
142       * --------------- in a different (more stable?) mode. Only in this mode it's
143       *                 possible to configure the driver with 'NO_NOPCOMMANDS'
144     
145     sizeof(scp)=12; sizeof(scb)=16; sizeof(iscp)=8;
146     sizeof(scp)+sizeof(iscp)+sizeof(scb) = 36 = INIT
147     sizeof(rfd) = 24; sizeof(rbd) = 12;
148     sizeof(tbd) = 8; sizeof(transmit_cmd) = 16;
149     sizeof(nop_cmd) = 8;
150     
151       * if you don't know the driver, better do not change these values: */
152     
153     #define RECV_BUFF_SIZE 1524 /* slightly oversized */
154     #define XMIT_BUFF_SIZE 1524 /* slightly oversized */
155     #define NUM_XMIT_BUFFS 1    /* config for both, 8K and 16K shmem */
156     #define NUM_RECV_BUFFS_8  4 /* config for 8K shared mem */
157     #define NUM_RECV_BUFFS_16 9 /* config for 16K shared mem */
158     #define NO_NOPCOMMANDS      /* only possible with NUM_XMIT_BUFFS=1 */
159     
160     /**************************************************************************/
161     
162     /* different DELAYs */
163     #define DELAY(x) mdelay(32 * x);
164     #define DELAY_16(); { udelay(16); }
165     #define DELAY_18(); { udelay(4); }
166     
167     /* wait for command with timeout: */
168     #define WAIT_4_SCB_CMD() \
169     { int i; \
170       for(i=0;i<16384;i++) { \
171         if(!p->scb->cmd_cuc) break; \
172         DELAY_18(); \
173         if(i == 16383) { \
174           printk("%s: scb_cmd timed out: %04x,%04x .. disabling i82586!!\n",dev->name,p->scb->cmd_cuc,p->scb->cus); \
175            if(!p->reseted) { p->reseted = 1; ni_reset586(); } } } }
176     
177     #define WAIT_4_SCB_CMD_RUC() { int i; \
178       for(i=0;i<16384;i++) { \
179         if(!p->scb->cmd_ruc) break; \
180         DELAY_18(); \
181         if(i == 16383) { \
182           printk("%s: scb_cmd (ruc) timed out: %04x,%04x .. disabling i82586!!\n",dev->name,p->scb->cmd_ruc,p->scb->rus); \
183            if(!p->reseted) { p->reseted = 1; ni_reset586(); } } } }
184     
185     #define WAIT_4_STAT_COMPL(addr) { int i; \
186        for(i=0;i<32767;i++) { \
187          if((addr)->cmd_status & STAT_COMPL) break; \
188          DELAY_16(); DELAY_16(); } }
189     
190     #define NI52_TOTAL_SIZE 16
191     #define NI52_ADDR0 0x02
192     #define NI52_ADDR1 0x07
193     #define NI52_ADDR2 0x01
194     
195     static int     ni52_probe1(struct net_device *dev,int ioaddr);
196     static void    ni52_interrupt(int irq,void *dev_id,struct pt_regs *reg_ptr);
197     static int     ni52_open(struct net_device *dev);
198     static int     ni52_close(struct net_device *dev);
199     static int     ni52_send_packet(struct sk_buff *,struct net_device *);
200     static struct  net_device_stats *ni52_get_stats(struct net_device *dev);
201     static void    set_multicast_list(struct net_device *dev);
202     static void    ni52_timeout(struct net_device *dev);
203     #if 0
204     static void    ni52_dump(struct net_device *,void *);
205     #endif
206     
207     /* helper-functions */
208     static int     init586(struct net_device *dev);
209     static int     check586(struct net_device *dev,char *where,unsigned size);
210     static void    alloc586(struct net_device *dev);
211     static void    startrecv586(struct net_device *dev);
212     static void   *alloc_rfa(struct net_device *dev,void *ptr);
213     static void    ni52_rcv_int(struct net_device *dev);
214     static void    ni52_xmt_int(struct net_device *dev);
215     static void    ni52_rnr_int(struct net_device *dev);
216     
217     struct priv
218     {
219     	struct net_device_stats stats;
220     	unsigned long base;
221     	char *memtop;
222     	long int lock;
223     	int reseted;
224     	volatile struct rfd_struct	*rfd_last,*rfd_top,*rfd_first;
225     	volatile struct scp_struct	*scp;	/* volatile is important */
226     	volatile struct iscp_struct	*iscp;	/* volatile is important */
227     	volatile struct scb_struct	*scb;	/* volatile is important */
228     	volatile struct tbd_struct	*xmit_buffs[NUM_XMIT_BUFFS];
229     	volatile struct transmit_cmd_struct *xmit_cmds[NUM_XMIT_BUFFS];
230     #if (NUM_XMIT_BUFFS == 1)
231     	volatile struct nop_cmd_struct *nop_cmds[2];
232     #else
233     	volatile struct nop_cmd_struct *nop_cmds[NUM_XMIT_BUFFS];
234     #endif
235     	volatile int		nop_point,num_recv_buffs;
236     	volatile char		*xmit_cbuffs[NUM_XMIT_BUFFS];
237     	volatile int		xmit_count,xmit_last;
238     };
239     
240     /**********************************************
241      * close device
242      */
243     static int ni52_close(struct net_device *dev)
244     {
245     	free_irq(dev->irq, dev);
246     
247     	ni_reset586(); /* the hard way to stop the receiver */
248     
249     	netif_stop_queue(dev);
250     
251     	return 0;
252     }
253     
254     /**********************************************
255      * open device
256      */
257     static int ni52_open(struct net_device *dev)
258     {
259     	int ret;
260     
261     	ni_disint();
262     	alloc586(dev);
263     	init586(dev);
264     	startrecv586(dev);
265     	ni_enaint();
266     
267     	ret = request_irq(dev->irq, &ni52_interrupt,0,dev->name,dev);
268     	if (ret)
269     	{
270     		ni_reset586();
271     		return ret;
272     	}
273     
274     	netif_start_queue(dev);
275     
276     	return 0; /* most done by init */
277     }
278     
279     /**********************************************
280      * Check to see if there's an 82586 out there.
281      */
282     static int check586(struct net_device *dev,char *where,unsigned size)
283     {
284     	struct priv pb;
285     	struct priv *p = /* (struct priv *) dev->priv*/ &pb;
286     	char *iscp_addrs[2];
287     	int i;
288     
289     	p->base = (unsigned long) bus_to_virt((unsigned long)where) + size - 0x01000000;
290     	p->memtop = bus_to_virt((unsigned long)where) + size;
291     	p->scp = (struct scp_struct *)(p->base + SCP_DEFAULT_ADDRESS);
292     	memset((char *)p->scp,0, sizeof(struct scp_struct));
293     	for(i=0;i<sizeof(struct scp_struct);i++) /* memory was writeable? */
294     		if(((char *)p->scp)[i])
295     			return 0;
296     	p->scp->sysbus = SYSBUSVAL;				/* 1 = 8Bit-Bus, 0 = 16 Bit */
297     	if(p->scp->sysbus != SYSBUSVAL)
298     		return 0;
299     
300     	iscp_addrs[0] = bus_to_virt((unsigned long)where);
301     	iscp_addrs[1]= (char *) p->scp - sizeof(struct iscp_struct);
302     
303     	for(i=0;i<2;i++)
304     	{
305     		p->iscp = (struct iscp_struct *) iscp_addrs[i];
306     		memset((char *)p->iscp,0, sizeof(struct iscp_struct));
307     
308     		p->scp->iscp = make24(p->iscp);
309     		p->iscp->busy = 1;
310     
311     		ni_reset586();
312     		ni_attn586();
313     		DELAY(1);	/* wait a while... */
314     
315     		if(p->iscp->busy) /* i82586 clears 'busy' after successful init */
316     			return 0;
317     	}
318     	return 1;
319     }
320     
321     /******************************************************************
322      * set iscp at the right place, called by ni52_probe1 and open586.
323      */
324     static void alloc586(struct net_device *dev)
325     {
326     	struct priv *p =	(struct priv *) dev->priv;
327     
328     	ni_reset586();
329     	DELAY(1);
330     
331     	p->scp	= (struct scp_struct *)	(p->base + SCP_DEFAULT_ADDRESS);
332     	p->scb	= (struct scb_struct *)	bus_to_virt(dev->mem_start);
333     	p->iscp = (struct iscp_struct *) ((char *)p->scp - sizeof(struct iscp_struct));
334     
335     	memset((char *) p->iscp,0,sizeof(struct iscp_struct));
336     	memset((char *) p->scp ,0,sizeof(struct scp_struct));
337     
338     	p->scp->iscp = make24(p->iscp);
339     	p->scp->sysbus = SYSBUSVAL;
340     	p->iscp->scb_offset = make16(p->scb);
341     
342     	p->iscp->busy = 1;
343     	ni_reset586();
344     	ni_attn586();
345     
346     	DELAY(1);
347     
348     	if(p->iscp->busy)
349     		printk("%s: Init-Problems (alloc).\n",dev->name);
350     
351     	p->reseted = 0;
352     
353     	memset((char *)p->scb,0,sizeof(struct scb_struct));
354     }
355     
356     /**********************************************
357      * probe the ni5210-card
358      */
359     int __init ni52_probe(struct net_device *dev)
360     {
361     #ifndef MODULE
362     	int *port;
363     	static int ports[] = {0x300, 0x280, 0x360 , 0x320 , 0x340, 0};
364     #endif
365     	int base_addr = dev->base_addr;
366     
367     	SET_MODULE_OWNER(dev);
368     
369     	if (base_addr > 0x1ff)		/* Check a single specified location. */
370     		return ni52_probe1(dev, base_addr);
371     	else if (base_addr > 0)		/* Don't probe at all. */
372     		return -ENXIO;
373     
374     #ifdef MODULE
375     	printk("%s: no autoprobing allowed for modules.\n",dev->name);
376     #else
377     	for (port = ports; *port; port++) {
378     		int ioaddr = *port;
379     		dev->base_addr = ioaddr;
380     		if (ni52_probe1(dev, ioaddr) == 0)
381     			return 0;
382     	}
383     
384     #ifdef FULL_IO_PROBE
385     	for(dev->base_addr=0x200; dev->base_addr<0x400; dev->base_addr+=8)
386     		if (ni52_probe1(dev, dev->base_addr) == 0)
387     			return 0;
388     #endif
389     
390     #endif
391     
392     	dev->base_addr = base_addr;
393     	return -ENODEV;
394     }
395     
396     static int __init ni52_probe1(struct net_device *dev,int ioaddr)
397     {
398     	int i, size, retval;
399     
400     	if (!request_region(ioaddr, NI52_TOTAL_SIZE, dev->name))
401     		return -EBUSY;
402     
403     	if( !(inb(ioaddr+NI52_MAGIC1) == NI52_MAGICVAL1) ||
404     	    !(inb(ioaddr+NI52_MAGIC2) == NI52_MAGICVAL2)) {
405     		retval = -ENODEV;
406     		goto out;
407     	}
408     
409     	for(i=0;i<ETH_ALEN;i++)
410     		dev->dev_addr[i] = inb(dev->base_addr+i);
411     
412     	if(dev->dev_addr[0] != NI52_ADDR0 || dev->dev_addr[1] != NI52_ADDR1
413     		 || dev->dev_addr[2] != NI52_ADDR2) {
414     		retval = -ENODEV;
415     		goto out;
416     	}
417     
418     	printk("%s: NI5210 found at %#3lx, ",dev->name,dev->base_addr);
419     
420     	/*
421     	 * check (or search) IO-Memory, 8K and 16K
422     	 */
423     #ifdef MODULE
424     	size = dev->mem_end - dev->mem_start;
425     	if(size != 0x2000 && size != 0x4000) {
426     		printk("\n%s: Illegal memory size %d. Allowed is 0x2000 or 0x4000 bytes.\n",dev->name,size);
427     		retval = -ENODEV;
428     		goto out;
429     	}
430     	if(!check586(dev,(char *) dev->mem_start,size)) {
431     		printk("?memcheck, Can't find memory at 0x%lx with size %d!\n",dev->mem_start,size);
432     		retval = -ENODEV;
433     		goto out;
434     	}
435     #else
436     	if(dev->mem_start != 0) /* no auto-mem-probe */
437     	{
438     		size = 0x4000; /* check for 16K mem */
439     		if(!check586(dev,(char *) dev->mem_start,size)) {
440     			size = 0x2000; /* check for 8K mem */
441     			if(!check586(dev,(char *) dev->mem_start,size)) {
442     				printk("?memprobe, Can't find memory at 0x%lx!\n",dev->mem_start);
443     				retval = -ENODEV;
444     				goto out;
445     			}
446     		}
447     	}
448     	else
449     	{
450     		static long memaddrs[] = { 0xc8000,0xca000,0xcc000,0xce000,0xd0000,0xd2000,
451     					0xd4000,0xd6000,0xd8000,0xda000,0xdc000, 0 };
452     		for(i=0;;i++)
453     		{
454     			if(!memaddrs[i]) {
455     				printk("?memprobe, Can't find io-memory!\n");
456     				retval = -ENODEV;
457     				goto out;
458     			}
459     			dev->mem_start = memaddrs[i];
460     			size = 0x2000; /* check for 8K mem */
461     			if(check586(dev,(char *)dev->mem_start,size)) /* 8K-check */
462     				break;
463     			size = 0x4000; /* check for 16K mem */
464     			if(check586(dev,(char *)dev->mem_start,size)) /* 16K-check */
465     				break;
466     		}
467     	}
468     	dev->mem_end = dev->mem_start + size; /* set mem_end showed by 'ifconfig' */
469     #endif
470     
471     	dev->priv = (void *) kmalloc(sizeof(struct priv),GFP_KERNEL);
472     	if(dev->priv == NULL) {
473     		printk("%s: Ooops .. can't allocate private driver memory.\n",dev->name);
474     		retval = -ENOMEM;
475     		goto out;
476     	}
477     																	/* warning: we don't free it on errors */
478     	memset((char *) dev->priv,0,sizeof(struct priv));
479     
480     	((struct priv *) (dev->priv))->memtop = bus_to_virt(dev->mem_start) + size;
481     	((struct priv *) (dev->priv))->base =	(unsigned long) bus_to_virt(dev->mem_start) + size - 0x01000000;
482     	alloc586(dev);
483     
484     	/* set number of receive-buffs according to memsize */
485     	if(size == 0x2000)
486     		((struct priv *) dev->priv)->num_recv_buffs = NUM_RECV_BUFFS_8;
487     	else
488     		((struct priv *) dev->priv)->num_recv_buffs = NUM_RECV_BUFFS_16;
489     
490     	printk("Memaddr: 0x%lx, Memsize: %d, ",dev->mem_start,size);
491     
492     	if(dev->irq < 2)
493     	{
494     		autoirq_setup(0);
495     		ni_reset586();
496     		ni_attn586();
497     		if(!(dev->irq = autoirq_report(2)))
498     		{
499     			printk("?autoirq, Failed to detect IRQ line!\n");
500     			kfree(dev->priv);
501     			dev->priv = NULL;
502     			retval = -EAGAIN;
503     			goto out;
504     		}
505     		printk("IRQ %d (autodetected).\n",dev->irq);
506     	}
507     	else	{
508     		if(dev->irq == 2)
509     			dev->irq = 9;
510     		printk("IRQ %d (assigned and not checked!).\n",dev->irq);
511     	}
512     
513     	dev->open		= ni52_open;
514     	dev->stop		= ni52_close;
515     	dev->get_stats		= ni52_get_stats;
516     	dev->tx_timeout 	= ni52_timeout;
517     	dev->watchdog_timeo	= HZ/20;
518     	dev->hard_start_xmit 	= ni52_send_packet;
519     	dev->set_multicast_list = set_multicast_list;
520     
521     	dev->if_port 		= 0;
522     
523     	ether_setup(dev);
524     
525     	return 0;
526     out:
527     	release_region(ioaddr, NI52_TOTAL_SIZE);
528     	return retval;
529     }
530     
531     /**********************************************
532      * init the chip (ni52-interrupt should be disabled?!)
533      * needs a correct 'allocated' memory
534      */
535     
536     static int init586(struct net_device *dev)
537     {
538     	void *ptr;
539     	int i,result=0;
540     	struct priv *p = (struct priv *) dev->priv;
541     	volatile struct configure_cmd_struct	*cfg_cmd;
542     	volatile struct iasetup_cmd_struct *ias_cmd;
543     	volatile struct tdr_cmd_struct *tdr_cmd;
544     	volatile struct mcsetup_cmd_struct *mc_cmd;
545     	struct dev_mc_list *dmi=dev->mc_list;
546     	int num_addrs=dev->mc_count;
547     
548     	ptr = (void *) ((char *)p->scb + sizeof(struct scb_struct));
549     
550     	cfg_cmd = (struct configure_cmd_struct *)ptr; /* configure-command */
551     	cfg_cmd->cmd_status	= 0;
552     	cfg_cmd->cmd_cmd	= CMD_CONFIGURE | CMD_LAST;
553     	cfg_cmd->cmd_link	= 0xffff;
554     
555     	cfg_cmd->byte_cnt	= 0x0a; /* number of cfg bytes */
556     	cfg_cmd->fifo		= fifo; /* fifo-limit (8=tx:32/rx:64) */
557     	cfg_cmd->sav_bf		= 0x40; /* hold or discard bad recv frames (bit 7) */
558     	cfg_cmd->adr_len	= 0x2e; /* addr_len |!src_insert |pre-len |loopback */
559     	cfg_cmd->priority	= 0x00;
560     	cfg_cmd->ifs		= 0x60;
561     	cfg_cmd->time_low	= 0x00;
562     	cfg_cmd->time_high	= 0xf2;
563     	cfg_cmd->promisc	= 0;
564     	if(dev->flags & IFF_ALLMULTI) {
565     		int len = ((char *) p->iscp - (char *) ptr - 8) / 6;
566     		if(num_addrs > len)	{
567     			printk("%s: switching to promisc. mode\n",dev->name);
568     			dev->flags|=IFF_PROMISC;
569     		}
570     	}
571     	if(dev->flags&IFF_PROMISC)
572     	{
573     			 cfg_cmd->promisc=1;
574     			 dev->flags|=IFF_PROMISC;
575     	}
576     	cfg_cmd->carr_coll	= 0x00;
577     
578     	p->scb->cbl_offset	= make16(cfg_cmd);
579     	p->scb->cmd_ruc		= 0;
580     
581     	p->scb->cmd_cuc		= CUC_START; /* cmd.-unit start */
582     	ni_attn586();
583     
584     	WAIT_4_STAT_COMPL(cfg_cmd);
585     
586     	if((cfg_cmd->cmd_status & (STAT_OK|STAT_COMPL)) != (STAT_COMPL|STAT_OK))
587     	{
588     		printk("%s: configure command failed: %x\n",dev->name,cfg_cmd->cmd_status);
589     		return 1;
590     	}
591     
592     	/*
593     	 * individual address setup
594     	 */
595     
596     	ias_cmd = (struct iasetup_cmd_struct *)ptr;
597     
598     	ias_cmd->cmd_status	= 0;
599     	ias_cmd->cmd_cmd	= CMD_IASETUP | CMD_LAST;
600     	ias_cmd->cmd_link	= 0xffff;
601     
602     	memcpy((char *)&ias_cmd->iaddr,(char *) dev->dev_addr,ETH_ALEN);
603     
604     	p->scb->cbl_offset = make16(ias_cmd);
605     
606     	p->scb->cmd_cuc = CUC_START; /* cmd.-unit start */
607     	ni_attn586();
608     
609     	WAIT_4_STAT_COMPL(ias_cmd);
610     
611     	if((ias_cmd->cmd_status & (STAT_OK|STAT_COMPL)) != (STAT_OK|STAT_COMPL)) {
612     		printk("%s (ni52): individual address setup command failed: %04x\n",dev->name,ias_cmd->cmd_status);
613     		return 1;
614     	}
615     
616     	/*
617     	 * TDR, wire check .. e.g. no resistor e.t.c
618     	 */
619     	 
620     	tdr_cmd = (struct tdr_cmd_struct *)ptr;
621     
622     	tdr_cmd->cmd_status	= 0;
623     	tdr_cmd->cmd_cmd	= CMD_TDR | CMD_LAST;
624     	tdr_cmd->cmd_link	= 0xffff;
625     	tdr_cmd->status		= 0;
626     
627     	p->scb->cbl_offset = make16(tdr_cmd);
628     	p->scb->cmd_cuc = CUC_START; /* cmd.-unit start */
629     	ni_attn586();
630     
631     	WAIT_4_STAT_COMPL(tdr_cmd);
632     
633     	if(!(tdr_cmd->cmd_status & STAT_COMPL))
634     	{
635     		printk("%s: Problems while running the TDR.\n",dev->name);
636     	}
637     	else
638     	{
639     		DELAY_16(); /* wait for result */
640     		result = tdr_cmd->status;
641     
642     		p->scb->cmd_cuc = p->scb->cus & STAT_MASK;
643     		ni_attn586(); /* ack the interrupts */
644     
645     		if(result & TDR_LNK_OK)
646     			;
647     		else if(result & TDR_XCVR_PRB)
648     			printk("%s: TDR: Transceiver problem. Check the cable(s)!\n",dev->name);
649     		else if(result & TDR_ET_OPN)
650     			printk("%s: TDR: No correct termination %d clocks away.\n",dev->name,result & TDR_TIMEMASK);
651     		else if(result & TDR_ET_SRT)
652     		{
653     			if (result & TDR_TIMEMASK) /* time == 0 -> strange :-) */
654     				printk("%s: TDR: Detected a short circuit %d clocks away.\n",dev->name,result & TDR_TIMEMASK);
655     		}
656     		else
657     			printk("%s: TDR: Unknown status %04x\n",dev->name,result);
658     	}
659     
660     	/*
661     	 * Multicast setup
662     	 */
663     	if(num_addrs && !(dev->flags & IFF_PROMISC) )
664     	{
665     		mc_cmd = (struct mcsetup_cmd_struct *) ptr;
666     		mc_cmd->cmd_status = 0;
667     		mc_cmd->cmd_cmd = CMD_MCSETUP | CMD_LAST;
668     		mc_cmd->cmd_link = 0xffff;
669     		mc_cmd->mc_cnt = num_addrs * 6;
670     
671     		for(i=0;i<num_addrs;i++,dmi=dmi->next)
672     			memcpy((char *) mc_cmd->mc_list[i], dmi->dmi_addr,6);
673     
674     		p->scb->cbl_offset = make16(mc_cmd);
675     		p->scb->cmd_cuc = CUC_START;
676     		ni_attn586();
677     
678     		WAIT_4_STAT_COMPL(mc_cmd);
679     
680     		if( (mc_cmd->cmd_status & (STAT_COMPL|STAT_OK)) != (STAT_COMPL|STAT_OK) )
681     			printk("%s: Can't apply multicast-address-list.\n",dev->name);
682     	}
683     
684     	/*
685     	 * alloc nop/xmit-cmds
686     	 */
687     #if (NUM_XMIT_BUFFS == 1)
688     	for(i=0;i<2;i++)
689     	{
690     		p->nop_cmds[i] 			= (struct nop_cmd_struct *)ptr;
691     		p->nop_cmds[i]->cmd_cmd		= CMD_NOP;
692     		p->nop_cmds[i]->cmd_status 	= 0;
693     		p->nop_cmds[i]->cmd_link	= make16((p->nop_cmds[i]));
694     		ptr = (char *) ptr + sizeof(struct nop_cmd_struct);
695     	}
696     #else
697     	for(i=0;i<NUM_XMIT_BUFFS;i++)
698     	{
699     		p->nop_cmds[i]			= (struct nop_cmd_struct *)ptr;
700     		p->nop_cmds[i]->cmd_cmd		= CMD_NOP;
701     		p->nop_cmds[i]->cmd_status	= 0;
702     		p->nop_cmds[i]->cmd_link	= make16((p->nop_cmds[i]));
703     		ptr = (char *) ptr + sizeof(struct nop_cmd_struct);
704     	}
705     #endif
706     
707     	ptr = alloc_rfa(dev,(void *)ptr); /* init receive-frame-area */
708     
709     	/*
710     	 * alloc xmit-buffs / init xmit_cmds
711     	 */
712     	for(i=0;i<NUM_XMIT_BUFFS;i++)
713     	{
714     		p->xmit_cmds[i] = (struct transmit_cmd_struct *)ptr; /*transmit cmd/buff 0*/
715     		ptr = (char *) ptr + sizeof(struct transmit_cmd_struct);
716     		p->xmit_cbuffs[i] = (char *)ptr; /* char-buffs */
717     		ptr = (char *) ptr + XMIT_BUFF_SIZE;
718     		p->xmit_buffs[i] = (struct tbd_struct *)ptr; /* TBD */
719     		ptr = (char *) ptr + sizeof(struct tbd_struct);
720     		if((void *)ptr > (void *)p->iscp)
721     		{
722     			printk("%s: not enough shared-mem for your configuration!\n",dev->name);
723     			return 1;
724     		}
725     		memset((char *)(p->xmit_cmds[i]) ,0, sizeof(struct transmit_cmd_struct));
726     		memset((char *)(p->xmit_buffs[i]),0, sizeof(struct tbd_struct));
727     		p->xmit_cmds[i]->cmd_link = make16(p->nop_cmds[(i+1)%NUM_XMIT_BUFFS]);
728     		p->xmit_cmds[i]->cmd_status = STAT_COMPL;
729     		p->xmit_cmds[i]->cmd_cmd = CMD_XMIT | CMD_INT;
730     		p->xmit_cmds[i]->tbd_offset = make16((p->xmit_buffs[i]));
731     		p->xmit_buffs[i]->next = 0xffff;
732     		p->xmit_buffs[i]->buffer = make24((p->xmit_cbuffs[i]));
733     	}
734     
735     	p->xmit_count = 0;
736     	p->xmit_last	= 0;
737     #ifndef NO_NOPCOMMANDS
738     	p->nop_point	= 0;
739     #endif
740     
741     	 /*
742     		* 'start transmitter'
743     		*/
744     #ifndef NO_NOPCOMMANDS
745     	p->scb->cbl_offset = make16(p->nop_cmds[0]);
746     	p->scb->cmd_cuc = CUC_START;
747     	ni_attn586();
748     	WAIT_4_SCB_CMD();
749     #else
750     	p->xmit_cmds[0]->cmd_link = make16(p->xmit_cmds[0]);
751     	p->xmit_cmds[0]->cmd_cmd	= CMD_XMIT | CMD_SUSPEND | CMD_INT;
752     #endif
753     
754     	/*
755     	 * ack. interrupts
756     	 */
757     	p->scb->cmd_cuc = p->scb->cus & STAT_MASK;
758     	ni_attn586();
759     	DELAY_16();
760     
761     	ni_enaint();
762     
763     	return 0;
764     }
765     
766     /******************************************************
767      * This is a helper routine for ni52_rnr_int() and init586().
768      * It sets up the Receive Frame Area (RFA).
769      */
770     
771     static void *alloc_rfa(struct net_device *dev,void *ptr)
772     {
773     	volatile struct rfd_struct *rfd = (struct rfd_struct *)ptr;
774     	volatile struct rbd_struct *rbd;
775     	int i;
776     	struct priv *p = (struct priv *) dev->priv;
777     
778     	memset((char *) rfd,0,sizeof(struct rfd_struct)*(p->num_recv_buffs+rfdadd));
779     	p->rfd_first = rfd;
780     
781     	for(i = 0; i < (p->num_recv_buffs+rfdadd); i++) {
782     		rfd[i].next = make16(rfd + (i+1) % (p->num_recv_buffs+rfdadd) );
783     		rfd[i].rbd_offset = 0xffff;
784     	}
785     	rfd[p->num_recv_buffs-1+rfdadd].last = RFD_SUSP;	 /* RU suspend */
786     
787     	ptr = (void *) (rfd + (p->num_recv_buffs + rfdadd) );
788     
789     	rbd = (struct rbd_struct *) ptr;
790     	ptr = (void *) (rbd + p->num_recv_buffs);
791     
792     	 /* clr descriptors */
793     	memset((char *) rbd,0,sizeof(struct rbd_struct)*(p->num_recv_buffs));
794     
795     	for(i=0;i<p->num_recv_buffs;i++)
796     	{
797     		rbd[i].next = make16((rbd + (i+1) % p->num_recv_buffs));
798     		rbd[i].size = RECV_BUFF_SIZE;
799     		rbd[i].buffer = make24(ptr);
800     		ptr = (char *) ptr + RECV_BUFF_SIZE;
801     	}
802     
803     	p->rfd_top	= p->rfd_first;
804     	p->rfd_last = p->rfd_first + (p->num_recv_buffs - 1 + rfdadd);
805     
806     	p->scb->rfa_offset		= make16(p->rfd_first);
807     	p->rfd_first->rbd_offset	= make16(rbd);
808     
809     	return ptr;
810     }
811     
812     
813     /**************************************************
814      * Interrupt Handler ...
815      */
816     
817     static void ni52_interrupt(int irq,void *dev_id,struct pt_regs *reg_ptr)
818     {
819     	struct net_device *dev = dev_id;
820     	unsigned short stat;
821     	int cnt=0;
822     	struct priv *p;
823     
824     	if (!dev) {
825     		printk ("ni5210-interrupt: irq %d for unknown device.\n",irq);
826     		return;
827     	}
828     	p = (struct priv *) dev->priv;
829     
830     	if(debuglevel > 1)
831     		printk("I");
832     
833     	WAIT_4_SCB_CMD(); /* wait for last command	*/
834     
835     	while((stat=p->scb->cus & STAT_MASK))
836     	{
837     		p->scb->cmd_cuc = stat;
838     		ni_attn586();
839     
840     		if(stat & STAT_FR)	 /* received a frame */
841     			ni52_rcv_int(dev);
842     
843     		if(stat & STAT_RNR) /* RU went 'not ready' */
844     		{
845     			printk("(R)");
846     			if(p->scb->rus & RU_SUSPEND) /* special case: RU_SUSPEND */
847     			{
848     				WAIT_4_SCB_CMD();
849     				p->scb->cmd_ruc = RUC_RESUME;
850     				ni_attn586();
851     				WAIT_4_SCB_CMD_RUC();
852     			}
853     			else
854     			{
855     				printk("%s: Receiver-Unit went 'NOT READY': %04x/%02x.\n",dev->name,(int) stat,(int) p->scb->rus);
856     				ni52_rnr_int(dev);
857     			}
858     		}
859     
860     		if(stat & STAT_CX)		/* command with I-bit set complete */
861     			 ni52_xmt_int(dev);
862     
863     #ifndef NO_NOPCOMMANDS
864     		if(stat & STAT_CNA)	/* CU went 'not ready' */
865     		{
866     			if(netif_running(dev))
867     				printk("%s: oops! CU has left active state. stat: %04x/%02x.\n",dev->name,(int) stat,(int) p->scb->cus);
868     		}
869     #endif
870     
871     		if(debuglevel > 1)
872     			printk("%d",cnt++);
873     
874     		WAIT_4_SCB_CMD(); /* wait for ack. (ni52_xmt_int can be faster than ack!!) */
875     		if(p->scb->cmd_cuc)	 /* timed out? */
876     		{
877     			printk("%s: Acknowledge timed out.\n",dev->name);
878     			ni_disint();
879     			break;
880     		}
881     	}
882     
883     	if(debuglevel > 1)
884     		printk("i");
885     }
886     
887     /*******************************************************
888      * receive-interrupt
889      */
890     
891     static void ni52_rcv_int(struct net_device *dev)
892     {
893     	int status,cnt=0;
894     	unsigned short totlen;
895     	struct sk_buff *skb;
896     	struct rbd_struct *rbd;
897     	struct priv *p = (struct priv *) dev->priv;
898     
899     	if(debuglevel > 0)
900     		printk("R");
901     
902     	for(;(status = p->rfd_top->stat_high) & RFD_COMPL;)
903     	{
904     			rbd = (struct rbd_struct *) make32(p->rfd_top->rbd_offset);
905     
906     			if(status & RFD_OK) /* frame received without error? */
907     			{
908     				if( (totlen = rbd->status) & RBD_LAST) /* the first and the last buffer? */
909     				{
910     					totlen &= RBD_MASK; /* length of this frame */
911     					rbd->status = 0;
912     					skb = (struct sk_buff *) dev_alloc_skb(totlen+2);
913     					if(skb != NULL)
914     					{
915     						skb->dev = dev;
916     						skb_reserve(skb,2);
917     						skb_put(skb,totlen);
918     						eth_copy_and_sum(skb,(char *) p->base+(unsigned long) rbd->buffer,totlen,0);
919     						skb->protocol=eth_type_trans(skb,dev);
920     						netif_rx(skb);
921     						dev->last_rx = jiffies;
922     						p->stats.rx_packets++;
923     						p->stats.rx_bytes += totlen;
924     					}
925     					else
926     						p->stats.rx_dropped++;
927     				}
928     				else
929     				{
930     					int rstat;
931     						 /* free all RBD's until RBD_LAST is set */
932     					totlen = 0;
933     					while(!((rstat=rbd->status) & RBD_LAST))
934     					{
935     						totlen += rstat & RBD_MASK;
936     						if(!rstat)
937     						{
938     							printk("%s: Whoops .. no end mark in RBD list\n",dev->name);
939     							break;
940     						}
941     						rbd->status = 0;
942     						rbd = (struct rbd_struct *) make32(rbd->next);
943     					}
944     					totlen += rstat & RBD_MASK;
945     					rbd->status = 0;
946     					printk("%s: received oversized frame! length: %d\n",dev->name,totlen);
947     					p->stats.rx_dropped++;
948     			 }
949     		}
950     		else /* frame !(ok), only with 'save-bad-frames' */
951     		{
952     			printk("%s: oops! rfd-error-status: %04x\n",dev->name,status);
953     			p->stats.rx_errors++;
954     		}
955     		p->rfd_top->stat_high = 0;
956     		p->rfd_top->last = RFD_SUSP; /* maybe exchange by RFD_LAST */
957     		p->rfd_top->rbd_offset = 0xffff;
958     		p->rfd_last->last = 0;				/* delete RFD_SUSP	*/
959     		p->rfd_last = p->rfd_top;
960     		p->rfd_top = (struct rfd_struct *) make32(p->rfd_top->next); /* step to next RFD */
961     		p->scb->rfa_offset = make16(p->rfd_top);
962     
963     		if(debuglevel > 0)
964     			printk("%d",cnt++);
965     	}
966     
967     	if(automatic_resume)
968     	{
969     		WAIT_4_SCB_CMD();
970     		p->scb->cmd_ruc = RUC_RESUME;
971     		ni_attn586();
972     		WAIT_4_SCB_CMD_RUC();
973     	}
974     
975     #ifdef WAIT_4_BUSY
976     	{
977     		int i;
978     		for(i=0;i<1024;i++)
979     		{
980     			if(p->rfd_top->status)
981     				break;
982     			DELAY_16();
983     			if(i == 1023)
984     				printk("%s: RU hasn't fetched next RFD (not busy/complete)\n",dev->name);
985     		}
986     	}
987     #endif
988     
989     #if 0
990     	if(!at_least_one)
991     	{
992     		int i;
993     		volatile struct rfd_struct *rfds=p->rfd_top;
994     		volatile struct rbd_struct *rbds;
995     		printk("%s: received a FC intr. without having a frame: %04x %d\n",dev->name,status,old_at_least);
996     		for(i=0;i< (p->num_recv_buffs+4);i++)
997     		{
998     			rbds = (struct rbd_struct *) make32(rfds->rbd_offset);
999     			printk("%04x:%04x ",rfds->status,rbds->status);
1000     			rfds = (struct rfd_struct *) make32(rfds->next);
1001     		}
1002     		printk("\nerrs: %04x %04x stat: %04x\n",(int)p->scb->rsc_errs,(int)p->scb->ovrn_errs,(int)p->scb->status);
1003     		printk("\nerrs: %04x %04x rus: %02x, cus: %02x\n",(int)p->scb->rsc_errs,(int)p->scb->ovrn_errs,(int)p->scb->rus,(int)p->scb->cus);
1004     	}
1005     	old_at_least = at_least_one;
1006     #endif
1007     
1008     	if(debuglevel > 0)
1009     		printk("r");
1010     }
1011     
1012     /**********************************************************
1013      * handle 'Receiver went not ready'.
1014      */
1015     
1016     static void ni52_rnr_int(struct net_device *dev)
1017     {
1018     	struct priv *p = (struct priv *) dev->priv;
1019     
1020     	p->stats.rx_errors++;
1021     
1022     	WAIT_4_SCB_CMD();		/* wait for the last cmd, WAIT_4_FULLSTAT?? */
1023     	p->scb->cmd_ruc = RUC_ABORT; /* usually the RU is in the 'no resource'-state .. abort it now. */
1024     	ni_attn586();
1025     	WAIT_4_SCB_CMD_RUC();		/* wait for accept cmd. */
1026     
1027     	alloc_rfa(dev,(char *)p->rfd_first);
1028     /* maybe add a check here, before restarting the RU */
1029     	startrecv586(dev); /* restart RU */
1030     
1031     	printk("%s: Receive-Unit restarted. Status: %04x\n",dev->name,p->scb->rus);
1032     
1033     }
1034     
1035     /**********************************************************
1036      * handle xmit - interrupt
1037      */
1038     
1039     static void ni52_xmt_int(struct net_device *dev)
1040     {
1041     	int status;
1042     	struct priv *p = (struct priv *) dev->priv;
1043     
1044     	if(debuglevel > 0)
1045     		printk("X");
1046     
1047     	status = p->xmit_cmds[p->xmit_last]->cmd_status;
1048     	if(!(status & STAT_COMPL))
1049     		printk("%s: strange .. xmit-int without a 'COMPLETE'\n",dev->name);
1050     
1051     	if(status & STAT_OK)
1052     	{
1053     		p->stats.tx_packets++;
1054     		p->stats.collisions += (status & TCMD_MAXCOLLMASK);
1055     	}
1056     	else
1057     	{
1058     		p->stats.tx_errors++;
1059     		if(status & TCMD_LATECOLL) {
1060     			printk("%s: late collision detected.\n",dev->name);
1061     			p->stats.collisions++;
1062     		}
1063     		else if(status & TCMD_NOCARRIER) {
1064     			p->stats.tx_carrier_errors++;
1065     			printk("%s: no carrier detected.\n",dev->name);
1066     		}
1067     		else if(status & TCMD_LOSTCTS)
1068     			printk("%s: loss of CTS detected.\n",dev->name);
1069     		else if(status & TCMD_UNDERRUN) {
1070     			p->stats.tx_fifo_errors++;
1071     			printk("%s: DMA underrun detected.\n",dev->name);
1072     		}
1073     		else if(status & TCMD_MAXCOLL) {
1074     			printk("%s: Max. collisions exceeded.\n",dev->name);
1075     			p->stats.collisions += 16;
1076     		}
1077     	}
1078     
1079     #if (NUM_XMIT_BUFFS > 1)
1080     	if( (++p->xmit_last) == NUM_XMIT_BUFFS)
1081     		p->xmit_last = 0;
1082     #endif
1083     	netif_wake_queue(dev);
1084     }
1085     
1086     /***********************************************************
1087      * (re)start the receiver
1088      */
1089     
1090     static void startrecv586(struct net_device *dev)
1091     {
1092     	struct priv *p = (struct priv *) dev->priv;
1093     
1094     	WAIT_4_SCB_CMD();
1095     	WAIT_4_SCB_CMD_RUC();
1096     	p->scb->rfa_offset = make16(p->rfd_first);
1097     	p->scb->cmd_ruc = RUC_START;
1098     	ni_attn586();		/* start cmd. */
1099     	WAIT_4_SCB_CMD_RUC();	/* wait for accept cmd. (no timeout!!) */
1100     }
1101     
1102     static void ni52_timeout(struct net_device *dev)
1103     {
1104     	struct priv *p = (struct priv *) dev->priv;
1105     #ifndef NO_NOPCOMMANDS
1106     	if(p->scb->cus & CU_ACTIVE) /* COMMAND-UNIT active? */
1107     	{
1108     		netif_wake_queue(dev);
1109     #ifdef DEBUG
1110     		printk("%s: strange ... timeout with CU active?!?\n",dev->name);
1111     		printk("%s: X0: %04x N0: %04x N1: %04x %d\n",dev->name,(int)p->xmit_cmds[0]->cmd_status,(int)p->nop_cmds[0]->cmd_status,(int)p->nop_cmds[1]->cmd_status,(int)p->nop_point);
1112     #endif
1113     		p->scb->cmd_cuc = CUC_ABORT;
1114     		ni_attn586();
1115     		WAIT_4_SCB_CMD();
1116     		p->scb->cbl_offset = make16(p->nop_cmds[p->nop_point]);
1117     		p->scb->cmd_cuc = CUC_START;
1118     		ni_attn586();
1119     		WAIT_4_SCB_CMD();
1120     		dev->trans_start = jiffies;
1121     		return 0;
1122     	}
1123     #endif
1124     	{
1125     #ifdef DEBUG
1126     		printk("%s: xmitter timed out, try to restart! stat: %02x\n",dev->name,p->scb->cus);
1127     		printk("%s: command-stats: %04x %04x\n",dev->name,p->xmit_cmds[0]->cmd_status,p->xmit_cmds[1]->cmd_status);
1128     		printk("%s: check, whether you set the right interrupt number!\n",dev->name);
1129     #endif
1130     		ni52_close(dev);
1131     		ni52_open(dev);
1132     	}
1133     	dev->trans_start = jiffies;
1134     }
1135     
1136     /******************************************************
1137      * send frame
1138      */
1139     
1140     static int ni52_send_packet(struct sk_buff *skb, struct net_device *dev)
1141     {
1142     	int len,i;
1143     #ifndef NO_NOPCOMMANDS
1144     	int next_nop;
1145     #endif
1146     	struct priv *p = (struct priv *) dev->priv;
1147     
1148     	if(skb->len > XMIT_BUFF_SIZE)
1149     	{
1150     		printk("%s: Sorry, max. framelength is %d bytes. The length of your frame is %d bytes.\n",dev->name,XMIT_BUFF_SIZE,skb->len);
1151     		return 0;
1152     	}
1153     
1154     	netif_stop_queue(dev);
1155     
1156     #if(NUM_XMIT_BUFFS > 1)
1157     	if(test_and_set_bit(0,(void *) &p->lock)) {
1158     		printk("%s: Queue was locked\n",dev->name);
1159     		return 1;
1160     	}
1161     	else
1162     #endif
1163     	{
1164     		memcpy((char *)p->xmit_cbuffs[p->xmit_count],(char *)(skb->data),skb->len);
1165     		len = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN;
1166     
1167     #if (NUM_XMIT_BUFFS == 1)
1168     #	ifdef NO_NOPCOMMANDS
1169     
1170     #ifdef DEBUG
1171     		if(p->scb->cus & CU_ACTIVE)
1172     		{
1173     			printk("%s: Hmmm .. CU is still running and we wanna send a new packet.\n",dev->name);
1174     			printk("%s: stat: %04x %04x\n",dev->name,p->scb->cus,p->xmit_cmds[0]->cmd_status);
1175     		}
1176     #endif
1177     
1178     		p->xmit_buffs[0]->size = TBD_LAST | len;
1179     		for(i=0;i<16;i++)
1180     		{
1181     			p->xmit_cmds[0]->cmd_status = 0;
1182     			WAIT_4_SCB_CMD();
1183     			if( (p->scb->cus & CU_STATUS) == CU_SUSPEND)
1184     				p->scb->cmd_cuc = CUC_RESUME;
1185     			else
1186     			{
1187     				p->scb->cbl_offset = make16(p->xmit_cmds[0]);
1188     				p->scb->cmd_cuc = CUC_START;
1189     			}
1190     
1191     			ni_attn586();
1192     			dev->trans_start = jiffies;
1193     			if(!i)
1194     				dev_kfree_skb(skb);
1195     			WAIT_4_SCB_CMD();
1196     			if( (p->scb->cus & CU_ACTIVE)) /* test it, because CU sometimes doesn't start immediately */
1197     				break;
1198     			if(p->xmit_cmds[0]->cmd_status)
1199     				break;
1200     			if(i==15)
1201     				printk("%s: Can't start transmit-command.\n",dev->name);
1202     		}
1203     #	else
1204     		next_nop = (p->nop_point + 1) & 0x1;
1205     		p->xmit_buffs[0]->size = TBD_LAST | len;
1206     
1207     		p->xmit_cmds[0]->cmd_link	 = p->nop_cmds[next_nop]->cmd_link
1208     																= make16((p->nop_cmds[next_nop]));
1209     		p->xmit_cmds[0]->cmd_status = p->nop_cmds[next_nop]->cmd_status = 0;
1210     
1211     		p->nop_cmds[p->nop_point]->cmd_link = make16((p->xmit_cmds[0]));
1212     		dev->trans_start = jiffies;
1213     		p->nop_point = next_nop;
1214     		dev_kfree_skb(skb);
1215     #	endif
1216     #else
1217     		p->xmit_buffs[p->xmit_count]->size = TBD_LAST | len;
1218     		if( (next_nop = p->xmit_count + 1) == NUM_XMIT_BUFFS )
1219     			next_nop = 0;
1220     
1221     		p->xmit_cmds[p->xmit_count]->cmd_status	= 0;
1222     		/* linkpointer of xmit-command already points to next nop cmd */
1223     		p->nop_cmds[next_nop]->cmd_link = make16((p->nop_cmds[next_nop]));
1224     		p->nop_cmds[next_nop]->cmd_status = 0;
1225     
1226     		p->nop_cmds[p->xmit_count]->cmd_link = make16((p->xmit_cmds[p->xmit_count]));
1227     		dev->trans_start = jiffies;
1228     		p->xmit_count = next_nop;
1229     
1230     		{
1231     			unsigned long flags;
1232     			save_flags(flags);
1233     			cli();
1234     			if(p->xmit_count != p->xmit_last)
1235     				netif_wake_queue(dev);
1236     			p->lock = 0;
1237     			restore_flags(flags);
1238     		}
1239     		dev_kfree_skb(skb);
1240     #endif
1241     	}
1242     	return 0;
1243     }
1244     
1245     /*******************************************
1246      * Someone wanna have the statistics
1247      */
1248     
1249     static struct net_device_stats *ni52_get_stats(struct net_device *dev)
1250     {
1251     	struct priv *p = (struct priv *) dev->priv;
1252     	unsigned short crc,aln,rsc,ovrn;
1253     
1254     	crc = p->scb->crc_errs; /* get error-statistic from the ni82586 */
1255     	p->scb->crc_errs = 0;
1256     	aln = p->scb->aln_errs;
1257     	p->scb->aln_errs = 0;
1258     	rsc = p->scb->rsc_errs;
1259     	p->scb->rsc_errs = 0;
1260     	ovrn = p->scb->ovrn_errs;
1261     	p->scb->ovrn_errs = 0;
1262     
1263     	p->stats.rx_crc_errors += crc;
1264     	p->stats.rx_fifo_errors += ovrn;
1265     	p->stats.rx_frame_errors += aln;
1266     	p->stats.rx_dropped += rsc;
1267     
1268     	return &p->stats;
1269     }
1270     
1271     /********************************************************
1272      * Set MC list ..
1273      */
1274     
1275     static void set_multicast_list(struct net_device *dev)
1276     {
1277     	netif_stop_queue(dev);
1278     	ni_disint();
1279     	alloc586(dev);
1280     	init586(dev);
1281     	startrecv586(dev);
1282     	ni_enaint();
1283     	netif_wake_queue(dev);
1284     }
1285     
1286     #ifdef MODULE
1287     static struct net_device dev_ni52;
1288     
1289     /* set: io,irq,memstart,memend or set it when calling insmod */
1290     static int irq=9;
1291     static int io=0x300;
1292     static long memstart;	/* e.g 0xd0000 */
1293     static long memend;	/* e.g 0xd4000 */
1294     
1295     MODULE_PARM(io, "i");
1296     MODULE_PARM(irq, "i");
1297     MODULE_PARM(memstart, "l");
1298     MODULE_PARM(memend, "l");
1299     MODULE_PARM_DESC(io, "NI5210 I/O base address,required");
1300     MODULE_PARM_DESC(irq, "NI5210 IRQ number,required");
1301     MODULE_PARM_DESC(memstart, "NI5210 memory base address,required");
1302     MODULE_PARM_DESC(memend, "NI5210 memory end address,required");
1303     
1304     int init_module(void)
1305     {
1306     	if(io <= 0x0 || !memend || !memstart || irq < 2) {
1307     		printk("ni52: Autoprobing not allowed for modules.\nni52: Set symbols 'io' 'irq' 'memstart' and 'memend'\n");
1308     		return -ENODEV;
1309     	}
1310     	dev_ni52.init = ni52_probe;
1311     	dev_ni52.irq = irq;
1312     	dev_ni52.base_addr = io;
1313     	dev_ni52.mem_end = memend;
1314     	dev_ni52.mem_start = memstart;
1315     	if (register_netdev(&dev_ni52) != 0)
1316     		return -EIO;
1317     	return 0;
1318     }
1319     
1320     void cleanup_module(void)
1321     {
1322     	release_region(dev_ni52.base_addr, NI52_TOTAL_SIZE);
1323     	unregister_netdev(&dev_ni52);
1324     	kfree(dev_ni52.priv);
1325     	dev_ni52.priv = NULL;
1326     }
1327     #endif /* MODULE */
1328     
1329     #if 0
1330     /*
1331      * DUMP .. we expect a not running CMD unit and enough space
1332      */
1333     void ni52_dump(struct net_device *dev,void *ptr)
1334     {
1335     	struct priv *p = (struct priv *) dev->priv;
1336     	struct dump_cmd_struct *dump_cmd = (struct dump_cmd_struct *) ptr;
1337     	int i;
1338     
1339     	p->scb->cmd_cuc = CUC_ABORT;
1340     	ni_attn586();
1341     	WAIT_4_SCB_CMD();
1342     	WAIT_4_SCB_CMD_RUC();
1343     
1344     	dump_cmd->cmd_status = 0;
1345     	dump_cmd->cmd_cmd = CMD_DUMP | CMD_LAST;
1346     	dump_cmd->dump_offset = make16((dump_cmd + 1));
1347     	dump_cmd->cmd_link = 0xffff;
1348     
1349     	p->scb->cbl_offset = make16(dump_cmd);
1350     	p->scb->cmd_cuc = CUC_START;
1351     	ni_attn586();
1352     	WAIT_4_STAT_COMPL(dump_cmd);
1353     
1354     	if( (dump_cmd->cmd_status & (STAT_COMPL|STAT_OK)) != (STAT_COMPL|STAT_OK) )
1355     				printk("%s: Can't get dump information.\n",dev->name);
1356     
1357     	for(i=0;i<170;i++) {
1358     		printk("%02x ",(int) ((unsigned char *) (dump_cmd + 1))[i]);
1359     		if(i % 24 == 23)
1360     			printk("\n");
1361     	}
1362     	printk("\n");
1363     }
1364     #endif
1365     
1366     /*
1367      * END: linux/drivers/net/ni52.c
1368      */
1369