Linux Audio

Check our new training course

Loading...
v6.13.7
  1/* sun3lance.c: Ethernet driver for SUN3 Lance chip */
  2/*
  3
  4  Sun3 Lance ethernet driver, by Sam Creasey (sammy@users.qual.net).
  5  This driver is a part of the linux kernel, and is thus distributed
  6  under the GNU General Public License.
  7
  8  The values used in LANCE_OBIO and LANCE_IRQ seem to be empirically
  9  true for the correct IRQ and address of the lance registers.  They
 10  have not been widely tested, however.  What we probably need is a
 11  "proper" way to search for a device in the sun3's prom, but, alas,
 12  linux has no such thing.
 13
 14  This driver is largely based on atarilance.c, by Roman Hodek.  Other
 15  sources of inspiration were the NetBSD sun3 am7990 driver, and the
 16  linux sparc lance driver (sunlance.c).
 17
 18  There are more assumptions made throughout this driver, it almost
 19  certainly still needs work, but it does work at least for RARP/BOOTP and
 20  mounting the root NFS filesystem.
 21
 22*/
 23
 24static const char version[] =
 25"sun3lance.c: v1.2 1/12/2001  Sam Creasey (sammy@sammy.net)\n";
 26
 27#include <linux/module.h>
 28#include <linux/stddef.h>
 29#include <linux/kernel.h>
 30#include <linux/string.h>
 31#include <linux/errno.h>
 32#include <linux/interrupt.h>
 33#include <linux/init.h>
 34#include <linux/ioport.h>
 35#include <linux/delay.h>
 36#include <linux/netdevice.h>
 37#include <linux/etherdevice.h>
 38#include <linux/skbuff.h>
 39#include <linux/bitops.h>
 40#include <linux/pgtable.h>
 41
 42#include <asm/cacheflush.h>
 43#include <asm/setup.h>
 44#include <asm/irq.h>
 45#include <asm/io.h>
 
 46#include <asm/dvma.h>
 47#include <asm/idprom.h>
 48#include <asm/machines.h>
 49
 50#ifdef CONFIG_SUN3
 51#include <asm/sun3mmu.h>
 52#else
 53#include <asm/sun3xprom.h>
 54#endif
 55
 56/* sun3/60 addr/irq for the lance chip.  If your sun is different,
 57   change this. */
 58#define LANCE_OBIO 0x120000
 59#define LANCE_IRQ IRQ_AUTO_3
 60
 61/* Debug level:
 62 *  0 = silent, print only serious errors
 63 *  1 = normal, print error messages
 64 *  2 = debug, print debug infos
 65 *  3 = debug, print even more debug infos (packet data)
 66 */
 67
 68#define	LANCE_DEBUG	0
 69
 70#ifdef LANCE_DEBUG
 71static int lance_debug = LANCE_DEBUG;
 72#else
 73static int lance_debug = 1;
 74#endif
 75module_param(lance_debug, int, 0);
 76MODULE_PARM_DESC(lance_debug, "SUN3 Lance debug level (0-3)");
 77MODULE_DESCRIPTION("Sun3/Sun3x on-board LANCE Ethernet driver");
 78MODULE_LICENSE("GPL");
 79
 80#define	DPRINTK(n,a) \
 81	do {  \
 82		if (lance_debug >= n)  \
 83			printk a; \
 84	} while( 0 )
 85
 86
 87/* we're only using 32k of memory, so we use 4 TX
 88   buffers and 16 RX buffers.  These values are expressed as log2. */
 89
 90#define TX_LOG_RING_SIZE			3
 91#define RX_LOG_RING_SIZE			5
 92
 93/* These are the derived values */
 94
 95#define TX_RING_SIZE			(1 << TX_LOG_RING_SIZE)
 96#define TX_RING_LEN_BITS		(TX_LOG_RING_SIZE << 5)
 97#define	TX_RING_MOD_MASK		(TX_RING_SIZE - 1)
 98
 99#define RX_RING_SIZE			(1 << RX_LOG_RING_SIZE)
100#define RX_RING_LEN_BITS		(RX_LOG_RING_SIZE << 5)
101#define	RX_RING_MOD_MASK		(RX_RING_SIZE - 1)
102
103/* Definitions for packet buffer access: */
104#define PKT_BUF_SZ		1544
105
106/* Get the address of a packet buffer corresponding to a given buffer head */
107#define	PKTBUF_ADDR(head)	(void *)((unsigned long)(MEM) | (head)->base)
108
109
110/* The LANCE Rx and Tx ring descriptors. */
111struct lance_rx_head {
112	unsigned short	base;		/* Low word of base addr */
113	volatile unsigned char	flag;
114	unsigned char  base_hi;	/* High word of base addr (unused) */
115	short buf_length;	/* This length is 2s complement! */
116	volatile short msg_length;	/* This length is "normal". */
117};
118
119struct lance_tx_head {
120	unsigned short base;		/* Low word of base addr */
121	volatile unsigned char	flag;
122	unsigned char base_hi;	/* High word of base addr (unused) */
123	short length;		/* Length is 2s complement! */
124	volatile short misc;
125};
126
127/* The LANCE initialization block, described in databook. */
128struct lance_init_block {
129	unsigned short	mode;		/* Pre-set mode */
130	unsigned char	hwaddr[6];	/* Physical ethernet address */
131	unsigned int    filter[2];	/* Multicast filter (unused). */
132	/* Receive and transmit ring base, along with length bits. */
133	unsigned short rdra;
134	unsigned short rlen;
135	unsigned short tdra;
136	unsigned short tlen;
137	unsigned short pad[4]; /* is thie needed? */
138};
139
140/* The whole layout of the Lance shared memory */
141struct lance_memory {
142	struct lance_init_block	init;
143	struct lance_tx_head	tx_head[TX_RING_SIZE];
144	struct lance_rx_head	rx_head[RX_RING_SIZE];
145	char   rx_data[RX_RING_SIZE][PKT_BUF_SZ];
146	char   tx_data[TX_RING_SIZE][PKT_BUF_SZ];
147};
148
149/* The driver's private device structure */
150
151struct lance_private {
152	volatile unsigned short	*iobase;
153	struct lance_memory	*mem;
154	int new_rx, new_tx;	/* The next free ring entry */
155	int old_tx, old_rx;     /* ring entry to be processed */
156/* These two must be longs for set_bit() */
157	long	    tx_full;
158	long	    lock;
159};
160
161/* I/O register access macros */
162
163#define	MEM	lp->mem
164#define	DREG	lp->iobase[0]
165#define	AREG	lp->iobase[1]
166#define	REGA(a)	(*( AREG = (a), &DREG ))
167
168/* Definitions for the Lance */
169
170/* tx_head flags */
171#define TMD1_ENP		0x01	/* end of packet */
172#define TMD1_STP		0x02	/* start of packet */
173#define TMD1_DEF		0x04	/* deferred */
174#define TMD1_ONE		0x08	/* one retry needed */
175#define TMD1_MORE		0x10	/* more than one retry needed */
176#define TMD1_ERR		0x40	/* error summary */
177#define TMD1_OWN 		0x80	/* ownership (set: chip owns) */
178
179#define TMD1_OWN_CHIP	TMD1_OWN
180#define TMD1_OWN_HOST	0
181
182/* tx_head misc field */
183#define TMD3_TDR		0x03FF	/* Time Domain Reflectometry counter */
184#define TMD3_RTRY		0x0400	/* failed after 16 retries */
185#define TMD3_LCAR		0x0800	/* carrier lost */
186#define TMD3_LCOL		0x1000	/* late collision */
187#define TMD3_UFLO		0x4000	/* underflow (late memory) */
188#define TMD3_BUFF		0x8000	/* buffering error (no ENP) */
189
190/* rx_head flags */
191#define RMD1_ENP		0x01	/* end of packet */
192#define RMD1_STP		0x02	/* start of packet */
193#define RMD1_BUFF		0x04	/* buffer error */
194#define RMD1_CRC		0x08	/* CRC error */
195#define RMD1_OFLO		0x10	/* overflow */
196#define RMD1_FRAM		0x20	/* framing error */
197#define RMD1_ERR		0x40	/* error summary */
198#define RMD1_OWN 		0x80	/* ownership (set: ship owns) */
199
200#define RMD1_OWN_CHIP	RMD1_OWN
201#define RMD1_OWN_HOST	0
202
203/* register names */
204#define CSR0	0		/* mode/status */
205#define CSR1	1		/* init block addr (low) */
206#define CSR2	2		/* init block addr (high) */
207#define CSR3	3		/* misc */
208#define CSR8	8	  	/* address filter */
209#define CSR15	15		/* promiscuous mode */
210
211/* CSR0 */
212/* (R=readable, W=writeable, S=set on write, C=clear on write) */
213#define CSR0_INIT	0x0001		/* initialize (RS) */
214#define CSR0_STRT	0x0002		/* start (RS) */
215#define CSR0_STOP	0x0004		/* stop (RS) */
216#define CSR0_TDMD	0x0008		/* transmit demand (RS) */
217#define CSR0_TXON	0x0010		/* transmitter on (R) */
218#define CSR0_RXON	0x0020		/* receiver on (R) */
219#define CSR0_INEA	0x0040		/* interrupt enable (RW) */
220#define CSR0_INTR	0x0080		/* interrupt active (R) */
221#define CSR0_IDON	0x0100		/* initialization done (RC) */
222#define CSR0_TINT	0x0200		/* transmitter interrupt (RC) */
223#define CSR0_RINT	0x0400		/* receiver interrupt (RC) */
224#define CSR0_MERR	0x0800		/* memory error (RC) */
225#define CSR0_MISS	0x1000		/* missed frame (RC) */
226#define CSR0_CERR	0x2000		/* carrier error (no heartbeat :-) (RC) */
227#define CSR0_BABL	0x4000		/* babble: tx-ed too many bits (RC) */
228#define CSR0_ERR	0x8000		/* error (RC) */
229
230/* CSR3 */
231#define CSR3_BCON	0x0001		/* byte control */
232#define CSR3_ACON	0x0002		/* ALE control */
233#define CSR3_BSWP	0x0004		/* byte swap (1=big endian) */
234
235/***************************** Prototypes *****************************/
236
237static int lance_probe( struct net_device *dev);
238static int lance_open( struct net_device *dev );
239static void lance_init_ring( struct net_device *dev );
240static netdev_tx_t lance_start_xmit(struct sk_buff *skb,
241				    struct net_device *dev);
242static irqreturn_t lance_interrupt( int irq, void *dev_id);
243static int lance_rx( struct net_device *dev );
244static int lance_close( struct net_device *dev );
245static void set_multicast_list( struct net_device *dev );
246
247/************************* End of Prototypes **************************/
248
249static struct net_device * __init sun3lance_probe(void)
250{
251	struct net_device *dev;
252	static int found;
253	int err = -ENODEV;
254
255	if (!MACH_IS_SUN3 && !MACH_IS_SUN3X)
256		return ERR_PTR(-ENODEV);
257
258	/* check that this machine has an onboard lance */
259	switch(idprom->id_machtype) {
260	case SM_SUN3|SM_3_50:
261	case SM_SUN3|SM_3_60:
262	case SM_SUN3X|SM_3_80:
263		/* these machines have lance */
264		break;
265
266	default:
267		return ERR_PTR(-ENODEV);
268	}
269
270	if (found)
271		return ERR_PTR(-ENODEV);
272
273	dev = alloc_etherdev(sizeof(struct lance_private));
274	if (!dev)
275		return ERR_PTR(-ENOMEM);
 
 
 
 
276
277	if (!lance_probe(dev))
278		goto out;
279
280	err = register_netdev(dev);
281	if (err)
282		goto out1;
283	found = 1;
284	return dev;
285
286out1:
287#ifdef CONFIG_SUN3
288	iounmap((void __iomem *)dev->base_addr);
289#endif
290out:
291	free_netdev(dev);
292	return ERR_PTR(err);
293}
294
295static const struct net_device_ops lance_netdev_ops = {
296	.ndo_open		= lance_open,
297	.ndo_stop		= lance_close,
298	.ndo_start_xmit		= lance_start_xmit,
299	.ndo_set_rx_mode	= set_multicast_list,
300	.ndo_set_mac_address	= NULL,
301	.ndo_validate_addr	= eth_validate_addr,
302};
303
304static int __init lance_probe( struct net_device *dev)
305{
306	unsigned long ioaddr;
307
308	struct lance_private	*lp;
 
309	static int 		did_version;
310	volatile unsigned short *ioaddr_probe;
311	unsigned short tmp1, tmp2;
312
313#ifdef CONFIG_SUN3
314	ioaddr = (unsigned long)ioremap(LANCE_OBIO, PAGE_SIZE);
315	if (!ioaddr)
316		return 0;
317#else
318	ioaddr = SUN3X_LANCE;
319#endif
320
321	/* test to see if there's really a lance here */
322	/* (CSRO_INIT shouldn't be readable) */
323
324	ioaddr_probe = (volatile unsigned short *)ioaddr;
325	tmp1 = ioaddr_probe[0];
326	tmp2 = ioaddr_probe[1];
327
328	ioaddr_probe[1] = CSR0;
329	ioaddr_probe[0] = CSR0_INIT | CSR0_STOP;
330
331	if(ioaddr_probe[0] != CSR0_STOP) {
332		ioaddr_probe[0] = tmp1;
333		ioaddr_probe[1] = tmp2;
334
335#ifdef CONFIG_SUN3
336		iounmap((void __iomem *)ioaddr);
337#endif
338		return 0;
339	}
340
341	lp = netdev_priv(dev);
342
343	/* XXX - leak? */
344	MEM = dvma_malloc_align(sizeof(struct lance_memory), 0x10000);
345	if (!MEM) {
346#ifdef CONFIG_SUN3
347		iounmap((void __iomem *)ioaddr);
348#endif
349		printk(KERN_WARNING "SUN3 Lance couldn't allocate DVMA memory\n");
350		return 0;
351	}
352
353	lp->iobase = (volatile unsigned short *)ioaddr;
354	dev->base_addr = (unsigned long)ioaddr; /* informational only */
355
356	REGA(CSR0) = CSR0_STOP;
357
358	if (request_irq(LANCE_IRQ, lance_interrupt, 0, "SUN3 Lance", dev) < 0) {
359#ifdef CONFIG_SUN3
360		iounmap((void __iomem *)ioaddr);
361#endif
362		dvma_free((void *)MEM);
363		printk(KERN_WARNING "SUN3 Lance unable to allocate IRQ\n");
364		return 0;
365	}
366	dev->irq = (unsigned short)LANCE_IRQ;
367
368
369	printk("%s: SUN3 Lance at io %#lx, mem %#lx, irq %d, hwaddr ",
370		   dev->name,
371		   (unsigned long)ioaddr,
372		   (unsigned long)MEM,
373		   dev->irq);
374
375	/* copy in the ethernet address from the prom */
376	eth_hw_addr_set(dev, idprom->id_ethaddr);
 
377
378	/* tell the card it's ether address, bytes swapped */
379	MEM->init.hwaddr[0] = dev->dev_addr[1];
380	MEM->init.hwaddr[1] = dev->dev_addr[0];
381	MEM->init.hwaddr[2] = dev->dev_addr[3];
382	MEM->init.hwaddr[3] = dev->dev_addr[2];
383	MEM->init.hwaddr[4] = dev->dev_addr[5];
384	MEM->init.hwaddr[5] = dev->dev_addr[4];
385
386	printk("%pM\n", dev->dev_addr);
387
388	MEM->init.mode = 0x0000;
389	MEM->init.filter[0] = 0x00000000;
390	MEM->init.filter[1] = 0x00000000;
391	MEM->init.rdra = dvma_vtob(MEM->rx_head);
392	MEM->init.rlen    = (RX_LOG_RING_SIZE << 13) |
393		(dvma_vtob(MEM->rx_head) >> 16);
394	MEM->init.tdra = dvma_vtob(MEM->tx_head);
395	MEM->init.tlen    = (TX_LOG_RING_SIZE << 13) |
396		(dvma_vtob(MEM->tx_head) >> 16);
397
398	DPRINTK(2, ("initaddr: %08lx rx_ring: %08lx tx_ring: %08lx\n",
399	       dvma_vtob(&(MEM->init)), dvma_vtob(MEM->rx_head),
400	       (dvma_vtob(MEM->tx_head))));
401
402	if (did_version++ == 0)
403		printk( version );
404
405	dev->netdev_ops = &lance_netdev_ops;
406//	KLUDGE -- REMOVE ME
407	set_bit(__LINK_STATE_PRESENT, &dev->state);
408
409
410	return 1;
411}
412
413static int lance_open( struct net_device *dev )
414{
415	struct lance_private *lp = netdev_priv(dev);
416	int i;
417
418	DPRINTK( 2, ( "%s: lance_open()\n", dev->name ));
419
420	REGA(CSR0) = CSR0_STOP;
421
422	lance_init_ring(dev);
423
424	/* From now on, AREG is kept to point to CSR0 */
425	REGA(CSR0) = CSR0_INIT;
426
427	i = 1000000;
428	while (--i > 0)
429		if (DREG & CSR0_IDON)
430			break;
431	if (i <= 0 || (DREG & CSR0_ERR)) {
432		DPRINTK( 2, ( "lance_open(): opening %s failed, i=%d, csr0=%04x\n",
433					  dev->name, i, DREG ));
434		DREG = CSR0_STOP;
435		return -EIO;
436	}
437
438	DREG = CSR0_IDON | CSR0_STRT | CSR0_INEA;
439
440	netif_start_queue(dev);
441
442	DPRINTK( 2, ( "%s: LANCE is open, csr0 %04x\n", dev->name, DREG ));
443
444	return 0;
445}
446
447
448/* Initialize the LANCE Rx and Tx rings. */
449
450static void lance_init_ring( struct net_device *dev )
451{
452	struct lance_private *lp = netdev_priv(dev);
453	int i;
454
455	lp->lock = 0;
456	lp->tx_full = 0;
457	lp->new_rx = lp->new_tx = 0;
458	lp->old_rx = lp->old_tx = 0;
459
460	for( i = 0; i < TX_RING_SIZE; i++ ) {
461		MEM->tx_head[i].base = dvma_vtob(MEM->tx_data[i]);
462		MEM->tx_head[i].flag = 0;
463		MEM->tx_head[i].base_hi =
464			(dvma_vtob(MEM->tx_data[i])) >>16;
465		MEM->tx_head[i].length = 0;
466		MEM->tx_head[i].misc = 0;
467	}
468
469	for( i = 0; i < RX_RING_SIZE; i++ ) {
470		MEM->rx_head[i].base = dvma_vtob(MEM->rx_data[i]);
471		MEM->rx_head[i].flag = RMD1_OWN_CHIP;
472		MEM->rx_head[i].base_hi =
473			(dvma_vtob(MEM->rx_data[i])) >> 16;
474		MEM->rx_head[i].buf_length = -PKT_BUF_SZ | 0xf000;
475		MEM->rx_head[i].msg_length = 0;
476	}
477
478	/* tell the card it's ether address, bytes swapped */
479	MEM->init.hwaddr[0] = dev->dev_addr[1];
480	MEM->init.hwaddr[1] = dev->dev_addr[0];
481	MEM->init.hwaddr[2] = dev->dev_addr[3];
482	MEM->init.hwaddr[3] = dev->dev_addr[2];
483	MEM->init.hwaddr[4] = dev->dev_addr[5];
484	MEM->init.hwaddr[5] = dev->dev_addr[4];
485
486	MEM->init.mode = 0x0000;
487	MEM->init.filter[0] = 0x00000000;
488	MEM->init.filter[1] = 0x00000000;
489	MEM->init.rdra = dvma_vtob(MEM->rx_head);
490	MEM->init.rlen    = (RX_LOG_RING_SIZE << 13) |
491		(dvma_vtob(MEM->rx_head) >> 16);
492	MEM->init.tdra = dvma_vtob(MEM->tx_head);
493	MEM->init.tlen    = (TX_LOG_RING_SIZE << 13) |
494		(dvma_vtob(MEM->tx_head) >> 16);
495
496
497	/* tell the lance the address of its init block */
498	REGA(CSR1) = dvma_vtob(&(MEM->init));
499	REGA(CSR2) = dvma_vtob(&(MEM->init)) >> 16;
500
501#ifdef CONFIG_SUN3X
502	REGA(CSR3) = CSR3_BSWP | CSR3_ACON | CSR3_BCON;
503#else
504	REGA(CSR3) = CSR3_BSWP;
505#endif
506
507}
508
509
510static netdev_tx_t
511lance_start_xmit(struct sk_buff *skb, struct net_device *dev)
512{
513	struct lance_private *lp = netdev_priv(dev);
514	int entry, len;
515	struct lance_tx_head *head;
516	unsigned long flags;
517
518	DPRINTK( 1, ( "%s: transmit start.\n",
519		      dev->name));
520
521	/* Transmitter timeout, serious problems. */
522	if (netif_queue_stopped(dev)) {
523		int tickssofar = jiffies - dev_trans_start(dev);
524		if (tickssofar < HZ/5)
525			return NETDEV_TX_BUSY;
526
527		DPRINTK( 1, ( "%s: transmit timed out, status %04x, resetting.\n",
528					  dev->name, DREG ));
529		DREG = CSR0_STOP;
530		/*
531		 * Always set BSWP after a STOP as STOP puts it back into
532		 * little endian mode.
533		 */
534		REGA(CSR3) = CSR3_BSWP;
535		dev->stats.tx_errors++;
536
537		if(lance_debug >= 2) {
538			int i;
539			printk("Ring data: old_tx %d new_tx %d%s new_rx %d\n",
540			       lp->old_tx, lp->new_tx,
541			       lp->tx_full ? " (full)" : "",
542			       lp->new_rx );
543			for( i = 0 ; i < RX_RING_SIZE; i++ )
544				printk( "rx #%d: base=%04x blen=%04x mlen=%04x\n",
545					i, MEM->rx_head[i].base,
546					-MEM->rx_head[i].buf_length,
547					MEM->rx_head[i].msg_length);
548			for( i = 0 ; i < TX_RING_SIZE; i++ )
549				printk("tx #%d: base=%04x len=%04x misc=%04x\n",
550				       i, MEM->tx_head[i].base,
551				       -MEM->tx_head[i].length,
552				       MEM->tx_head[i].misc );
553		}
554
555		lance_init_ring(dev);
556		REGA( CSR0 ) = CSR0_INEA | CSR0_INIT | CSR0_STRT;
557
558		netif_start_queue(dev);
559
560		return NETDEV_TX_OK;
561	}
562
563
564	/* Block a timer-based transmit from overlapping.  This could better be
565	   done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
566
567	/* Block a timer-based transmit from overlapping with us by
568	   stopping the queue for a bit... */
569
570	netif_stop_queue(dev);
571
572	if (test_and_set_bit( 0, (void*)&lp->lock ) != 0) {
573		printk( "%s: tx queue lock!.\n", dev->name);
574		/* don't clear dev->tbusy flag. */
575		return NETDEV_TX_BUSY;
576	}
577
578	AREG = CSR0;
579	DPRINTK( 2, ( "%s: lance_start_xmit() called, csr0 %4.4x.\n",
580				  dev->name, DREG ));
581
582#ifdef CONFIG_SUN3X
583	/* this weirdness doesn't appear on sun3... */
584	if(!(DREG & CSR0_INIT)) {
585		DPRINTK( 1, ("INIT not set, reinitializing...\n"));
586		REGA( CSR0 ) = CSR0_STOP;
587		lance_init_ring(dev);
588		REGA( CSR0 ) = CSR0_INIT | CSR0_STRT;
589	}
590#endif
591
592	/* Fill in a Tx ring entry */
593#if 0
594	if (lance_debug >= 2) {
595		printk( "%s: TX pkt %d type 0x%04x"
596			" from %s to %s"
597			" data at 0x%08x len %d\n",
598			dev->name, lp->new_tx, ((u_short *)skb->data)[6],
599			DEV_ADDR(&skb->data[6]), DEV_ADDR(skb->data),
600			(int)skb->data, (int)skb->len );
601	}
602#endif
603	/* We're not prepared for the int until the last flags are set/reset.
604	 * And the int may happen already after setting the OWN_CHIP... */
605	local_irq_save(flags);
606
607	/* Mask to ring buffer boundary. */
608	entry = lp->new_tx;
609	head  = &(MEM->tx_head[entry]);
610
611	/* Caution: the write order is important here, set the "ownership" bits
612	 * last.
613	 */
614
615	/* the sun3's lance needs it's buffer padded to the minimum
616	   size */
617	len = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN;
618
619//	head->length = -len;
620	head->length = (-len) | 0xf000;
621	head->misc = 0;
622
623	skb_copy_from_linear_data(skb, PKTBUF_ADDR(head), skb->len);
624	if (len != skb->len)
625		memset(PKTBUF_ADDR(head) + skb->len, 0, len-skb->len);
626
627	head->flag = TMD1_OWN_CHIP | TMD1_ENP | TMD1_STP;
628	lp->new_tx = (lp->new_tx + 1) & TX_RING_MOD_MASK;
629	dev->stats.tx_bytes += skb->len;
630
631	/* Trigger an immediate send poll. */
632	REGA(CSR0) = CSR0_INEA | CSR0_TDMD | CSR0_STRT;
633	AREG = CSR0;
634	DPRINTK( 2, ( "%s: lance_start_xmit() exiting, csr0 %4.4x.\n",
635				  dev->name, DREG ));
636	dev_kfree_skb(skb);
637
638	lp->lock = 0;
639	if ((MEM->tx_head[(entry+1) & TX_RING_MOD_MASK].flag & TMD1_OWN) ==
640	    TMD1_OWN_HOST)
641		netif_start_queue(dev);
642
643	local_irq_restore(flags);
644
645	return NETDEV_TX_OK;
646}
647
648/* The LANCE interrupt handler. */
649
650static irqreturn_t lance_interrupt( int irq, void *dev_id)
651{
652	struct net_device *dev = dev_id;
653	struct lance_private *lp = netdev_priv(dev);
654	int csr0;
 
 
 
 
 
 
 
 
 
 
655
656 still_more:
657	flush_cache_all();
658
659	AREG = CSR0;
660	csr0 = DREG;
661
662	/* ack interrupts */
663	DREG = csr0 & (CSR0_TINT | CSR0_RINT | CSR0_IDON);
664
665	/* clear errors */
666	if(csr0 & CSR0_ERR)
667		DREG = CSR0_BABL | CSR0_MERR | CSR0_CERR | CSR0_MISS;
668
669
670	DPRINTK( 2, ( "%s: interrupt  csr0=%04x new csr=%04x.\n",
671		      dev->name, csr0, DREG ));
672
673	if (csr0 & CSR0_TINT) {			/* Tx-done interrupt */
674		int old_tx = lp->old_tx;
675
676//		if(lance_debug >= 3) {
677//			int i;
678//
679//			printk("%s: tx int\n", dev->name);
680//
681//			for(i = 0; i < TX_RING_SIZE; i++)
682//				printk("ring %d flag=%04x\n", i,
683//				       MEM->tx_head[i].flag);
684//		}
685
686		while( old_tx != lp->new_tx) {
687			struct lance_tx_head *head = &(MEM->tx_head[old_tx]);
688
689			DPRINTK(3, ("on tx_ring %d\n", old_tx));
690
691			if (head->flag & TMD1_OWN_CHIP)
692				break; /* It still hasn't been Txed */
693
694			if (head->flag & TMD1_ERR) {
695				int status = head->misc;
696				dev->stats.tx_errors++;
697				if (status & TMD3_RTRY) dev->stats.tx_aborted_errors++;
698				if (status & TMD3_LCAR) dev->stats.tx_carrier_errors++;
699				if (status & TMD3_LCOL) dev->stats.tx_window_errors++;
700				if (status & (TMD3_UFLO | TMD3_BUFF)) {
701					dev->stats.tx_fifo_errors++;
702					printk("%s: Tx FIFO error\n",
703					       dev->name);
704					REGA(CSR0) = CSR0_STOP;
705					REGA(CSR3) = CSR3_BSWP;
706					lance_init_ring(dev);
707					REGA(CSR0) = CSR0_STRT | CSR0_INEA;
708					return IRQ_HANDLED;
709				}
710			} else if(head->flag & (TMD1_ENP | TMD1_STP)) {
711
712				head->flag &= ~(TMD1_ENP | TMD1_STP);
713				if(head->flag & (TMD1_ONE | TMD1_MORE))
714					dev->stats.collisions++;
715
716				dev->stats.tx_packets++;
717				DPRINTK(3, ("cleared tx ring %d\n", old_tx));
718			}
719			old_tx = (old_tx +1) & TX_RING_MOD_MASK;
720		}
721
722		lp->old_tx = old_tx;
723	}
724
725
726	if (netif_queue_stopped(dev)) {
727		/* The ring is no longer full, clear tbusy. */
728		netif_start_queue(dev);
729		netif_wake_queue(dev);
730	}
731
732	if (csr0 & CSR0_RINT)			/* Rx interrupt */
733		lance_rx( dev );
734
735	/* Log misc errors. */
736	if (csr0 & CSR0_BABL) dev->stats.tx_errors++; /* Tx babble. */
737	if (csr0 & CSR0_MISS) dev->stats.rx_errors++; /* Missed a Rx frame. */
738	if (csr0 & CSR0_MERR) {
739		DPRINTK( 1, ( "%s: Bus master arbitration failure (?!?), "
740			      "status %04x.\n", dev->name, csr0 ));
741		/* Restart the chip. */
742		REGA(CSR0) = CSR0_STOP;
743		REGA(CSR3) = CSR3_BSWP;
744		lance_init_ring(dev);
745		REGA(CSR0) = CSR0_STRT | CSR0_INEA;
746	}
747
748
749    /* Clear any other interrupt, and set interrupt enable. */
750//	DREG = CSR0_BABL | CSR0_CERR | CSR0_MISS | CSR0_MERR |
751//		   CSR0_IDON | CSR0_INEA;
752
753	REGA(CSR0) = CSR0_INEA;
754
755	if(DREG & (CSR0_RINT | CSR0_TINT)) {
756	     DPRINTK(2, ("restarting interrupt, csr0=%#04x\n", DREG));
757	     goto still_more;
758	}
759
760	DPRINTK( 2, ( "%s: exiting interrupt, csr0=%#04x.\n",
761				  dev->name, DREG ));
 
762	return IRQ_HANDLED;
763}
764
765/* get packet, toss into skbuff */
766static int lance_rx( struct net_device *dev )
767{
768	struct lance_private *lp = netdev_priv(dev);
769	int entry = lp->new_rx;
770
771	/* If we own the next entry, it's a new packet. Send it up. */
772	while( (MEM->rx_head[entry].flag & RMD1_OWN) == RMD1_OWN_HOST ) {
773		struct lance_rx_head *head = &(MEM->rx_head[entry]);
774		int status = head->flag;
775
776		if (status != (RMD1_ENP|RMD1_STP)) {  /* There was an error. */
777			/* There is a tricky error noted by John Murphy,
778			   <murf@perftech.com> to Russ Nelson: Even with
779			   full-sized buffers it's possible for a jabber packet to use two
780			   buffers, with only the last correctly noting the error. */
781			if (status & RMD1_ENP)	/* Only count a general error at the */
782				dev->stats.rx_errors++; /* end of a packet.*/
783			if (status & RMD1_FRAM) dev->stats.rx_frame_errors++;
784			if (status & RMD1_OFLO) dev->stats.rx_over_errors++;
785			if (status & RMD1_CRC) dev->stats.rx_crc_errors++;
786			if (status & RMD1_BUFF) dev->stats.rx_fifo_errors++;
787			head->flag &= (RMD1_ENP|RMD1_STP);
788		} else {
789			/* Malloc up new buffer, compatible with net-3. */
790//			short pkt_len = head->msg_length;// & 0xfff;
791			short pkt_len = (head->msg_length & 0xfff) - 4;
792			struct sk_buff *skb;
793
794			if (pkt_len < 60) {
795				printk( "%s: Runt packet!\n", dev->name );
796				dev->stats.rx_errors++;
797			}
798			else {
799				skb = netdev_alloc_skb(dev, pkt_len + 2);
800				if (!skb) {
801					dev->stats.rx_dropped++;
802					head->msg_length = 0;
803					head->flag |= RMD1_OWN_CHIP;
804					lp->new_rx = (lp->new_rx+1) &
805					     RX_RING_MOD_MASK;
806				}
807
808#if 0
809				if (lance_debug >= 3) {
810					u_char *data = PKTBUF_ADDR(head);
811					printk("%s: RX pkt %d type 0x%04x"
812					       " from %pM to %pM",
813					       dev->name, lp->new_tx, ((u_short *)data)[6],
814					       &data[6], data);
815
816					printk(" data %02x %02x %02x %02x %02x %02x %02x %02x "
817					       "len %d at %08x\n",
818					       data[15], data[16], data[17], data[18],
819					       data[19], data[20], data[21], data[22],
820					       pkt_len, data);
821				}
822#endif
823				if (lance_debug >= 3) {
824					u_char *data = PKTBUF_ADDR(head);
825					printk( "%s: RX pkt %d type 0x%04x len %d\n ", dev->name, entry, ((u_short *)data)[6], pkt_len);
826				}
827
828
829				skb_reserve( skb, 2 );	/* 16 byte align */
830				skb_put( skb, pkt_len );	/* Make room */
831				skb_copy_to_linear_data(skb,
832						 PKTBUF_ADDR(head),
833						 pkt_len);
834
835				skb->protocol = eth_type_trans( skb, dev );
836				netif_rx( skb );
837				dev->stats.rx_packets++;
838				dev->stats.rx_bytes += pkt_len;
839			}
840		}
841
842//		head->buf_length = -PKT_BUF_SZ | 0xf000;
843		head->msg_length = 0;
844		head->flag = RMD1_OWN_CHIP;
845
846		entry = lp->new_rx = (lp->new_rx +1) & RX_RING_MOD_MASK;
847	}
848
849	/* From lance.c (Donald Becker): */
850	/* We should check that at least two ring entries are free.
851	   If not, we should free one and mark stats->rx_dropped++. */
852
853	return 0;
854}
855
856
857static int lance_close( struct net_device *dev )
858{
859	struct lance_private *lp = netdev_priv(dev);
860
861	netif_stop_queue(dev);
862
863	AREG = CSR0;
864
865	DPRINTK( 2, ( "%s: Shutting down ethercard, status was %2.2x.\n",
866				  dev->name, DREG ));
867
868	/* We stop the LANCE here -- it occasionally polls
869	   memory if we don't. */
870	DREG = CSR0_STOP;
871	return 0;
872}
873
874
875/* Set or clear the multicast filter for this adaptor.
876   num_addrs == -1		Promiscuous mode, receive all packets
877   num_addrs == 0		Normal mode, clear multicast list
878   num_addrs > 0		Multicast mode, receive normal and MC packets, and do
879						best-effort filtering.
880 */
881
882/* completely untested on a sun3 */
883static void set_multicast_list( struct net_device *dev )
884{
885	struct lance_private *lp = netdev_priv(dev);
886
887	if(netif_queue_stopped(dev))
888		/* Only possible if board is already started */
889		return;
890
891	/* We take the simple way out and always enable promiscuous mode. */
892	DREG = CSR0_STOP; /* Temporarily stop the lance. */
893
894	if (dev->flags & IFF_PROMISC) {
895		/* Log any net taps. */
896		DPRINTK( 3, ( "%s: Promiscuous mode enabled.\n", dev->name ));
897		REGA( CSR15 ) = 0x8000; /* Set promiscuous mode */
898	} else {
899		short multicast_table[4];
900		int num_addrs = netdev_mc_count(dev);
901		int i;
902		/* We don't use the multicast table, but rely on upper-layer
903		 * filtering. */
904		memset( multicast_table, (num_addrs == 0) ? 0 : -1,
905				sizeof(multicast_table) );
906		for( i = 0; i < 4; i++ )
907			REGA( CSR8+i ) = multicast_table[i];
908		REGA( CSR15 ) = 0; /* Unset promiscuous mode */
909	}
910
911	/*
912	 * Always set BSWP after a STOP as STOP puts it back into
913	 * little endian mode.
914	 */
915	REGA( CSR3 ) = CSR3_BSWP;
916
917	/* Resume normal operation and reset AREG to CSR0 */
918	REGA( CSR0 ) = CSR0_IDON | CSR0_INEA | CSR0_STRT;
919}
920
921
 
 
922static struct net_device *sun3lance_dev;
923
924static int __init sun3lance_init(void)
925{
926	sun3lance_dev = sun3lance_probe();
927	return PTR_ERR_OR_ZERO(sun3lance_dev);
928}
929module_init(sun3lance_init);
930
931static void __exit sun3lance_cleanup(void)
932{
933	unregister_netdev(sun3lance_dev);
934#ifdef CONFIG_SUN3
935	iounmap((void __iomem *)sun3lance_dev->base_addr);
936#endif
937	free_netdev(sun3lance_dev);
938}
939module_exit(sun3lance_cleanup);
 
 
v4.10.11
  1/* sun3lance.c: Ethernet driver for SUN3 Lance chip */
  2/*
  3
  4  Sun3 Lance ethernet driver, by Sam Creasey (sammy@users.qual.net).
  5  This driver is a part of the linux kernel, and is thus distributed
  6  under the GNU General Public License.
  7
  8  The values used in LANCE_OBIO and LANCE_IRQ seem to be empirically
  9  true for the correct IRQ and address of the lance registers.  They
 10  have not been widely tested, however.  What we probably need is a
 11  "proper" way to search for a device in the sun3's prom, but, alas,
 12  linux has no such thing.
 13
 14  This driver is largely based on atarilance.c, by Roman Hodek.  Other
 15  sources of inspiration were the NetBSD sun3 am7990 driver, and the
 16  linux sparc lance driver (sunlance.c).
 17
 18  There are more assumptions made throughout this driver, it almost
 19  certainly still needs work, but it does work at least for RARP/BOOTP and
 20  mounting the root NFS filesystem.
 21
 22*/
 23
 24static char *version = "sun3lance.c: v1.2 1/12/2001  Sam Creasey (sammy@sammy.net)\n";
 
 25
 26#include <linux/module.h>
 27#include <linux/stddef.h>
 28#include <linux/kernel.h>
 29#include <linux/string.h>
 30#include <linux/errno.h>
 31#include <linux/interrupt.h>
 32#include <linux/init.h>
 33#include <linux/ioport.h>
 34#include <linux/delay.h>
 35#include <linux/netdevice.h>
 36#include <linux/etherdevice.h>
 37#include <linux/skbuff.h>
 38#include <linux/bitops.h>
 
 39
 40#include <asm/cacheflush.h>
 41#include <asm/setup.h>
 42#include <asm/irq.h>
 43#include <asm/io.h>
 44#include <asm/pgtable.h>
 45#include <asm/dvma.h>
 46#include <asm/idprom.h>
 47#include <asm/machines.h>
 48
 49#ifdef CONFIG_SUN3
 50#include <asm/sun3mmu.h>
 51#else
 52#include <asm/sun3xprom.h>
 53#endif
 54
 55/* sun3/60 addr/irq for the lance chip.  If your sun is different,
 56   change this. */
 57#define LANCE_OBIO 0x120000
 58#define LANCE_IRQ IRQ_AUTO_3
 59
 60/* Debug level:
 61 *  0 = silent, print only serious errors
 62 *  1 = normal, print error messages
 63 *  2 = debug, print debug infos
 64 *  3 = debug, print even more debug infos (packet data)
 65 */
 66
 67#define	LANCE_DEBUG	0
 68
 69#ifdef LANCE_DEBUG
 70static int lance_debug = LANCE_DEBUG;
 71#else
 72static int lance_debug = 1;
 73#endif
 74module_param(lance_debug, int, 0);
 75MODULE_PARM_DESC(lance_debug, "SUN3 Lance debug level (0-3)");
 
 76MODULE_LICENSE("GPL");
 77
 78#define	DPRINTK(n,a) \
 79	do {  \
 80		if (lance_debug >= n)  \
 81			printk a; \
 82	} while( 0 )
 83
 84
 85/* we're only using 32k of memory, so we use 4 TX
 86   buffers and 16 RX buffers.  These values are expressed as log2. */
 87
 88#define TX_LOG_RING_SIZE			3
 89#define RX_LOG_RING_SIZE			5
 90
 91/* These are the derived values */
 92
 93#define TX_RING_SIZE			(1 << TX_LOG_RING_SIZE)
 94#define TX_RING_LEN_BITS		(TX_LOG_RING_SIZE << 5)
 95#define	TX_RING_MOD_MASK		(TX_RING_SIZE - 1)
 96
 97#define RX_RING_SIZE			(1 << RX_LOG_RING_SIZE)
 98#define RX_RING_LEN_BITS		(RX_LOG_RING_SIZE << 5)
 99#define	RX_RING_MOD_MASK		(RX_RING_SIZE - 1)
100
101/* Definitions for packet buffer access: */
102#define PKT_BUF_SZ		1544
103
104/* Get the address of a packet buffer corresponding to a given buffer head */
105#define	PKTBUF_ADDR(head)	(void *)((unsigned long)(MEM) | (head)->base)
106
107
108/* The LANCE Rx and Tx ring descriptors. */
109struct lance_rx_head {
110	unsigned short	base;		/* Low word of base addr */
111	volatile unsigned char	flag;
112	unsigned char  base_hi;	/* High word of base addr (unused) */
113	short buf_length;	/* This length is 2s complement! */
114	volatile short msg_length;	/* This length is "normal". */
115};
116
117struct lance_tx_head {
118	unsigned short base;		/* Low word of base addr */
119	volatile unsigned char	flag;
120	unsigned char base_hi;	/* High word of base addr (unused) */
121	short length;		/* Length is 2s complement! */
122	volatile short misc;
123};
124
125/* The LANCE initialization block, described in databook. */
126struct lance_init_block {
127	unsigned short	mode;		/* Pre-set mode */
128	unsigned char	hwaddr[6];	/* Physical ethernet address */
129	unsigned int    filter[2];	/* Multicast filter (unused). */
130	/* Receive and transmit ring base, along with length bits. */
131	unsigned short rdra;
132	unsigned short rlen;
133	unsigned short tdra;
134	unsigned short tlen;
135	unsigned short pad[4]; /* is thie needed? */
136};
137
138/* The whole layout of the Lance shared memory */
139struct lance_memory {
140	struct lance_init_block	init;
141	struct lance_tx_head	tx_head[TX_RING_SIZE];
142	struct lance_rx_head	rx_head[RX_RING_SIZE];
143	char   rx_data[RX_RING_SIZE][PKT_BUF_SZ];
144	char   tx_data[TX_RING_SIZE][PKT_BUF_SZ];
145};
146
147/* The driver's private device structure */
148
149struct lance_private {
150	volatile unsigned short	*iobase;
151	struct lance_memory	*mem;
152     	int new_rx, new_tx;	/* The next free ring entry */
153	int old_tx, old_rx;     /* ring entry to be processed */
154/* These two must be longs for set_bit() */
155	long	    tx_full;
156	long	    lock;
157};
158
159/* I/O register access macros */
160
161#define	MEM	lp->mem
162#define	DREG	lp->iobase[0]
163#define	AREG	lp->iobase[1]
164#define	REGA(a)	(*( AREG = (a), &DREG ))
165
166/* Definitions for the Lance */
167
168/* tx_head flags */
169#define TMD1_ENP		0x01	/* end of packet */
170#define TMD1_STP		0x02	/* start of packet */
171#define TMD1_DEF		0x04	/* deferred */
172#define TMD1_ONE		0x08	/* one retry needed */
173#define TMD1_MORE		0x10	/* more than one retry needed */
174#define TMD1_ERR		0x40	/* error summary */
175#define TMD1_OWN 		0x80	/* ownership (set: chip owns) */
176
177#define TMD1_OWN_CHIP	TMD1_OWN
178#define TMD1_OWN_HOST	0
179
180/* tx_head misc field */
181#define TMD3_TDR		0x03FF	/* Time Domain Reflectometry counter */
182#define TMD3_RTRY		0x0400	/* failed after 16 retries */
183#define TMD3_LCAR		0x0800	/* carrier lost */
184#define TMD3_LCOL		0x1000	/* late collision */
185#define TMD3_UFLO		0x4000	/* underflow (late memory) */
186#define TMD3_BUFF		0x8000	/* buffering error (no ENP) */
187
188/* rx_head flags */
189#define RMD1_ENP		0x01	/* end of packet */
190#define RMD1_STP		0x02	/* start of packet */
191#define RMD1_BUFF		0x04	/* buffer error */
192#define RMD1_CRC		0x08	/* CRC error */
193#define RMD1_OFLO		0x10	/* overflow */
194#define RMD1_FRAM		0x20	/* framing error */
195#define RMD1_ERR		0x40	/* error summary */
196#define RMD1_OWN 		0x80	/* ownership (set: ship owns) */
197
198#define RMD1_OWN_CHIP	RMD1_OWN
199#define RMD1_OWN_HOST	0
200
201/* register names */
202#define CSR0	0		/* mode/status */
203#define CSR1	1		/* init block addr (low) */
204#define CSR2	2		/* init block addr (high) */
205#define CSR3	3		/* misc */
206#define CSR8	8	  	/* address filter */
207#define CSR15	15		/* promiscuous mode */
208
209/* CSR0 */
210/* (R=readable, W=writeable, S=set on write, C=clear on write) */
211#define CSR0_INIT	0x0001		/* initialize (RS) */
212#define CSR0_STRT	0x0002		/* start (RS) */
213#define CSR0_STOP	0x0004		/* stop (RS) */
214#define CSR0_TDMD	0x0008		/* transmit demand (RS) */
215#define CSR0_TXON	0x0010		/* transmitter on (R) */
216#define CSR0_RXON	0x0020		/* receiver on (R) */
217#define CSR0_INEA	0x0040		/* interrupt enable (RW) */
218#define CSR0_INTR	0x0080		/* interrupt active (R) */
219#define CSR0_IDON	0x0100		/* initialization done (RC) */
220#define CSR0_TINT	0x0200		/* transmitter interrupt (RC) */
221#define CSR0_RINT	0x0400		/* receiver interrupt (RC) */
222#define CSR0_MERR	0x0800		/* memory error (RC) */
223#define CSR0_MISS	0x1000		/* missed frame (RC) */
224#define CSR0_CERR	0x2000		/* carrier error (no heartbeat :-) (RC) */
225#define CSR0_BABL	0x4000		/* babble: tx-ed too many bits (RC) */
226#define CSR0_ERR	0x8000		/* error (RC) */
227
228/* CSR3 */
229#define CSR3_BCON	0x0001		/* byte control */
230#define CSR3_ACON	0x0002		/* ALE control */
231#define CSR3_BSWP	0x0004		/* byte swap (1=big endian) */
232
233/***************************** Prototypes *****************************/
234
235static int lance_probe( struct net_device *dev);
236static int lance_open( struct net_device *dev );
237static void lance_init_ring( struct net_device *dev );
238static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev );
 
239static irqreturn_t lance_interrupt( int irq, void *dev_id);
240static int lance_rx( struct net_device *dev );
241static int lance_close( struct net_device *dev );
242static void set_multicast_list( struct net_device *dev );
243
244/************************* End of Prototypes **************************/
245
246struct net_device * __init sun3lance_probe(int unit)
247{
248	struct net_device *dev;
249	static int found;
250	int err = -ENODEV;
251
252	if (!MACH_IS_SUN3 && !MACH_IS_SUN3X)
253		return ERR_PTR(-ENODEV);
254
255	/* check that this machine has an onboard lance */
256	switch(idprom->id_machtype) {
257	case SM_SUN3|SM_3_50:
258	case SM_SUN3|SM_3_60:
259	case SM_SUN3X|SM_3_80:
260		/* these machines have lance */
261		break;
262
263	default:
264		return ERR_PTR(-ENODEV);
265	}
266
267	if (found)
268		return ERR_PTR(-ENODEV);
269
270	dev = alloc_etherdev(sizeof(struct lance_private));
271	if (!dev)
272		return ERR_PTR(-ENOMEM);
273	if (unit >= 0) {
274		sprintf(dev->name, "eth%d", unit);
275		netdev_boot_setup_check(dev);
276	}
277
278	if (!lance_probe(dev))
279		goto out;
280
281	err = register_netdev(dev);
282	if (err)
283		goto out1;
284	found = 1;
285	return dev;
286
287out1:
288#ifdef CONFIG_SUN3
289	iounmap((void __iomem *)dev->base_addr);
290#endif
291out:
292	free_netdev(dev);
293	return ERR_PTR(err);
294}
295
296static const struct net_device_ops lance_netdev_ops = {
297	.ndo_open		= lance_open,
298	.ndo_stop		= lance_close,
299	.ndo_start_xmit		= lance_start_xmit,
300	.ndo_set_rx_mode	= set_multicast_list,
301	.ndo_set_mac_address	= NULL,
302	.ndo_validate_addr	= eth_validate_addr,
303};
304
305static int __init lance_probe( struct net_device *dev)
306{
307	unsigned long ioaddr;
308
309	struct lance_private	*lp;
310	int 			i;
311	static int 		did_version;
312	volatile unsigned short *ioaddr_probe;
313	unsigned short tmp1, tmp2;
314
315#ifdef CONFIG_SUN3
316	ioaddr = (unsigned long)ioremap(LANCE_OBIO, PAGE_SIZE);
317	if (!ioaddr)
318		return 0;
319#else
320	ioaddr = SUN3X_LANCE;
321#endif
322
323	/* test to see if there's really a lance here */
324	/* (CSRO_INIT shouldn't be readable) */
325
326	ioaddr_probe = (volatile unsigned short *)ioaddr;
327	tmp1 = ioaddr_probe[0];
328	tmp2 = ioaddr_probe[1];
329
330	ioaddr_probe[1] = CSR0;
331	ioaddr_probe[0] = CSR0_INIT | CSR0_STOP;
332
333	if(ioaddr_probe[0] != CSR0_STOP) {
334		ioaddr_probe[0] = tmp1;
335		ioaddr_probe[1] = tmp2;
336
337#ifdef CONFIG_SUN3
338		iounmap((void __iomem *)ioaddr);
339#endif
340		return 0;
341	}
342
343	lp = netdev_priv(dev);
344
345	/* XXX - leak? */
346	MEM = dvma_malloc_align(sizeof(struct lance_memory), 0x10000);
347	if (MEM == NULL) {
348#ifdef CONFIG_SUN3
349		iounmap((void __iomem *)ioaddr);
350#endif
351		printk(KERN_WARNING "SUN3 Lance couldn't allocate DVMA memory\n");
352		return 0;
353	}
354
355	lp->iobase = (volatile unsigned short *)ioaddr;
356	dev->base_addr = (unsigned long)ioaddr; /* informational only */
357
358	REGA(CSR0) = CSR0_STOP;
359
360	if (request_irq(LANCE_IRQ, lance_interrupt, 0, "SUN3 Lance", dev) < 0) {
361#ifdef CONFIG_SUN3
362		iounmap((void __iomem *)ioaddr);
363#endif
364		dvma_free((void *)MEM);
365		printk(KERN_WARNING "SUN3 Lance unable to allocate IRQ\n");
366		return 0;
367	}
368	dev->irq = (unsigned short)LANCE_IRQ;
369
370
371	printk("%s: SUN3 Lance at io %#lx, mem %#lx, irq %d, hwaddr ",
372		   dev->name,
373		   (unsigned long)ioaddr,
374		   (unsigned long)MEM,
375		   dev->irq);
376
377	/* copy in the ethernet address from the prom */
378	for(i = 0; i < 6 ; i++)
379	     dev->dev_addr[i] = idprom->id_ethaddr[i];
380
381	/* tell the card it's ether address, bytes swapped */
382	MEM->init.hwaddr[0] = dev->dev_addr[1];
383	MEM->init.hwaddr[1] = dev->dev_addr[0];
384	MEM->init.hwaddr[2] = dev->dev_addr[3];
385	MEM->init.hwaddr[3] = dev->dev_addr[2];
386	MEM->init.hwaddr[4] = dev->dev_addr[5];
387	MEM->init.hwaddr[5] = dev->dev_addr[4];
388
389	printk("%pM\n", dev->dev_addr);
390
391	MEM->init.mode = 0x0000;
392	MEM->init.filter[0] = 0x00000000;
393	MEM->init.filter[1] = 0x00000000;
394	MEM->init.rdra = dvma_vtob(MEM->rx_head);
395	MEM->init.rlen    = (RX_LOG_RING_SIZE << 13) |
396		(dvma_vtob(MEM->rx_head) >> 16);
397	MEM->init.tdra = dvma_vtob(MEM->tx_head);
398	MEM->init.tlen    = (TX_LOG_RING_SIZE << 13) |
399		(dvma_vtob(MEM->tx_head) >> 16);
400
401	DPRINTK(2, ("initaddr: %08lx rx_ring: %08lx tx_ring: %08lx\n",
402	       dvma_vtob(&(MEM->init)), dvma_vtob(MEM->rx_head),
403	       (dvma_vtob(MEM->tx_head))));
404
405	if (did_version++ == 0)
406		printk( version );
407
408	dev->netdev_ops = &lance_netdev_ops;
409//	KLUDGE -- REMOVE ME
410	set_bit(__LINK_STATE_PRESENT, &dev->state);
411
412
413	return 1;
414}
415
416static int lance_open( struct net_device *dev )
417{
418	struct lance_private *lp = netdev_priv(dev);
419	int i;
420
421	DPRINTK( 2, ( "%s: lance_open()\n", dev->name ));
422
423	REGA(CSR0) = CSR0_STOP;
424
425	lance_init_ring(dev);
426
427	/* From now on, AREG is kept to point to CSR0 */
428	REGA(CSR0) = CSR0_INIT;
429
430	i = 1000000;
431	while (--i > 0)
432		if (DREG & CSR0_IDON)
433			break;
434	if (i <= 0 || (DREG & CSR0_ERR)) {
435		DPRINTK( 2, ( "lance_open(): opening %s failed, i=%d, csr0=%04x\n",
436					  dev->name, i, DREG ));
437		DREG = CSR0_STOP;
438		return -EIO;
439	}
440
441	DREG = CSR0_IDON | CSR0_STRT | CSR0_INEA;
442
443	netif_start_queue(dev);
444
445	DPRINTK( 2, ( "%s: LANCE is open, csr0 %04x\n", dev->name, DREG ));
446
447	return 0;
448}
449
450
451/* Initialize the LANCE Rx and Tx rings. */
452
453static void lance_init_ring( struct net_device *dev )
454{
455	struct lance_private *lp = netdev_priv(dev);
456	int i;
457
458	lp->lock = 0;
459	lp->tx_full = 0;
460	lp->new_rx = lp->new_tx = 0;
461	lp->old_rx = lp->old_tx = 0;
462
463	for( i = 0; i < TX_RING_SIZE; i++ ) {
464		MEM->tx_head[i].base = dvma_vtob(MEM->tx_data[i]);
465		MEM->tx_head[i].flag = 0;
466 		MEM->tx_head[i].base_hi =
467			(dvma_vtob(MEM->tx_data[i])) >>16;
468		MEM->tx_head[i].length = 0;
469		MEM->tx_head[i].misc = 0;
470	}
471
472	for( i = 0; i < RX_RING_SIZE; i++ ) {
473		MEM->rx_head[i].base = dvma_vtob(MEM->rx_data[i]);
474		MEM->rx_head[i].flag = RMD1_OWN_CHIP;
475		MEM->rx_head[i].base_hi =
476			(dvma_vtob(MEM->rx_data[i])) >> 16;
477		MEM->rx_head[i].buf_length = -PKT_BUF_SZ | 0xf000;
478		MEM->rx_head[i].msg_length = 0;
479	}
480
481	/* tell the card it's ether address, bytes swapped */
482	MEM->init.hwaddr[0] = dev->dev_addr[1];
483	MEM->init.hwaddr[1] = dev->dev_addr[0];
484	MEM->init.hwaddr[2] = dev->dev_addr[3];
485	MEM->init.hwaddr[3] = dev->dev_addr[2];
486	MEM->init.hwaddr[4] = dev->dev_addr[5];
487	MEM->init.hwaddr[5] = dev->dev_addr[4];
488
489	MEM->init.mode = 0x0000;
490	MEM->init.filter[0] = 0x00000000;
491	MEM->init.filter[1] = 0x00000000;
492	MEM->init.rdra = dvma_vtob(MEM->rx_head);
493	MEM->init.rlen    = (RX_LOG_RING_SIZE << 13) |
494		(dvma_vtob(MEM->rx_head) >> 16);
495	MEM->init.tdra = dvma_vtob(MEM->tx_head);
496	MEM->init.tlen    = (TX_LOG_RING_SIZE << 13) |
497		(dvma_vtob(MEM->tx_head) >> 16);
498
499
500	/* tell the lance the address of its init block */
501	REGA(CSR1) = dvma_vtob(&(MEM->init));
502	REGA(CSR2) = dvma_vtob(&(MEM->init)) >> 16;
503
504#ifdef CONFIG_SUN3X
505	REGA(CSR3) = CSR3_BSWP | CSR3_ACON | CSR3_BCON;
506#else
507	REGA(CSR3) = CSR3_BSWP;
508#endif
509
510}
511
512
513static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev )
 
514{
515	struct lance_private *lp = netdev_priv(dev);
516	int entry, len;
517	struct lance_tx_head *head;
518	unsigned long flags;
519
520	DPRINTK( 1, ( "%s: transmit start.\n",
521		      dev->name));
522
523	/* Transmitter timeout, serious problems. */
524	if (netif_queue_stopped(dev)) {
525		int tickssofar = jiffies - dev_trans_start(dev);
526		if (tickssofar < HZ/5)
527			return NETDEV_TX_BUSY;
528
529		DPRINTK( 1, ( "%s: transmit timed out, status %04x, resetting.\n",
530					  dev->name, DREG ));
531		DREG = CSR0_STOP;
532		/*
533		 * Always set BSWP after a STOP as STOP puts it back into
534		 * little endian mode.
535		 */
536		REGA(CSR3) = CSR3_BSWP;
537		dev->stats.tx_errors++;
538
539		if(lance_debug >= 2) {
540			int i;
541			printk("Ring data: old_tx %d new_tx %d%s new_rx %d\n",
542			       lp->old_tx, lp->new_tx,
543			       lp->tx_full ? " (full)" : "",
544			       lp->new_rx );
545			for( i = 0 ; i < RX_RING_SIZE; i++ )
546				printk( "rx #%d: base=%04x blen=%04x mlen=%04x\n",
547					i, MEM->rx_head[i].base,
548					-MEM->rx_head[i].buf_length,
549					MEM->rx_head[i].msg_length);
550			for( i = 0 ; i < TX_RING_SIZE; i++ )
551				printk("tx #%d: base=%04x len=%04x misc=%04x\n",
552				       i, MEM->tx_head[i].base,
553				       -MEM->tx_head[i].length,
554				       MEM->tx_head[i].misc );
555		}
556
557		lance_init_ring(dev);
558		REGA( CSR0 ) = CSR0_INEA | CSR0_INIT | CSR0_STRT;
559
560		netif_start_queue(dev);
561
562		return NETDEV_TX_OK;
563	}
564
565
566	/* Block a timer-based transmit from overlapping.  This could better be
567	   done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
568
569	/* Block a timer-based transmit from overlapping with us by
570	   stopping the queue for a bit... */
571
572	netif_stop_queue(dev);
573
574	if (test_and_set_bit( 0, (void*)&lp->lock ) != 0) {
575		printk( "%s: tx queue lock!.\n", dev->name);
576		/* don't clear dev->tbusy flag. */
577		return NETDEV_TX_BUSY;
578	}
579
580	AREG = CSR0;
581  	DPRINTK( 2, ( "%s: lance_start_xmit() called, csr0 %4.4x.\n",
582  				  dev->name, DREG ));
583
584#ifdef CONFIG_SUN3X
585	/* this weirdness doesn't appear on sun3... */
586	if(!(DREG & CSR0_INIT)) {
587		DPRINTK( 1, ("INIT not set, reinitializing...\n"));
588		REGA( CSR0 ) = CSR0_STOP;
589		lance_init_ring(dev);
590		REGA( CSR0 ) = CSR0_INIT | CSR0_STRT;
591	}
592#endif
593
594	/* Fill in a Tx ring entry */
595#if 0
596	if (lance_debug >= 2) {
597		printk( "%s: TX pkt %d type 0x%04x"
598			" from %s to %s"
599			" data at 0x%08x len %d\n",
600			dev->name, lp->new_tx, ((u_short *)skb->data)[6],
601			DEV_ADDR(&skb->data[6]), DEV_ADDR(skb->data),
602			(int)skb->data, (int)skb->len );
603	}
604#endif
605	/* We're not prepared for the int until the last flags are set/reset.
606	 * And the int may happen already after setting the OWN_CHIP... */
607	local_irq_save(flags);
608
609	/* Mask to ring buffer boundary. */
610	entry = lp->new_tx;
611	head  = &(MEM->tx_head[entry]);
612
613	/* Caution: the write order is important here, set the "ownership" bits
614	 * last.
615	 */
616
617	/* the sun3's lance needs it's buffer padded to the minimum
618	   size */
619	len = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN;
620
621//	head->length = -len;
622	head->length = (-len) | 0xf000;
623	head->misc = 0;
624
625	skb_copy_from_linear_data(skb, PKTBUF_ADDR(head), skb->len);
626	if (len != skb->len)
627		memset(PKTBUF_ADDR(head) + skb->len, 0, len-skb->len);
628
629	head->flag = TMD1_OWN_CHIP | TMD1_ENP | TMD1_STP;
630	lp->new_tx = (lp->new_tx + 1) & TX_RING_MOD_MASK;
631	dev->stats.tx_bytes += skb->len;
632
633	/* Trigger an immediate send poll. */
634	REGA(CSR0) = CSR0_INEA | CSR0_TDMD | CSR0_STRT;
635	AREG = CSR0;
636  	DPRINTK( 2, ( "%s: lance_start_xmit() exiting, csr0 %4.4x.\n",
637  				  dev->name, DREG ));
638	dev_kfree_skb(skb);
639
640	lp->lock = 0;
641	if ((MEM->tx_head[(entry+1) & TX_RING_MOD_MASK].flag & TMD1_OWN) ==
642	    TMD1_OWN_HOST)
643		netif_start_queue(dev);
644
645	local_irq_restore(flags);
646
647	return NETDEV_TX_OK;
648}
649
650/* The LANCE interrupt handler. */
651
652static irqreturn_t lance_interrupt( int irq, void *dev_id)
653{
654	struct net_device *dev = dev_id;
655	struct lance_private *lp = netdev_priv(dev);
656	int csr0;
657	static int in_interrupt;
658
659	if (dev == NULL) {
660		DPRINTK( 1, ( "lance_interrupt(): invalid dev_id\n" ));
661		return IRQ_NONE;
662	}
663
664	if (in_interrupt)
665		DPRINTK( 2, ( "%s: Re-entering the interrupt handler.\n", dev->name ));
666	in_interrupt = 1;
667
668 still_more:
669	flush_cache_all();
670
671	AREG = CSR0;
672	csr0 = DREG;
673
674	/* ack interrupts */
675	DREG = csr0 & (CSR0_TINT | CSR0_RINT | CSR0_IDON);
676
677	/* clear errors */
678	if(csr0 & CSR0_ERR)
679		DREG = CSR0_BABL | CSR0_MERR | CSR0_CERR | CSR0_MISS;
680
681
682	DPRINTK( 2, ( "%s: interrupt  csr0=%04x new csr=%04x.\n",
683		      dev->name, csr0, DREG ));
684
685	if (csr0 & CSR0_TINT) {			/* Tx-done interrupt */
686		int old_tx = lp->old_tx;
687
688//		if(lance_debug >= 3) {
689//			int i;
690//
691//			printk("%s: tx int\n", dev->name);
692//
693//			for(i = 0; i < TX_RING_SIZE; i++)
694//				printk("ring %d flag=%04x\n", i,
695//				       MEM->tx_head[i].flag);
696//		}
697
698		while( old_tx != lp->new_tx) {
699			struct lance_tx_head *head = &(MEM->tx_head[old_tx]);
700
701			DPRINTK(3, ("on tx_ring %d\n", old_tx));
702
703			if (head->flag & TMD1_OWN_CHIP)
704				break; /* It still hasn't been Txed */
705
706			if (head->flag & TMD1_ERR) {
707				int status = head->misc;
708				dev->stats.tx_errors++;
709				if (status & TMD3_RTRY) dev->stats.tx_aborted_errors++;
710				if (status & TMD3_LCAR) dev->stats.tx_carrier_errors++;
711				if (status & TMD3_LCOL) dev->stats.tx_window_errors++;
712				if (status & (TMD3_UFLO | TMD3_BUFF)) {
713					dev->stats.tx_fifo_errors++;
714					printk("%s: Tx FIFO error\n",
715					       dev->name);
716					REGA(CSR0) = CSR0_STOP;
717					REGA(CSR3) = CSR3_BSWP;
718					lance_init_ring(dev);
719					REGA(CSR0) = CSR0_STRT | CSR0_INEA;
720					return IRQ_HANDLED;
721				}
722			} else if(head->flag & (TMD1_ENP | TMD1_STP)) {
723
724				head->flag &= ~(TMD1_ENP | TMD1_STP);
725				if(head->flag & (TMD1_ONE | TMD1_MORE))
726					dev->stats.collisions++;
727
728				dev->stats.tx_packets++;
729				DPRINTK(3, ("cleared tx ring %d\n", old_tx));
730			}
731			old_tx = (old_tx +1) & TX_RING_MOD_MASK;
732		}
733
734		lp->old_tx = old_tx;
735	}
736
737
738	if (netif_queue_stopped(dev)) {
739		/* The ring is no longer full, clear tbusy. */
740		netif_start_queue(dev);
741		netif_wake_queue(dev);
742	}
743
744	if (csr0 & CSR0_RINT)			/* Rx interrupt */
745		lance_rx( dev );
746
747	/* Log misc errors. */
748	if (csr0 & CSR0_BABL) dev->stats.tx_errors++; /* Tx babble. */
749	if (csr0 & CSR0_MISS) dev->stats.rx_errors++; /* Missed a Rx frame. */
750	if (csr0 & CSR0_MERR) {
751		DPRINTK( 1, ( "%s: Bus master arbitration failure (?!?), "
752			      "status %04x.\n", dev->name, csr0 ));
753		/* Restart the chip. */
754		REGA(CSR0) = CSR0_STOP;
755		REGA(CSR3) = CSR3_BSWP;
756		lance_init_ring(dev);
757		REGA(CSR0) = CSR0_STRT | CSR0_INEA;
758	}
759
760
761    /* Clear any other interrupt, and set interrupt enable. */
762//	DREG = CSR0_BABL | CSR0_CERR | CSR0_MISS | CSR0_MERR |
763//		   CSR0_IDON | CSR0_INEA;
764
765	REGA(CSR0) = CSR0_INEA;
766
767	if(DREG & (CSR0_RINT | CSR0_TINT)) {
768	     DPRINTK(2, ("restarting interrupt, csr0=%#04x\n", DREG));
769	     goto still_more;
770	}
771
772	DPRINTK( 2, ( "%s: exiting interrupt, csr0=%#04x.\n",
773				  dev->name, DREG ));
774	in_interrupt = 0;
775	return IRQ_HANDLED;
776}
777
778/* get packet, toss into skbuff */
779static int lance_rx( struct net_device *dev )
780{
781	struct lance_private *lp = netdev_priv(dev);
782	int entry = lp->new_rx;
783
784	/* If we own the next entry, it's a new packet. Send it up. */
785	while( (MEM->rx_head[entry].flag & RMD1_OWN) == RMD1_OWN_HOST ) {
786		struct lance_rx_head *head = &(MEM->rx_head[entry]);
787		int status = head->flag;
788
789		if (status != (RMD1_ENP|RMD1_STP)) {  /* There was an error. */
790			/* There is a tricky error noted by John Murphy,
791			   <murf@perftech.com> to Russ Nelson: Even with
792			   full-sized buffers it's possible for a jabber packet to use two
793			   buffers, with only the last correctly noting the error. */
794			if (status & RMD1_ENP)	/* Only count a general error at the */
795				dev->stats.rx_errors++; /* end of a packet.*/
796			if (status & RMD1_FRAM) dev->stats.rx_frame_errors++;
797			if (status & RMD1_OFLO) dev->stats.rx_over_errors++;
798			if (status & RMD1_CRC) dev->stats.rx_crc_errors++;
799			if (status & RMD1_BUFF) dev->stats.rx_fifo_errors++;
800			head->flag &= (RMD1_ENP|RMD1_STP);
801		} else {
802			/* Malloc up new buffer, compatible with net-3. */
803//			short pkt_len = head->msg_length;// & 0xfff;
804			short pkt_len = (head->msg_length & 0xfff) - 4;
805			struct sk_buff *skb;
806
807			if (pkt_len < 60) {
808				printk( "%s: Runt packet!\n", dev->name );
809				dev->stats.rx_errors++;
810			}
811			else {
812				skb = netdev_alloc_skb(dev, pkt_len + 2);
813				if (skb == NULL) {
814					dev->stats.rx_dropped++;
815					head->msg_length = 0;
816					head->flag |= RMD1_OWN_CHIP;
817					lp->new_rx = (lp->new_rx+1) &
818					     RX_RING_MOD_MASK;
819				}
820
821#if 0
822				if (lance_debug >= 3) {
823					u_char *data = PKTBUF_ADDR(head);
824					printk("%s: RX pkt %d type 0x%04x"
825					       " from %pM to %pM",
826					       dev->name, lp->new_tx, ((u_short *)data)[6],
827					       &data[6], data);
828
829					printk(" data %02x %02x %02x %02x %02x %02x %02x %02x "
830					       "len %d at %08x\n",
831					       data[15], data[16], data[17], data[18],
832					       data[19], data[20], data[21], data[22],
833					       pkt_len, data);
834				}
835#endif
836				if (lance_debug >= 3) {
837					u_char *data = PKTBUF_ADDR(head);
838					printk( "%s: RX pkt %d type 0x%04x len %d\n ", dev->name, entry, ((u_short *)data)[6], pkt_len);
839				}
840
841
842				skb_reserve( skb, 2 );	/* 16 byte align */
843				skb_put( skb, pkt_len );	/* Make room */
844				skb_copy_to_linear_data(skb,
845						 PKTBUF_ADDR(head),
846						 pkt_len);
847
848				skb->protocol = eth_type_trans( skb, dev );
849				netif_rx( skb );
850				dev->stats.rx_packets++;
851				dev->stats.rx_bytes += pkt_len;
852			}
853		}
854
855//		head->buf_length = -PKT_BUF_SZ | 0xf000;
856		head->msg_length = 0;
857		head->flag = RMD1_OWN_CHIP;
858
859		entry = lp->new_rx = (lp->new_rx +1) & RX_RING_MOD_MASK;
860	}
861
862	/* From lance.c (Donald Becker): */
863	/* We should check that at least two ring entries are free.
864	   If not, we should free one and mark stats->rx_dropped++. */
865
866	return 0;
867}
868
869
870static int lance_close( struct net_device *dev )
871{
872	struct lance_private *lp = netdev_priv(dev);
873
874	netif_stop_queue(dev);
875
876	AREG = CSR0;
877
878	DPRINTK( 2, ( "%s: Shutting down ethercard, status was %2.2x.\n",
879				  dev->name, DREG ));
880
881	/* We stop the LANCE here -- it occasionally polls
882	   memory if we don't. */
883	DREG = CSR0_STOP;
884	return 0;
885}
886
887
888/* Set or clear the multicast filter for this adaptor.
889   num_addrs == -1		Promiscuous mode, receive all packets
890   num_addrs == 0		Normal mode, clear multicast list
891   num_addrs > 0		Multicast mode, receive normal and MC packets, and do
892						best-effort filtering.
893 */
894
895/* completely untested on a sun3 */
896static void set_multicast_list( struct net_device *dev )
897{
898	struct lance_private *lp = netdev_priv(dev);
899
900	if(netif_queue_stopped(dev))
901		/* Only possible if board is already started */
902		return;
903
904	/* We take the simple way out and always enable promiscuous mode. */
905	DREG = CSR0_STOP; /* Temporarily stop the lance. */
906
907	if (dev->flags & IFF_PROMISC) {
908		/* Log any net taps. */
909		DPRINTK( 3, ( "%s: Promiscuous mode enabled.\n", dev->name ));
910		REGA( CSR15 ) = 0x8000; /* Set promiscuous mode */
911	} else {
912		short multicast_table[4];
913		int num_addrs = netdev_mc_count(dev);
914		int i;
915		/* We don't use the multicast table, but rely on upper-layer
916		 * filtering. */
917		memset( multicast_table, (num_addrs == 0) ? 0 : -1,
918				sizeof(multicast_table) );
919		for( i = 0; i < 4; i++ )
920			REGA( CSR8+i ) = multicast_table[i];
921		REGA( CSR15 ) = 0; /* Unset promiscuous mode */
922	}
923
924	/*
925	 * Always set BSWP after a STOP as STOP puts it back into
926	 * little endian mode.
927	 */
928	REGA( CSR3 ) = CSR3_BSWP;
929
930	/* Resume normal operation and reset AREG to CSR0 */
931	REGA( CSR0 ) = CSR0_IDON | CSR0_INEA | CSR0_STRT;
932}
933
934
935#ifdef MODULE
936
937static struct net_device *sun3lance_dev;
938
939int __init init_module(void)
940{
941	sun3lance_dev = sun3lance_probe(-1);
942	return PTR_ERR_OR_ZERO(sun3lance_dev);
943}
 
944
945void __exit cleanup_module(void)
946{
947	unregister_netdev(sun3lance_dev);
948#ifdef CONFIG_SUN3
949	iounmap((void __iomem *)sun3lance_dev->base_addr);
950#endif
951	free_netdev(sun3lance_dev);
952}
953
954#endif /* MODULE */
955