Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.17.
  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
 17static 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. */
 58static 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
 65static unsigned int net_debug = NET_DEBUG;
 66
 67/* Information that need to be kept for each board. */
 68struct 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
 80static int seeq8005_probe1(struct net_device *dev, int ioaddr);
 81static int seeq8005_open(struct net_device *dev);
 82static void seeq8005_timeout(struct net_device *dev);
 83static netdev_tx_t seeq8005_send_packet(struct sk_buff *skb,
 84					struct net_device *dev);
 85static irqreturn_t seeq8005_interrupt(int irq, void *dev_id);
 86static void seeq8005_rx(struct net_device *dev);
 87static int seeq8005_close(struct net_device *dev);
 88static 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)
 92static void hardware_send_packet(struct net_device *dev, char *buf, int length);
 93extern void seeq8005_init(struct net_device *dev, int startp);
 94static 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
102static int io = 0x320;
103static int irq = 10;
104
105struct 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;
139out1:
140	release_region(dev->base_addr, SEEQ8005_IO_EXTENT);
141out:
142	free_netdev(dev);
143	return ERR_PTR(err);
144}
145
146static 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
161static 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;
351out:
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   */
364static 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
386static 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
397static 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 */
428inline 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. */
444static 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. */
488static 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(). */
584static 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 */
610static 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
632void 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
689static 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
730static struct net_device *dev_seeq;
731MODULE_LICENSE("GPL");
732module_param(io, int, 0);
733module_param(irq, int, 0);
734MODULE_PARM_DESC(io, "SEEQ 8005 I/O base address");
735MODULE_PARM_DESC(irq, "SEEQ 8005 IRQ number");
736
737int __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
745void __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 */