1 /* seeq8005.c: A network driver for linux. */
2 /*
3 	Based on skeleton.c,
4 	Written 1993-94 by Donald Becker.
5 	See the skeleton.c file for further copyright information.
6 
7 	This software may be used and distributed according to the terms
8 	of the GNU General Public License, incorporated herein by reference.
9 
10 	The author may be reached as hamish@zot.apana.org.au
11 
12 	This file is a network device driver for the SEEQ 8005 chipset and
13 	the Linux operating system.
14 
15 */
16 
17 static const char version[] =
18 	"seeq8005.c:v1.00 8/07/95 Hamish Coleman (hamish@zot.apana.org.au)\n";
19 
20 /*
21   Sources:
22   	SEEQ 8005 databook
23 
24   Version history:
25   	1.00	Public release. cosmetic changes (no warnings now)
26   	0.68	Turning per- packet,interrupt debug messages off - testing for release.
27   	0.67	timing problems/bad buffer reads seem to be fixed now
28   	0.63	*!@$ protocol=eth_type_trans -- now packets flow
29   	0.56	Send working
30   	0.48	Receive working
31 */
32 
33 #include <linux/module.h>
34 #include <linux/kernel.h>
35 #include <linux/types.h>
36 #include <linux/fcntl.h>
37 #include <linux/interrupt.h>
38 #include <linux/ioport.h>
39 #include <linux/in.h>
40 #include <linux/string.h>
41 #include <linux/init.h>
42 #include <linux/delay.h>
43 #include <linux/errno.h>
44 #include <linux/netdevice.h>
45 #include <linux/etherdevice.h>
46 #include <linux/skbuff.h>
47 #include <linux/bitops.h>
48 #include <linux/jiffies.h>
49 
50 #include <asm/system.h>
51 #include <asm/io.h>
52 #include <asm/dma.h>
53 
54 #include "seeq8005.h"
55 
56 /* First, a few definitions that the brave might change. */
57 /* A zero-terminated list of I/O addresses to be probed. */
58 static unsigned int seeq8005_portlist[] __initdata =
59    { 0x300, 0x320, 0x340, 0x360, 0};
60 
61 /* use 0 for production, 1 for verification, >2 for debug */
62 #ifndef NET_DEBUG
63 #define NET_DEBUG 1
64 #endif
65 static unsigned int net_debug = NET_DEBUG;
66 
67 /* Information that need to be kept for each board. */
68 struct net_local {
69 	unsigned short receive_ptr;		/* What address in packet memory do we expect a recv_pkt_header? */
70 	long open_time;				/* Useless example local info. */
71 };
72 
73 /* The station (ethernet) address prefix, used for IDing the board. */
74 #define SA_ADDR0 0x00
75 #define SA_ADDR1 0x80
76 #define SA_ADDR2 0x4b
77 
78 /* Index to functions, as function prototypes. */
79 
80 static int seeq8005_probe1(struct net_device *dev, int ioaddr);
81 static int seeq8005_open(struct net_device *dev);
82 static void seeq8005_timeout(struct net_device *dev);
83 static netdev_tx_t seeq8005_send_packet(struct sk_buff *skb,
84 					struct net_device *dev);
85 static irqreturn_t seeq8005_interrupt(int irq, void *dev_id);
86 static void seeq8005_rx(struct net_device *dev);
87 static int seeq8005_close(struct net_device *dev);
88 static void set_multicast_list(struct net_device *dev);
89 
90 /* Example routines you must write ;->. */
91 #define tx_done(dev)	(inw(SEEQ_STATUS) & SEEQSTAT_TX_ON)
92 static void hardware_send_packet(struct net_device *dev, char *buf, int length);
93 extern void seeq8005_init(struct net_device *dev, int startp);
94 static inline void wait_for_buffer(struct net_device *dev);
95 
96 
97 /* Check for a network adaptor of this type, and return '0' iff one exists.
98    If dev->base_addr == 0, probe all likely locations.
99    If dev->base_addr == 1, always return failure.
100    */
101 
102 static int io = 0x320;
103 static int irq = 10;
104 
seeq8005_probe(int unit)105 struct net_device * __init seeq8005_probe(int unit)
106 {
107 	struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
108 	unsigned *port;
109 	int err = 0;
110 
111 	if (!dev)
112 		return ERR_PTR(-ENODEV);
113 
114 	if (unit >= 0) {
115 		sprintf(dev->name, "eth%d", unit);
116 		netdev_boot_setup_check(dev);
117 		io = dev->base_addr;
118 		irq = dev->irq;
119 	}
120 
121 	if (io > 0x1ff) {	/* Check a single specified location. */
122 		err = seeq8005_probe1(dev, io);
123 	} else if (io != 0) {	/* Don't probe at all. */
124 		err = -ENXIO;
125 	} else {
126 		for (port = seeq8005_portlist; *port; port++) {
127 			if (seeq8005_probe1(dev, *port) == 0)
128 				break;
129 		}
130 		if (!*port)
131 			err = -ENODEV;
132 	}
133 	if (err)
134 		goto out;
135 	err = register_netdev(dev);
136 	if (err)
137 		goto out1;
138 	return dev;
139 out1:
140 	release_region(dev->base_addr, SEEQ8005_IO_EXTENT);
141 out:
142 	free_netdev(dev);
143 	return ERR_PTR(err);
144 }
145 
146 static const struct net_device_ops seeq8005_netdev_ops = {
147 	.ndo_open		= seeq8005_open,
148 	.ndo_stop		= seeq8005_close,
149 	.ndo_start_xmit 	= seeq8005_send_packet,
150 	.ndo_tx_timeout		= seeq8005_timeout,
151 	.ndo_set_multicast_list = set_multicast_list,
152 	.ndo_change_mtu		= eth_change_mtu,
153 	.ndo_set_mac_address 	= eth_mac_addr,
154 	.ndo_validate_addr	= eth_validate_addr,
155 };
156 
157 /* This is the real probe routine.  Linux has a history of friendly device
158    probes on the ISA bus.  A good device probes avoids doing writes, and
159    verifies that the correct device exists and functions.  */
160 
seeq8005_probe1(struct net_device * dev,int ioaddr)161 static int __init seeq8005_probe1(struct net_device *dev, int ioaddr)
162 {
163 	static unsigned version_printed;
164 	int i,j;
165 	unsigned char SA_prom[32];
166 	int old_cfg1;
167 	int old_cfg2;
168 	int old_stat;
169 	int old_dmaar;
170 	int old_rear;
171 	int retval;
172 
173 	if (!request_region(ioaddr, SEEQ8005_IO_EXTENT, "seeq8005"))
174 		return -ENODEV;
175 
176 	if (net_debug>1)
177 		printk("seeq8005: probing at 0x%x\n",ioaddr);
178 
179 	old_stat = inw(SEEQ_STATUS);					/* read status register */
180 	if (old_stat == 0xffff) {
181 		retval = -ENODEV;
182 		goto out;						/* assume that 0xffff == no device */
183 	}
184 	if ( (old_stat & 0x1800) != 0x1800 ) {				/* assume that unused bits are 1, as my manual says */
185 		if (net_debug>1) {
186 			printk("seeq8005: reserved stat bits != 0x1800\n");
187 			printk("          == 0x%04x\n",old_stat);
188 		}
189 	 	retval = -ENODEV;
190 		goto out;
191 	}
192 
193 	old_rear = inw(SEEQ_REA);
194 	if (old_rear == 0xffff) {
195 		outw(0,SEEQ_REA);
196 		if (inw(SEEQ_REA) == 0xffff) {				/* assume that 0xffff == no device */
197 			retval = -ENODEV;
198 			goto out;
199 		}
200 	} else if ((old_rear & 0xff00) != 0xff00) {			/* assume that unused bits are 1 */
201 		if (net_debug>1) {
202 			printk("seeq8005: unused rear bits != 0xff00\n");
203 			printk("          == 0x%04x\n",old_rear);
204 		}
205 		retval = -ENODEV;
206 		goto out;
207 	}
208 
209 	old_cfg2 = inw(SEEQ_CFG2);					/* read CFG2 register */
210 	old_cfg1 = inw(SEEQ_CFG1);
211 	old_dmaar = inw(SEEQ_DMAAR);
212 
213 	if (net_debug>4) {
214 		printk("seeq8005: stat = 0x%04x\n",old_stat);
215 		printk("seeq8005: cfg1 = 0x%04x\n",old_cfg1);
216 		printk("seeq8005: cfg2 = 0x%04x\n",old_cfg2);
217 		printk("seeq8005: raer = 0x%04x\n",old_rear);
218 		printk("seeq8005: dmaar= 0x%04x\n",old_dmaar);
219 	}
220 
221 	outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);	/* setup for reading PROM */
222 	outw( 0, SEEQ_DMAAR);						/* set starting PROM address */
223 	outw( SEEQCFG1_BUFFER_PROM, SEEQ_CFG1);				/* set buffer to look at PROM */
224 
225 
226 	j=0;
227 	for(i=0; i <32; i++) {
228 		j+= SA_prom[i] = inw(SEEQ_BUFFER) & 0xff;
229 	}
230 
231 #if 0
232 	/* untested because I only have the one card */
233 	if ( (j&0xff) != 0 ) {						/* checksum appears to be 8bit = 0 */
234 		if (net_debug>1) {					/* check this before deciding that we have a card */
235 			printk("seeq8005: prom sum error\n");
236 		}
237 		outw( old_stat, SEEQ_STATUS);
238 		outw( old_dmaar, SEEQ_DMAAR);
239 		outw( old_cfg1, SEEQ_CFG1);
240 		retval = -ENODEV;
241 		goto out;
242 	}
243 #endif
244 
245 	outw( SEEQCFG2_RESET, SEEQ_CFG2);				/* reset the card */
246 	udelay(5);
247 	outw( SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
248 
249 	if (net_debug) {
250 		printk("seeq8005: prom sum = 0x%08x\n",j);
251 		for(j=0; j<32; j+=16) {
252 			printk("seeq8005: prom %02x: ",j);
253 			for(i=0;i<16;i++) {
254 				printk("%02x ",SA_prom[j|i]);
255 			}
256 			printk(" ");
257 			for(i=0;i<16;i++) {
258 				if ((SA_prom[j|i]>31)&&(SA_prom[j|i]<127)) {
259 					printk("%c", SA_prom[j|i]);
260 				} else {
261 					printk(" ");
262 				}
263 			}
264 			printk("\n");
265 		}
266 	}
267 
268 #if 0
269 	/*
270 	 * testing the packet buffer memory doesn't work yet
271 	 * but all other buffer accesses do
272 	 *			- fixing is not a priority
273 	 */
274 	if (net_debug>1) {					/* test packet buffer memory */
275 		printk("seeq8005: testing packet buffer ... ");
276 		outw( SEEQCFG1_BUFFER_BUFFER, SEEQ_CFG1);
277 		outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
278 		outw( 0 , SEEQ_DMAAR);
279 		for(i=0;i<32768;i++) {
280 			outw(0x5a5a, SEEQ_BUFFER);
281 		}
282 		j=jiffies+HZ;
283 		while ( ((inw(SEEQ_STATUS) & SEEQSTAT_FIFO_EMPTY) != SEEQSTAT_FIFO_EMPTY) && time_before(jiffies, j) )
284 			mb();
285 		outw( 0 , SEEQ_DMAAR);
286 		while ( ((inw(SEEQ_STATUS) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && time_before(jiffies, j+HZ))
287 			mb();
288 		if ( (inw(SEEQ_STATUS) & SEEQSTAT_WINDOW_INT) == SEEQSTAT_WINDOW_INT)
289 			outw( SEEQCMD_WINDOW_INT_ACK | (inw(SEEQ_STATUS)& SEEQCMD_INT_MASK), SEEQ_CMD);
290 		outw( SEEQCMD_FIFO_READ | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
291 		j=0;
292 		for(i=0;i<32768;i++) {
293 			if (inw(SEEQ_BUFFER) != 0x5a5a)
294 				j++;
295 		}
296 		if (j) {
297 			printk("%i\n",j);
298 		} else {
299 			printk("ok.\n");
300 		}
301 	}
302 #endif
303 
304 	if (net_debug  &&  version_printed++ == 0)
305 		printk(version);
306 
307 	printk("%s: %s found at %#3x, ", dev->name, "seeq8005", ioaddr);
308 
309 	/* Fill in the 'dev' fields. */
310 	dev->base_addr = ioaddr;
311 	dev->irq = irq;
312 
313 	/* Retrieve and print the ethernet address. */
314 	for (i = 0; i < 6; i++)
315 		dev->dev_addr[i] = SA_prom[i+6];
316 	printk("%pM", dev->dev_addr);
317 
318 	if (dev->irq == 0xff)
319 		;			/* Do nothing: a user-level program will set it. */
320 	else if (dev->irq < 2) {	/* "Auto-IRQ" */
321 		unsigned long cookie = probe_irq_on();
322 
323 		outw( SEEQCMD_RX_INT_EN | SEEQCMD_SET_RX_ON | SEEQCMD_SET_RX_OFF, SEEQ_CMD );
324 
325 		dev->irq = probe_irq_off(cookie);
326 
327 		if (net_debug >= 2)
328 			printk(" autoirq is %d\n", dev->irq);
329 	} else if (dev->irq == 2)
330 	  /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
331 	   * or don't know which one to set.
332 	   */
333 	  dev->irq = 9;
334 
335 #if 0
336 	{
337 		 int irqval = request_irq(dev->irq, seeq8005_interrupt, 0, "seeq8005", dev);
338 		 if (irqval) {
339 			 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev->name,
340 					 dev->irq, irqval);
341 			 retval = -EAGAIN;
342 			 goto out;
343 		 }
344 	}
345 #endif
346 	dev->netdev_ops = &seeq8005_netdev_ops;
347 	dev->watchdog_timeo	= HZ/20;
348 	dev->flags &= ~IFF_MULTICAST;
349 
350 	return 0;
351 out:
352 	release_region(ioaddr, SEEQ8005_IO_EXTENT);
353 	return retval;
354 }
355 
356 
357 /* Open/initialize the board.  This is called (in the current kernel)
358    sometime after booting when the 'ifconfig' program is run.
359 
360    This routine should set everything up anew at each open, even
361    registers that "should" only need to be set once at boot, so that
362    there is non-reboot way to recover if something goes wrong.
363    */
seeq8005_open(struct net_device * dev)364 static int seeq8005_open(struct net_device *dev)
365 {
366 	struct net_local *lp = netdev_priv(dev);
367 
368 	{
369 		 int irqval = request_irq(dev->irq, seeq8005_interrupt, 0, "seeq8005", dev);
370 		 if (irqval) {
371 			 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev->name,
372 					 dev->irq, irqval);
373 			 return -EAGAIN;
374 		 }
375 	}
376 
377 	/* Reset the hardware here.  Don't forget to set the station address. */
378 	seeq8005_init(dev, 1);
379 
380 	lp->open_time = jiffies;
381 
382 	netif_start_queue(dev);
383 	return 0;
384 }
385 
seeq8005_timeout(struct net_device * dev)386 static void seeq8005_timeout(struct net_device *dev)
387 {
388 	int ioaddr = dev->base_addr;
389 	printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name,
390 		   tx_done(dev) ? "IRQ conflict" : "network cable problem");
391 	/* Try to restart the adaptor. */
392 	seeq8005_init(dev, 1);
393 	dev->trans_start = jiffies; /* prevent tx timeout */
394 	netif_wake_queue(dev);
395 }
396 
seeq8005_send_packet(struct sk_buff * skb,struct net_device * dev)397 static netdev_tx_t seeq8005_send_packet(struct sk_buff *skb,
398 					struct net_device *dev)
399 {
400 	short length = skb->len;
401 	unsigned char *buf;
402 
403 	if (length < ETH_ZLEN) {
404 		if (skb_padto(skb, ETH_ZLEN))
405 			return NETDEV_TX_OK;
406 		length = ETH_ZLEN;
407 	}
408 	buf = skb->data;
409 
410 	/* Block a timer-based transmit from overlapping */
411 	netif_stop_queue(dev);
412 
413 	hardware_send_packet(dev, buf, length);
414 	dev->stats.tx_bytes += length;
415 	dev_kfree_skb (skb);
416 	/* You might need to clean up and record Tx statistics here. */
417 
418 	return NETDEV_TX_OK;
419 }
420 
421 /*
422  * wait_for_buffer
423  *
424  * This routine waits for the SEEQ chip to assert that the FIFO is ready
425  * by checking for a window interrupt, and then clearing it. This has to
426  * occur in the interrupt handler!
427  */
wait_for_buffer(struct net_device * dev)428 inline void wait_for_buffer(struct net_device * dev)
429 {
430 	int ioaddr = dev->base_addr;
431 	unsigned long tmp;
432 	int status;
433 
434 	tmp = jiffies + HZ;
435 	while ( ( ((status=inw(SEEQ_STATUS)) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && time_before(jiffies, tmp))
436 		cpu_relax();
437 
438 	if ( (status & SEEQSTAT_WINDOW_INT) == SEEQSTAT_WINDOW_INT)
439 		outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
440 }
441 
442 /* The typical workload of the driver:
443    Handle the network interface interrupts. */
seeq8005_interrupt(int irq,void * dev_id)444 static irqreturn_t seeq8005_interrupt(int irq, void *dev_id)
445 {
446 	struct net_device *dev = dev_id;
447 	struct net_local *lp;
448 	int ioaddr, status, boguscount = 0;
449 	int handled = 0;
450 
451 	ioaddr = dev->base_addr;
452 	lp = netdev_priv(dev);
453 
454 	status = inw(SEEQ_STATUS);
455 	do {
456 		if (net_debug >2) {
457 			printk("%s: int, status=0x%04x\n",dev->name,status);
458 		}
459 
460 		if (status & SEEQSTAT_WINDOW_INT) {
461 			handled = 1;
462 			outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
463 			if (net_debug) {
464 				printk("%s: window int!\n",dev->name);
465 			}
466 		}
467 		if (status & SEEQSTAT_TX_INT) {
468 			handled = 1;
469 			outw( SEEQCMD_TX_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
470 			dev->stats.tx_packets++;
471 			netif_wake_queue(dev);	/* Inform upper layers. */
472 		}
473 		if (status & SEEQSTAT_RX_INT) {
474 			handled = 1;
475 			/* Got a packet(s). */
476 			seeq8005_rx(dev);
477 		}
478 		status = inw(SEEQ_STATUS);
479 	} while ( (++boguscount < 10) && (status & SEEQSTAT_ANY_INT)) ;
480 
481 	if(net_debug>2) {
482 		printk("%s: eoi\n",dev->name);
483 	}
484 	return IRQ_RETVAL(handled);
485 }
486 
487 /* We have a good packet(s), get it/them out of the buffers. */
seeq8005_rx(struct net_device * dev)488 static void seeq8005_rx(struct net_device *dev)
489 {
490 	struct net_local *lp = netdev_priv(dev);
491 	int boguscount = 10;
492 	int pkt_hdr;
493 	int ioaddr = dev->base_addr;
494 
495 	do {
496 		int next_packet;
497 		int pkt_len;
498 		int i;
499 		int status;
500 
501 		status = inw(SEEQ_STATUS);
502 	  	outw( lp->receive_ptr, SEEQ_DMAAR);
503 		outw(SEEQCMD_FIFO_READ | SEEQCMD_RX_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
504 	  	wait_for_buffer(dev);
505 	  	next_packet = ntohs(inw(SEEQ_BUFFER));
506 	  	pkt_hdr = inw(SEEQ_BUFFER);
507 
508 		if (net_debug>2) {
509 			printk("%s: 0x%04x recv next=0x%04x, hdr=0x%04x\n",dev->name,lp->receive_ptr,next_packet,pkt_hdr);
510 		}
511 
512 		if ((next_packet == 0) || ((pkt_hdr & SEEQPKTH_CHAIN)==0)) {	/* Read all the frames? */
513 			return;							/* Done for now */
514 		}
515 
516 		if ((pkt_hdr & SEEQPKTS_DONE)==0)
517 			break;
518 
519 		if (next_packet < lp->receive_ptr) {
520 			pkt_len = (next_packet + 0x10000 - ((DEFAULT_TEA+1)<<8)) - lp->receive_ptr - 4;
521 		} else {
522 			pkt_len = next_packet - lp->receive_ptr - 4;
523 		}
524 
525 		if (next_packet < ((DEFAULT_TEA+1)<<8)) {			/* is the next_packet address sane? */
526 			printk("%s: recv packet ring corrupt, resetting board\n",dev->name);
527 			seeq8005_init(dev,1);
528 			return;
529 		}
530 
531 		lp->receive_ptr = next_packet;
532 
533 		if (net_debug>2) {
534 			printk("%s: recv len=0x%04x\n",dev->name,pkt_len);
535 		}
536 
537 		if (pkt_hdr & SEEQPKTS_ANY_ERROR) {				/* There was an error. */
538 			dev->stats.rx_errors++;
539 			if (pkt_hdr & SEEQPKTS_SHORT) dev->stats.rx_frame_errors++;
540 			if (pkt_hdr & SEEQPKTS_DRIB) dev->stats.rx_frame_errors++;
541 			if (pkt_hdr & SEEQPKTS_OVERSIZE) dev->stats.rx_over_errors++;
542 			if (pkt_hdr & SEEQPKTS_CRC_ERR) dev->stats.rx_crc_errors++;
543 			/* skip over this packet */
544 			outw( SEEQCMD_FIFO_WRITE | SEEQCMD_DMA_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
545 			outw( (lp->receive_ptr & 0xff00)>>8, SEEQ_REA);
546 		} else {
547 			/* Malloc up new buffer. */
548 			struct sk_buff *skb;
549 			unsigned char *buf;
550 
551 			skb = dev_alloc_skb(pkt_len);
552 			if (skb == NULL) {
553 				printk("%s: Memory squeeze, dropping packet.\n", dev->name);
554 				dev->stats.rx_dropped++;
555 				break;
556 			}
557 			skb_reserve(skb, 2);	/* align data on 16 byte */
558 			buf = skb_put(skb,pkt_len);
559 
560 			insw(SEEQ_BUFFER, buf, (pkt_len + 1) >> 1);
561 
562 			if (net_debug>2) {
563 				char * p = buf;
564 				printk("%s: recv ",dev->name);
565 				for(i=0;i<14;i++) {
566 					printk("%02x ",*(p++)&0xff);
567 				}
568 				printk("\n");
569 			}
570 
571 			skb->protocol=eth_type_trans(skb,dev);
572 			netif_rx(skb);
573 			dev->stats.rx_packets++;
574 			dev->stats.rx_bytes += pkt_len;
575 		}
576 	} while ((--boguscount) && (pkt_hdr & SEEQPKTH_CHAIN));
577 
578 	/* If any worth-while packets have been received, netif_rx()
579 	   has done a mark_bh(NET_BH) for us and will work on them
580 	   when we get to the bottom-half routine. */
581 }
582 
583 /* The inverse routine to net_open(). */
seeq8005_close(struct net_device * dev)584 static int seeq8005_close(struct net_device *dev)
585 {
586 	struct net_local *lp = netdev_priv(dev);
587 	int ioaddr = dev->base_addr;
588 
589 	lp->open_time = 0;
590 
591 	netif_stop_queue(dev);
592 
593 	/* Flush the Tx and disable Rx here. */
594 	outw( SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
595 
596 	free_irq(dev->irq, dev);
597 
598 	/* Update the statistics here. */
599 
600 	return 0;
601 
602 }
603 
604 /* Set or clear the multicast filter for this adaptor.
605    num_addrs == -1	Promiscuous mode, receive all packets
606    num_addrs == 0	Normal mode, clear multicast list
607    num_addrs > 0	Multicast mode, receive normal and MC packets, and do
608 			best-effort filtering.
609  */
set_multicast_list(struct net_device * dev)610 static void set_multicast_list(struct net_device *dev)
611 {
612 /*
613  * I _could_ do up to 6 addresses here, but won't (yet?)
614  */
615 
616 #if 0
617 	int ioaddr = dev->base_addr;
618 /*
619  * hmm, not even sure if my matching works _anyway_ - seem to be receiving
620  * _everything_ . . .
621  */
622 
623 	if (num_addrs) {			/* Enable promiscuous mode */
624 		outw( (inw(SEEQ_CFG1) & ~SEEQCFG1_MATCH_MASK)| SEEQCFG1_MATCH_ALL,  SEEQ_CFG1);
625 		dev->flags|=IFF_PROMISC;
626 	} else {				/* Disable promiscuous mode, use normal mode */
627 		outw( (inw(SEEQ_CFG1) & ~SEEQCFG1_MATCH_MASK)| SEEQCFG1_MATCH_BROAD, SEEQ_CFG1);
628 	}
629 #endif
630 }
631 
seeq8005_init(struct net_device * dev,int startp)632 void seeq8005_init(struct net_device *dev, int startp)
633 {
634 	struct net_local *lp = netdev_priv(dev);
635 	int ioaddr = dev->base_addr;
636 	int i;
637 
638 	outw(SEEQCFG2_RESET, SEEQ_CFG2);	/* reset device */
639 	udelay(5);
640 
641 	outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
642 	outw( 0, SEEQ_DMAAR);			/* load start address into both low and high byte */
643 /*	wait_for_buffer(dev); */		/* I think that you only need a wait for memory buffer */
644 	outw( SEEQCFG1_BUFFER_MAC0, SEEQ_CFG1);
645 
646 	for(i=0;i<6;i++) {			/* set Station address */
647 		outb(dev->dev_addr[i], SEEQ_BUFFER);
648 		udelay(2);
649 	}
650 
651 	outw( SEEQCFG1_BUFFER_TEA, SEEQ_CFG1);	/* set xmit end area pointer to 16K */
652 	outb( DEFAULT_TEA, SEEQ_BUFFER);	/* this gives us 16K of send buffer and 48K of recv buffer */
653 
654 	lp->receive_ptr = (DEFAULT_TEA+1)<<8;	/* so we can find our packet_header */
655 	outw( lp->receive_ptr, SEEQ_RPR);	/* Receive Pointer Register is set to recv buffer memory */
656 
657 	outw( 0x00ff, SEEQ_REA);		/* Receive Area End */
658 
659 	if (net_debug>4) {
660 		printk("%s: SA0 = ",dev->name);
661 
662 		outw( SEEQCMD_FIFO_READ | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
663 		outw( 0, SEEQ_DMAAR);
664 		outw( SEEQCFG1_BUFFER_MAC0, SEEQ_CFG1);
665 
666 		for(i=0;i<6;i++) {
667 			printk("%02x ",inb(SEEQ_BUFFER));
668 		}
669 		printk("\n");
670 	}
671 
672 	outw( SEEQCFG1_MAC0_EN | SEEQCFG1_MATCH_BROAD | SEEQCFG1_BUFFER_BUFFER, SEEQ_CFG1);
673 	outw( SEEQCFG2_AUTO_REA | SEEQCFG2_CTRLO, SEEQ_CFG2);
674 	outw( SEEQCMD_SET_RX_ON | SEEQCMD_TX_INT_EN | SEEQCMD_RX_INT_EN, SEEQ_CMD);
675 
676 	if (net_debug>4) {
677 		int old_cfg1;
678 		old_cfg1 = inw(SEEQ_CFG1);
679 		printk("%s: stat = 0x%04x\n",dev->name,inw(SEEQ_STATUS));
680 		printk("%s: cfg1 = 0x%04x\n",dev->name,old_cfg1);
681 		printk("%s: cfg2 = 0x%04x\n",dev->name,inw(SEEQ_CFG2));
682 		printk("%s: raer = 0x%04x\n",dev->name,inw(SEEQ_REA));
683 		printk("%s: dmaar= 0x%04x\n",dev->name,inw(SEEQ_DMAAR));
684 
685 	}
686 }
687 
688 
hardware_send_packet(struct net_device * dev,char * buf,int length)689 static void hardware_send_packet(struct net_device * dev, char *buf, int length)
690 {
691 	int ioaddr = dev->base_addr;
692 	int status = inw(SEEQ_STATUS);
693 	int transmit_ptr = 0;
694 	unsigned long tmp;
695 
696 	if (net_debug>4) {
697 		printk("%s: send 0x%04x\n",dev->name,length);
698 	}
699 
700 	/* Set FIFO to writemode and set packet-buffer address */
701 	outw( SEEQCMD_FIFO_WRITE | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
702 	outw( transmit_ptr, SEEQ_DMAAR);
703 
704 	/* output SEEQ Packet header barfage */
705 	outw( htons(length + 4), SEEQ_BUFFER);
706 	outw( SEEQPKTH_XMIT | SEEQPKTH_DATA_FOLLOWS | SEEQPKTH_XMIT_INT_EN, SEEQ_BUFFER );
707 
708 	/* blat the buffer */
709 	outsw( SEEQ_BUFFER, buf, (length +1) >> 1);
710 	/* paranoia !! */
711 	outw( 0, SEEQ_BUFFER);
712 	outw( 0, SEEQ_BUFFER);
713 
714 	/* set address of start of transmit chain */
715 	outw( transmit_ptr, SEEQ_TPR);
716 
717 	/* drain FIFO */
718 	tmp = jiffies;
719 	while ( (((status=inw(SEEQ_STATUS)) & SEEQSTAT_FIFO_EMPTY) == 0) && time_before(jiffies, tmp + HZ))
720 		mb();
721 
722 	/* doit ! */
723 	outw( SEEQCMD_WINDOW_INT_ACK | SEEQCMD_SET_TX_ON | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
724 
725 }
726 
727 
728 #ifdef MODULE
729 
730 static struct net_device *dev_seeq;
731 MODULE_LICENSE("GPL");
732 module_param(io, int, 0);
733 module_param(irq, int, 0);
734 MODULE_PARM_DESC(io, "SEEQ 8005 I/O base address");
735 MODULE_PARM_DESC(irq, "SEEQ 8005 IRQ number");
736 
init_module(void)737 int __init init_module(void)
738 {
739 	dev_seeq = seeq8005_probe(-1);
740 	if (IS_ERR(dev_seeq))
741 		return PTR_ERR(dev_seeq);
742 	return 0;
743 }
744 
cleanup_module(void)745 void __exit cleanup_module(void)
746 {
747 	unregister_netdev(dev_seeq);
748 	release_region(dev_seeq->base_addr, SEEQ8005_IO_EXTENT);
749 	free_netdev(dev_seeq);
750 }
751 
752 #endif /* MODULE */
753