More meth updates.
[linux-2.6/linux-mips.git] / drivers / net / seeq8005.c
blob08cd543eda47c9e7b53e634c8720fc8eb0c7b42a
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.
7 This software may be used and distributed according to the terms
8 of the GNU General Public License, incorporated herein by reference.
10 The author may be reached as hamish@zot.apana.org.au
12 This file is a network device driver for the SEEQ 8005 chipset and
13 the Linux operating system.
17 static const char version[] =
18 "seeq8005.c:v1.00 8/07/95 Hamish Coleman (hamish@zot.apana.org.au)\n";
21 Sources:
22 SEEQ 8005 databook
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
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/slab.h>
41 #include <linux/string.h>
42 #include <linux/init.h>
43 #include <linux/delay.h>
44 #include <linux/errno.h>
45 #include <linux/netdevice.h>
46 #include <linux/etherdevice.h>
47 #include <linux/skbuff.h>
49 #include <asm/system.h>
50 #include <asm/bitops.h>
51 #include <asm/io.h>
52 #include <asm/dma.h>
54 #include "seeq8005.h"
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};
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;
67 /* Information that need to be kept for each board. */
68 struct net_local {
69 struct net_device_stats stats;
70 unsigned short receive_ptr; /* What address in packet memory do we expect a recv_pkt_header? */
71 long open_time; /* Useless example local info. */
74 /* The station (ethernet) address prefix, used for IDing the board. */
75 #define SA_ADDR0 0x00
76 #define SA_ADDR1 0x80
77 #define SA_ADDR2 0x4b
79 /* Index to functions, as function prototypes. */
81 extern int seeq8005_probe(struct net_device *dev);
83 static int seeq8005_probe1(struct net_device *dev, int ioaddr);
84 static int seeq8005_open(struct net_device *dev);
85 static void seeq8005_timeout(struct net_device *dev);
86 static int seeq8005_send_packet(struct sk_buff *skb, struct net_device *dev);
87 static irqreturn_t seeq8005_interrupt(int irq, void *dev_id, struct pt_regs *regs);
88 static void seeq8005_rx(struct net_device *dev);
89 static int seeq8005_close(struct net_device *dev);
90 static struct net_device_stats *seeq8005_get_stats(struct net_device *dev);
91 static void set_multicast_list(struct net_device *dev);
93 /* Example routines you must write ;->. */
94 #define tx_done(dev) (inw(SEEQ_STATUS) & SEEQSTAT_TX_ON)
95 static void hardware_send_packet(struct net_device *dev, char *buf, int length);
96 extern void seeq8005_init(struct net_device *dev, int startp);
97 static inline void wait_for_buffer(struct net_device *dev);
100 /* Check for a network adaptor of this type, and return '0' iff one exists.
101 If dev->base_addr == 0, probe all likely locations.
102 If dev->base_addr == 1, always return failure.
105 int __init
106 seeq8005_probe(struct net_device *dev)
108 int i;
109 int base_addr = dev ? dev->base_addr : 0;
111 if (base_addr > 0x1ff) /* Check a single specified location. */
112 return seeq8005_probe1(dev, base_addr);
113 else if (base_addr != 0) /* Don't probe at all. */
114 return -ENXIO;
116 for (i = 0; seeq8005_portlist[i]; i++)
117 if (seeq8005_probe1(dev, seeq8005_portlist[i]) == 0)
118 return 0;
120 return -ENODEV;
123 /* This is the real probe routine. Linux has a history of friendly device
124 probes on the ISA bus. A good device probes avoids doing writes, and
125 verifies that the correct device exists and functions. */
127 static int __init seeq8005_probe1(struct net_device *dev, int ioaddr)
129 static unsigned version_printed;
130 int i,j;
131 unsigned char SA_prom[32];
132 int old_cfg1;
133 int old_cfg2;
134 int old_stat;
135 int old_dmaar;
136 int old_rear;
137 int retval;
139 if (!request_region(ioaddr, SEEQ8005_IO_EXTENT, "seeq8005"))
140 return -ENODEV;
142 if (net_debug>1)
143 printk("seeq8005: probing at 0x%x\n",ioaddr);
145 old_stat = inw(SEEQ_STATUS); /* read status register */
146 if (old_stat == 0xffff) {
147 retval = -ENODEV;
148 goto out; /* assume that 0xffff == no device */
150 if ( (old_stat & 0x1800) != 0x1800 ) { /* assume that unused bits are 1, as my manual says */
151 if (net_debug>1) {
152 printk("seeq8005: reserved stat bits != 0x1800\n");
153 printk(" == 0x%04x\n",old_stat);
155 retval = -ENODEV;
156 goto out;
159 old_rear = inw(SEEQ_REA);
160 if (old_rear == 0xffff) {
161 outw(0,SEEQ_REA);
162 if (inw(SEEQ_REA) == 0xffff) { /* assume that 0xffff == no device */
163 retval = -ENODEV;
164 goto out;
166 } else if ((old_rear & 0xff00) != 0xff00) { /* assume that unused bits are 1 */
167 if (net_debug>1) {
168 printk("seeq8005: unused rear bits != 0xff00\n");
169 printk(" == 0x%04x\n",old_rear);
171 retval = -ENODEV;
172 goto out;
175 old_cfg2 = inw(SEEQ_CFG2); /* read CFG2 register */
176 old_cfg1 = inw(SEEQ_CFG1);
177 old_dmaar = inw(SEEQ_DMAAR);
179 if (net_debug>4) {
180 printk("seeq8005: stat = 0x%04x\n",old_stat);
181 printk("seeq8005: cfg1 = 0x%04x\n",old_cfg1);
182 printk("seeq8005: cfg2 = 0x%04x\n",old_cfg2);
183 printk("seeq8005: raer = 0x%04x\n",old_rear);
184 printk("seeq8005: dmaar= 0x%04x\n",old_dmaar);
187 outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD); /* setup for reading PROM */
188 outw( 0, SEEQ_DMAAR); /* set starting PROM address */
189 outw( SEEQCFG1_BUFFER_PROM, SEEQ_CFG1); /* set buffer to look at PROM */
192 j=0;
193 for(i=0; i <32; i++) {
194 j+= SA_prom[i] = inw(SEEQ_BUFFER) & 0xff;
197 #if 0
198 /* untested because I only have the one card */
199 if ( (j&0xff) != 0 ) { /* checksum appears to be 8bit = 0 */
200 if (net_debug>1) { /* check this before deciding that we have a card */
201 printk("seeq8005: prom sum error\n");
203 outw( old_stat, SEEQ_STATUS);
204 outw( old_dmaar, SEEQ_DMAAR);
205 outw( old_cfg1, SEEQ_CFG1);
206 retval = -ENODEV;
207 goto out;
209 #endif
211 outw( SEEQCFG2_RESET, SEEQ_CFG2); /* reset the card */
212 udelay(5);
213 outw( SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
215 if (net_debug) {
216 printk("seeq8005: prom sum = 0x%08x\n",j);
217 for(j=0; j<32; j+=16) {
218 printk("seeq8005: prom %02x: ",j);
219 for(i=0;i<16;i++) {
220 printk("%02x ",SA_prom[j|i]);
222 printk(" ");
223 for(i=0;i<16;i++) {
224 if ((SA_prom[j|i]>31)&&(SA_prom[j|i]<127)) {
225 printk("%c", SA_prom[j|i]);
226 } else {
227 printk(" ");
230 printk("\n");
234 #if 0
236 * testing the packet buffer memory doesn't work yet
237 * but all other buffer accesses do
238 * - fixing is not a priority
240 if (net_debug>1) { /* test packet buffer memory */
241 printk("seeq8005: testing packet buffer ... ");
242 outw( SEEQCFG1_BUFFER_BUFFER, SEEQ_CFG1);
243 outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
244 outw( 0 , SEEQ_DMAAR);
245 for(i=0;i<32768;i++) {
246 outw(0x5a5a, SEEQ_BUFFER);
248 j=jiffies+HZ;
249 while ( ((inw(SEEQ_STATUS) & SEEQSTAT_FIFO_EMPTY) != SEEQSTAT_FIFO_EMPTY) && time_before(jiffies, j) )
250 mb();
251 outw( 0 , SEEQ_DMAAR);
252 while ( ((inw(SEEQ_STATUS) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && time_before(jiffies, j+HZ))
253 mb();
254 if ( (inw(SEEQ_STATUS) & SEEQSTAT_WINDOW_INT) == SEEQSTAT_WINDOW_INT)
255 outw( SEEQCMD_WINDOW_INT_ACK | (inw(SEEQ_STATUS)& SEEQCMD_INT_MASK), SEEQ_CMD);
256 outw( SEEQCMD_FIFO_READ | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
257 j=0;
258 for(i=0;i<32768;i++) {
259 if (inw(SEEQ_BUFFER) != 0x5a5a)
260 j++;
262 if (j) {
263 printk("%i\n",j);
264 } else {
265 printk("ok.\n");
268 #endif
270 if (net_debug && version_printed++ == 0)
271 printk(version);
273 printk("%s: %s found at %#3x, ", dev->name, "seeq8005", ioaddr);
275 /* Fill in the 'dev' fields. */
276 dev->base_addr = ioaddr;
278 /* Retrieve and print the ethernet address. */
279 for (i = 0; i < 6; i++)
280 printk(" %2.2x", dev->dev_addr[i] = SA_prom[i+6]);
282 if (dev->irq == 0xff)
283 ; /* Do nothing: a user-level program will set it. */
284 else if (dev->irq < 2) { /* "Auto-IRQ" */
285 unsigned long cookie = probe_irq_on();
287 outw( SEEQCMD_RX_INT_EN | SEEQCMD_SET_RX_ON | SEEQCMD_SET_RX_OFF, SEEQ_CMD );
289 dev->irq = probe_irq_off(cookie);
291 if (net_debug >= 2)
292 printk(" autoirq is %d\n", dev->irq);
293 } else if (dev->irq == 2)
294 /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
295 * or don't know which one to set.
297 dev->irq = 9;
299 #if 0
301 int irqval = request_irq(dev->irq, &seeq8005_interrupt, 0, "seeq8005", dev);
302 if (irqval) {
303 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev->name,
304 dev->irq, irqval);
305 retval = -EAGAIN;
306 goto out;
309 #endif
311 /* Initialize the device structure. */
312 dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
313 if (dev->priv == NULL)
314 return -ENOMEM;
315 memset(dev->priv, 0, sizeof(struct net_local));
317 dev->open = seeq8005_open;
318 dev->stop = seeq8005_close;
319 dev->hard_start_xmit = seeq8005_send_packet;
320 dev->tx_timeout = seeq8005_timeout;
321 dev->watchdog_timeo = HZ/20;
322 dev->get_stats = seeq8005_get_stats;
323 dev->set_multicast_list = set_multicast_list;
325 /* Fill in the fields of the device structure with ethernet values. */
326 ether_setup(dev);
328 dev->flags &= ~IFF_MULTICAST;
330 return 0;
331 out:
332 release_region(ioaddr, SEEQ8005_IO_EXTENT);
333 return retval;
337 /* Open/initialize the board. This is called (in the current kernel)
338 sometime after booting when the 'ifconfig' program is run.
340 This routine should set everything up anew at each open, even
341 registers that "should" only need to be set once at boot, so that
342 there is non-reboot way to recover if something goes wrong.
344 static int seeq8005_open(struct net_device *dev)
346 struct net_local *lp = (struct net_local *)dev->priv;
349 int irqval = request_irq(dev->irq, &seeq8005_interrupt, 0, "seeq8005", dev);
350 if (irqval) {
351 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev->name,
352 dev->irq, irqval);
353 return -EAGAIN;
357 /* Reset the hardware here. Don't forget to set the station address. */
358 seeq8005_init(dev, 1);
360 lp->open_time = jiffies;
362 netif_start_queue(dev);
363 return 0;
366 static void seeq8005_timeout(struct net_device *dev)
368 int ioaddr = dev->base_addr;
369 printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name,
370 tx_done(dev) ? "IRQ conflict" : "network cable problem");
371 /* Try to restart the adaptor. */
372 seeq8005_init(dev, 1);
373 dev->trans_start = jiffies;
374 netif_wake_queue(dev);
377 static int seeq8005_send_packet(struct sk_buff *skb, struct net_device *dev)
379 struct net_local *lp = (struct net_local *)dev->priv;
380 short length = skb->len;
381 unsigned char *buf = skb->data;
383 if (length < ETH_ZLEN) {
384 skb = skb_padto(skb, ETH_ZLEN);
385 if (skb == NULL)
386 return 0;
387 length = ETH_ZLEN;
389 /* Block a timer-based transmit from overlapping */
390 netif_stop_queue(dev);
392 hardware_send_packet(dev, buf, length);
393 dev->trans_start = jiffies;
394 lp->stats.tx_bytes += length;
395 dev_kfree_skb (skb);
396 /* You might need to clean up and record Tx statistics here. */
398 return 0;
401 /* The typical workload of the driver:
402 Handle the network interface interrupts. */
403 static irqreturn_t seeq8005_interrupt(int irq, void *dev_id, struct pt_regs * regs)
405 struct net_device *dev = dev_id;
406 struct net_local *lp;
407 int ioaddr, status, boguscount = 0;
408 int handled = 0;
410 ioaddr = dev->base_addr;
411 lp = (struct net_local *)dev->priv;
413 status = inw(SEEQ_STATUS);
414 do {
415 if (net_debug >2) {
416 printk("%s: int, status=0x%04x\n",dev->name,status);
419 if (status & SEEQSTAT_WINDOW_INT) {
420 handled = 1;
421 outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
422 if (net_debug) {
423 printk("%s: window int!\n",dev->name);
426 if (status & SEEQSTAT_TX_INT) {
427 handled = 1;
428 outw( SEEQCMD_TX_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
429 lp->stats.tx_packets++;
430 netif_wake_queue(dev); /* Inform upper layers. */
432 if (status & SEEQSTAT_RX_INT) {
433 handled = 1;
434 /* Got a packet(s). */
435 seeq8005_rx(dev);
437 status = inw(SEEQ_STATUS);
438 } while ( (++boguscount < 10) && (status & SEEQSTAT_ANY_INT)) ;
440 if(net_debug>2) {
441 printk("%s: eoi\n",dev->name);
443 return IRQ_RETVAL(handled);
446 /* We have a good packet(s), get it/them out of the buffers. */
447 static void seeq8005_rx(struct net_device *dev)
449 struct net_local *lp = (struct net_local *)dev->priv;
450 int boguscount = 10;
451 int pkt_hdr;
452 int ioaddr = dev->base_addr;
454 do {
455 int next_packet;
456 int pkt_len;
457 int i;
458 int status;
460 status = inw(SEEQ_STATUS);
461 outw( lp->receive_ptr, SEEQ_DMAAR);
462 outw(SEEQCMD_FIFO_READ | SEEQCMD_RX_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
463 wait_for_buffer(dev);
464 next_packet = ntohs(inw(SEEQ_BUFFER));
465 pkt_hdr = inw(SEEQ_BUFFER);
467 if (net_debug>2) {
468 printk("%s: 0x%04x recv next=0x%04x, hdr=0x%04x\n",dev->name,lp->receive_ptr,next_packet,pkt_hdr);
471 if ((next_packet == 0) || ((pkt_hdr & SEEQPKTH_CHAIN)==0)) { /* Read all the frames? */
472 return; /* Done for now */
475 if ((pkt_hdr & SEEQPKTS_DONE)==0)
476 break;
478 if (next_packet < lp->receive_ptr) {
479 pkt_len = (next_packet + 0x10000 - ((DEFAULT_TEA+1)<<8)) - lp->receive_ptr - 4;
480 } else {
481 pkt_len = next_packet - lp->receive_ptr - 4;
484 if (next_packet < ((DEFAULT_TEA+1)<<8)) { /* is the next_packet address sane? */
485 printk("%s: recv packet ring corrupt, resetting board\n",dev->name);
486 seeq8005_init(dev,1);
487 return;
490 lp->receive_ptr = next_packet;
492 if (net_debug>2) {
493 printk("%s: recv len=0x%04x\n",dev->name,pkt_len);
496 if (pkt_hdr & SEEQPKTS_ANY_ERROR) { /* There was an error. */
497 lp->stats.rx_errors++;
498 if (pkt_hdr & SEEQPKTS_SHORT) lp->stats.rx_frame_errors++;
499 if (pkt_hdr & SEEQPKTS_DRIB) lp->stats.rx_frame_errors++;
500 if (pkt_hdr & SEEQPKTS_OVERSIZE) lp->stats.rx_over_errors++;
501 if (pkt_hdr & SEEQPKTS_CRC_ERR) lp->stats.rx_crc_errors++;
502 /* skip over this packet */
503 outw( SEEQCMD_FIFO_WRITE | SEEQCMD_DMA_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
504 outw( (lp->receive_ptr & 0xff00)>>8, SEEQ_REA);
505 } else {
506 /* Malloc up new buffer. */
507 struct sk_buff *skb;
508 unsigned char *buf;
510 skb = dev_alloc_skb(pkt_len);
511 if (skb == NULL) {
512 printk("%s: Memory squeeze, dropping packet.\n", dev->name);
513 lp->stats.rx_dropped++;
514 break;
516 skb->dev = dev;
517 skb_reserve(skb, 2); /* align data on 16 byte */
518 buf = skb_put(skb,pkt_len);
520 insw(SEEQ_BUFFER, buf, (pkt_len + 1) >> 1);
522 if (net_debug>2) {
523 char * p = buf;
524 printk("%s: recv ",dev->name);
525 for(i=0;i<14;i++) {
526 printk("%02x ",*(p++)&0xff);
528 printk("\n");
531 skb->protocol=eth_type_trans(skb,dev);
532 netif_rx(skb);
533 dev->last_rx = jiffies;
534 lp->stats.rx_packets++;
535 lp->stats.rx_bytes += pkt_len;
537 } while ((--boguscount) && (pkt_hdr & SEEQPKTH_CHAIN));
539 /* If any worth-while packets have been received, netif_rx()
540 has done a mark_bh(NET_BH) for us and will work on them
541 when we get to the bottom-half routine. */
542 return;
545 /* The inverse routine to net_open(). */
546 static int seeq8005_close(struct net_device *dev)
548 struct net_local *lp = (struct net_local *)dev->priv;
549 int ioaddr = dev->base_addr;
551 lp->open_time = 0;
553 netif_stop_queue(dev);
555 /* Flush the Tx and disable Rx here. */
556 outw( SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
558 free_irq(dev->irq, dev);
560 /* Update the statistics here. */
562 return 0;
566 /* Get the current statistics. This may be called with the card open or
567 closed. */
568 static struct net_device_stats *seeq8005_get_stats(struct net_device *dev)
570 struct net_local *lp = (struct net_local *)dev->priv;
572 return &lp->stats;
575 /* Set or clear the multicast filter for this adaptor.
576 num_addrs == -1 Promiscuous mode, receive all packets
577 num_addrs == 0 Normal mode, clear multicast list
578 num_addrs > 0 Multicast mode, receive normal and MC packets, and do
579 best-effort filtering.
581 static void set_multicast_list(struct net_device *dev)
584 * I _could_ do up to 6 addresses here, but won't (yet?)
587 #if 0
588 int ioaddr = dev->base_addr;
590 * hmm, not even sure if my matching works _anyway_ - seem to be receiving
591 * _everything_ . . .
594 if (num_addrs) { /* Enable promiscuous mode */
595 outw( (inw(SEEQ_CFG1) & ~SEEQCFG1_MATCH_MASK)| SEEQCFG1_MATCH_ALL, SEEQ_CFG1);
596 dev->flags|=IFF_PROMISC;
597 } else { /* Disable promiscuous mode, use normal mode */
598 outw( (inw(SEEQ_CFG1) & ~SEEQCFG1_MATCH_MASK)| SEEQCFG1_MATCH_BROAD, SEEQ_CFG1);
600 #endif
603 void seeq8005_init(struct net_device *dev, int startp)
605 struct net_local *lp = (struct net_local *)dev->priv;
606 int ioaddr = dev->base_addr;
607 int i;
609 outw(SEEQCFG2_RESET, SEEQ_CFG2); /* reset device */
610 udelay(5);
612 outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
613 outw( 0, SEEQ_DMAAR); /* load start address into both low and high byte */
614 /* wait_for_buffer(dev); */ /* I think that you only need a wait for memory buffer */
615 outw( SEEQCFG1_BUFFER_MAC0, SEEQ_CFG1);
617 for(i=0;i<6;i++) { /* set Station address */
618 outb(dev->dev_addr[i], SEEQ_BUFFER);
619 udelay(2);
622 outw( SEEQCFG1_BUFFER_TEA, SEEQ_CFG1); /* set xmit end area pointer to 16K */
623 outb( DEFAULT_TEA, SEEQ_BUFFER); /* this gives us 16K of send buffer and 48K of recv buffer */
625 lp->receive_ptr = (DEFAULT_TEA+1)<<8; /* so we can find our packet_header */
626 outw( lp->receive_ptr, SEEQ_RPR); /* Receive Pointer Register is set to recv buffer memory */
628 outw( 0x00ff, SEEQ_REA); /* Receive Area End */
630 if (net_debug>4) {
631 printk("%s: SA0 = ",dev->name);
633 outw( SEEQCMD_FIFO_READ | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
634 outw( 0, SEEQ_DMAAR);
635 outw( SEEQCFG1_BUFFER_MAC0, SEEQ_CFG1);
637 for(i=0;i<6;i++) {
638 printk("%02x ",inb(SEEQ_BUFFER));
640 printk("\n");
643 outw( SEEQCFG1_MAC0_EN | SEEQCFG1_MATCH_BROAD | SEEQCFG1_BUFFER_BUFFER, SEEQ_CFG1);
644 outw( SEEQCFG2_AUTO_REA | SEEQCFG2_CTRLO, SEEQ_CFG2);
645 outw( SEEQCMD_SET_RX_ON | SEEQCMD_TX_INT_EN | SEEQCMD_RX_INT_EN, SEEQ_CMD);
647 if (net_debug>4) {
648 int old_cfg1;
649 old_cfg1 = inw(SEEQ_CFG1);
650 printk("%s: stat = 0x%04x\n",dev->name,inw(SEEQ_STATUS));
651 printk("%s: cfg1 = 0x%04x\n",dev->name,old_cfg1);
652 printk("%s: cfg2 = 0x%04x\n",dev->name,inw(SEEQ_CFG2));
653 printk("%s: raer = 0x%04x\n",dev->name,inw(SEEQ_REA));
654 printk("%s: dmaar= 0x%04x\n",dev->name,inw(SEEQ_DMAAR));
660 static void hardware_send_packet(struct net_device * dev, char *buf, int length)
662 int ioaddr = dev->base_addr;
663 int status = inw(SEEQ_STATUS);
664 int transmit_ptr = 0;
665 int tmp;
667 if (net_debug>4) {
668 printk("%s: send 0x%04x\n",dev->name,length);
671 /* Set FIFO to writemode and set packet-buffer address */
672 outw( SEEQCMD_FIFO_WRITE | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
673 outw( transmit_ptr, SEEQ_DMAAR);
675 /* output SEEQ Packet header barfage */
676 outw( htons(length + 4), SEEQ_BUFFER);
677 outw( SEEQPKTH_XMIT | SEEQPKTH_DATA_FOLLOWS | SEEQPKTH_XMIT_INT_EN, SEEQ_BUFFER );
679 /* blat the buffer */
680 outsw( SEEQ_BUFFER, buf, (length +1) >> 1);
681 /* paranoia !! */
682 outw( 0, SEEQ_BUFFER);
683 outw( 0, SEEQ_BUFFER);
685 /* set address of start of transmit chain */
686 outw( transmit_ptr, SEEQ_TPR);
688 /* drain FIFO */
689 tmp = jiffies;
690 while ( (((status=inw(SEEQ_STATUS)) & SEEQSTAT_FIFO_EMPTY) == 0) && (jiffies - tmp < HZ))
691 mb();
693 /* doit ! */
694 outw( SEEQCMD_WINDOW_INT_ACK | SEEQCMD_SET_TX_ON | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
700 * wait_for_buffer
702 * This routine waits for the SEEQ chip to assert that the FIFO is ready
703 * by checking for a window interrupt, and then clearing it
705 inline void wait_for_buffer(struct net_device * dev)
707 int ioaddr = dev->base_addr;
708 int tmp;
709 int status;
711 tmp = jiffies + HZ;
712 while ( ( ((status=inw(SEEQ_STATUS)) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && time_before(jiffies, tmp))
713 mb();
715 if ( (status & SEEQSTAT_WINDOW_INT) == SEEQSTAT_WINDOW_INT)
716 outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
719 #ifdef MODULE
721 static struct net_device dev_seeq = { .init = seeq8005_probe };
722 static int io = 0x320;
723 static int irq = 10;
724 MODULE_LICENSE("GPL");
725 MODULE_PARM(io, "i");
726 MODULE_PARM(irq, "i");
727 MODULE_PARM_DESC(io, "SEEQ 8005 I/O base address");
728 MODULE_PARM_DESC(irq, "SEEQ 8005 IRQ number");
730 int init_module(void)
732 dev_seeq.irq=irq;
733 dev_seeq.base_addr=io;
734 if (register_netdev(&dev_seeq) != 0)
735 return -EIO;
736 return 0;
739 void cleanup_module(void)
741 unregister_netdev(&dev_seeq);
744 * Free up the private structure, or leak memory :-)
747 kfree(dev_seeq.priv);
748 dev_seeq.priv = NULL; /* gets re-allocated by el1_probe1 */
751 * If we don't do this, we can't re-insmod it later.
753 release_region(dev_seeq.base_addr, SEEQ8005_IO_EXTENT);
756 #endif /* MODULE */
759 * Local variables:
760 * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c skeleton.c"
761 * version-control: t
762 * kept-new-versions: 5
763 * tab-width: 4
764 * End: