1 /* seeq8005.c: A network driver for linux. */
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";
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
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>
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>
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 */
65 static unsigned int net_debug
= NET_DEBUG
;
67 /* Information that need to be kept for each board. */
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. */
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.
106 seeq8005_probe(struct net_device
*dev
)
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. */
116 for (i
= 0; seeq8005_portlist
[i
]; i
++)
117 if (seeq8005_probe1(dev
, seeq8005_portlist
[i
]) == 0)
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
;
131 unsigned char SA_prom
[32];
139 if (!request_region(ioaddr
, SEEQ8005_IO_EXTENT
, "seeq8005"))
143 printk("seeq8005: probing at 0x%x\n",ioaddr
);
145 old_stat
= inw(SEEQ_STATUS
); /* read status register */
146 if (old_stat
== 0xffff) {
148 goto out
; /* assume that 0xffff == no device */
150 if ( (old_stat
& 0x1800) != 0x1800 ) { /* assume that unused bits are 1, as my manual says */
152 printk("seeq8005: reserved stat bits != 0x1800\n");
153 printk(" == 0x%04x\n",old_stat
);
159 old_rear
= inw(SEEQ_REA
);
160 if (old_rear
== 0xffff) {
162 if (inw(SEEQ_REA
) == 0xffff) { /* assume that 0xffff == no device */
166 } else if ((old_rear
& 0xff00) != 0xff00) { /* assume that unused bits are 1 */
168 printk("seeq8005: unused rear bits != 0xff00\n");
169 printk(" == 0x%04x\n",old_rear
);
175 old_cfg2
= inw(SEEQ_CFG2
); /* read CFG2 register */
176 old_cfg1
= inw(SEEQ_CFG1
);
177 old_dmaar
= inw(SEEQ_DMAAR
);
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 */
193 for(i
=0; i
<32; i
++) {
194 j
+= SA_prom
[i
] = inw(SEEQ_BUFFER
) & 0xff;
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
);
211 outw( SEEQCFG2_RESET
, SEEQ_CFG2
); /* reset the card */
213 outw( SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
216 printk("seeq8005: prom sum = 0x%08x\n",j
);
217 for(j
=0; j
<32; j
+=16) {
218 printk("seeq8005: prom %02x: ",j
);
220 printk("%02x ",SA_prom
[j
|i
]);
224 if ((SA_prom
[j
|i
]>31)&&(SA_prom
[j
|i
]<127)) {
225 printk("%c", SA_prom
[j
|i
]);
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
);
249 while ( ((inw(SEEQ_STATUS
) & SEEQSTAT_FIFO_EMPTY
) != SEEQSTAT_FIFO_EMPTY
) && time_before(jiffies
, j
) )
251 outw( 0 , SEEQ_DMAAR
);
252 while ( ((inw(SEEQ_STATUS
) & SEEQSTAT_WINDOW_INT
) != SEEQSTAT_WINDOW_INT
) && time_before(jiffies
, j
+HZ
))
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
);
258 for(i
=0;i
<32768;i
++) {
259 if (inw(SEEQ_BUFFER
) != 0x5a5a)
270 if (net_debug
&& version_printed
++ == 0)
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
);
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.
301 int irqval
= request_irq(dev
->irq
, &seeq8005_interrupt
, 0, "seeq8005", dev
);
303 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev
->name
,
311 /* Initialize the device structure. */
312 dev
->priv
= kmalloc(sizeof(struct net_local
), GFP_KERNEL
);
313 if (dev
->priv
== NULL
)
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. */
328 dev
->flags
&= ~IFF_MULTICAST
;
332 release_region(ioaddr
, SEEQ8005_IO_EXTENT
);
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
);
351 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev
->name
,
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
);
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
);
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
;
396 /* You might need to clean up and record Tx statistics here. */
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;
410 ioaddr
= dev
->base_addr
;
411 lp
= (struct net_local
*)dev
->priv
;
413 status
= inw(SEEQ_STATUS
);
416 printk("%s: int, status=0x%04x\n",dev
->name
,status
);
419 if (status
& SEEQSTAT_WINDOW_INT
) {
421 outw( SEEQCMD_WINDOW_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
423 printk("%s: window int!\n",dev
->name
);
426 if (status
& SEEQSTAT_TX_INT
) {
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
) {
434 /* Got a packet(s). */
437 status
= inw(SEEQ_STATUS
);
438 } while ( (++boguscount
< 10) && (status
& SEEQSTAT_ANY_INT
)) ;
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
;
452 int ioaddr
= dev
->base_addr
;
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
);
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)
478 if (next_packet
< lp
->receive_ptr
) {
479 pkt_len
= (next_packet
+ 0x10000 - ((DEFAULT_TEA
+1)<<8)) - lp
->receive_ptr
- 4;
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);
490 lp
->receive_ptr
= next_packet
;
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
);
506 /* Malloc up new buffer. */
510 skb
= dev_alloc_skb(pkt_len
);
512 printk("%s: Memory squeeze, dropping packet.\n", dev
->name
);
513 lp
->stats
.rx_dropped
++;
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);
524 printk("%s: recv ",dev
->name
);
526 printk("%02x ",*(p
++)&0xff);
531 skb
->protocol
=eth_type_trans(skb
,dev
);
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. */
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
;
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. */
566 /* Get the current statistics. This may be called with the card open or
568 static struct net_device_stats
*seeq8005_get_stats(struct net_device
*dev
)
570 struct net_local
*lp
= (struct net_local
*)dev
->priv
;
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?)
588 int ioaddr
= dev
->base_addr
;
590 * hmm, not even sure if my matching works _anyway_ - seem to be receiving
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
);
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
;
609 outw(SEEQCFG2_RESET
, SEEQ_CFG2
); /* reset device */
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
);
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 */
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
);
638 printk("%02x ",inb(SEEQ_BUFFER
));
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
);
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;
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);
682 outw( 0, SEEQ_BUFFER
);
683 outw( 0, SEEQ_BUFFER
);
685 /* set address of start of transmit chain */
686 outw( transmit_ptr
, SEEQ_TPR
);
690 while ( (((status
=inw(SEEQ_STATUS
)) & SEEQSTAT_FIFO_EMPTY
) == 0) && (jiffies
- tmp
< HZ
))
694 outw( SEEQCMD_WINDOW_INT_ACK
| SEEQCMD_SET_TX_ON
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
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
;
712 while ( ( ((status
=inw(SEEQ_STATUS
)) & SEEQSTAT_WINDOW_INT
) != SEEQSTAT_WINDOW_INT
) && time_before(jiffies
, tmp
))
715 if ( (status
& SEEQSTAT_WINDOW_INT
) == SEEQSTAT_WINDOW_INT
)
716 outw( SEEQCMD_WINDOW_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
721 static struct net_device dev_seeq
= { .init
= seeq8005_probe
};
722 static int io
= 0x320;
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)
733 dev_seeq
.base_addr
=io
;
734 if (register_netdev(&dev_seeq
) != 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
);
760 * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c skeleton.c"
762 * kept-new-versions: 5