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>
48 #include <linux/bitops.h>
49 #include <linux/jiffies.h>
51 #include <asm/system.h>
57 /* First, a few definitions that the brave might change. */
58 /* A zero-terminated list of I/O addresses to be probed. */
59 static unsigned int seeq8005_portlist
[] __initdata
=
60 { 0x300, 0x320, 0x340, 0x360, 0};
62 /* use 0 for production, 1 for verification, >2 for debug */
66 static unsigned int net_debug
= NET_DEBUG
;
68 /* Information that need to be kept for each board. */
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 static int seeq8005_probe1(struct net_device
*dev
, int ioaddr
);
82 static int seeq8005_open(struct net_device
*dev
);
83 static void seeq8005_timeout(struct net_device
*dev
);
84 static netdev_tx_t
seeq8005_send_packet(struct sk_buff
*skb
,
85 struct net_device
*dev
);
86 static irqreturn_t
seeq8005_interrupt(int irq
, void *dev_id
);
87 static void seeq8005_rx(struct net_device
*dev
);
88 static int seeq8005_close(struct net_device
*dev
);
89 static void set_multicast_list(struct net_device
*dev
);
91 /* Example routines you must write ;->. */
92 #define tx_done(dev) (inw(SEEQ_STATUS) & SEEQSTAT_TX_ON)
93 static void hardware_send_packet(struct net_device
*dev
, char *buf
, int length
);
94 extern void seeq8005_init(struct net_device
*dev
, int startp
);
95 static inline void wait_for_buffer(struct net_device
*dev
);
98 /* Check for a network adaptor of this type, and return '0' iff one exists.
99 If dev->base_addr == 0, probe all likely locations.
100 If dev->base_addr == 1, always return failure.
103 static int io
= 0x320;
106 struct net_device
* __init
seeq8005_probe(int unit
)
108 struct net_device
*dev
= alloc_etherdev(sizeof(struct net_local
));
113 return ERR_PTR(-ENODEV
);
116 sprintf(dev
->name
, "eth%d", unit
);
117 netdev_boot_setup_check(dev
);
122 if (io
> 0x1ff) { /* Check a single specified location. */
123 err
= seeq8005_probe1(dev
, io
);
124 } else if (io
!= 0) { /* Don't probe at all. */
127 for (port
= seeq8005_portlist
; *port
; port
++) {
128 if (seeq8005_probe1(dev
, *port
) == 0)
136 err
= register_netdev(dev
);
141 release_region(dev
->base_addr
, SEEQ8005_IO_EXTENT
);
147 static const struct net_device_ops seeq8005_netdev_ops
= {
148 .ndo_open
= seeq8005_open
,
149 .ndo_stop
= seeq8005_close
,
150 .ndo_start_xmit
= seeq8005_send_packet
,
151 .ndo_tx_timeout
= seeq8005_timeout
,
152 .ndo_set_multicast_list
= set_multicast_list
,
153 .ndo_change_mtu
= eth_change_mtu
,
154 .ndo_set_mac_address
= eth_mac_addr
,
155 .ndo_validate_addr
= eth_validate_addr
,
158 /* This is the real probe routine. Linux has a history of friendly device
159 probes on the ISA bus. A good device probes avoids doing writes, and
160 verifies that the correct device exists and functions. */
162 static int __init
seeq8005_probe1(struct net_device
*dev
, int ioaddr
)
164 static unsigned version_printed
;
166 unsigned char SA_prom
[32];
174 if (!request_region(ioaddr
, SEEQ8005_IO_EXTENT
, "seeq8005"))
178 printk("seeq8005: probing at 0x%x\n",ioaddr
);
180 old_stat
= inw(SEEQ_STATUS
); /* read status register */
181 if (old_stat
== 0xffff) {
183 goto out
; /* assume that 0xffff == no device */
185 if ( (old_stat
& 0x1800) != 0x1800 ) { /* assume that unused bits are 1, as my manual says */
187 printk("seeq8005: reserved stat bits != 0x1800\n");
188 printk(" == 0x%04x\n",old_stat
);
194 old_rear
= inw(SEEQ_REA
);
195 if (old_rear
== 0xffff) {
197 if (inw(SEEQ_REA
) == 0xffff) { /* assume that 0xffff == no device */
201 } else if ((old_rear
& 0xff00) != 0xff00) { /* assume that unused bits are 1 */
203 printk("seeq8005: unused rear bits != 0xff00\n");
204 printk(" == 0x%04x\n",old_rear
);
210 old_cfg2
= inw(SEEQ_CFG2
); /* read CFG2 register */
211 old_cfg1
= inw(SEEQ_CFG1
);
212 old_dmaar
= inw(SEEQ_DMAAR
);
215 printk("seeq8005: stat = 0x%04x\n",old_stat
);
216 printk("seeq8005: cfg1 = 0x%04x\n",old_cfg1
);
217 printk("seeq8005: cfg2 = 0x%04x\n",old_cfg2
);
218 printk("seeq8005: raer = 0x%04x\n",old_rear
);
219 printk("seeq8005: dmaar= 0x%04x\n",old_dmaar
);
222 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
); /* setup for reading PROM */
223 outw( 0, SEEQ_DMAAR
); /* set starting PROM address */
224 outw( SEEQCFG1_BUFFER_PROM
, SEEQ_CFG1
); /* set buffer to look at PROM */
228 for(i
=0; i
<32; i
++) {
229 j
+= SA_prom
[i
] = inw(SEEQ_BUFFER
) & 0xff;
233 /* untested because I only have the one card */
234 if ( (j
&0xff) != 0 ) { /* checksum appears to be 8bit = 0 */
235 if (net_debug
>1) { /* check this before deciding that we have a card */
236 printk("seeq8005: prom sum error\n");
238 outw( old_stat
, SEEQ_STATUS
);
239 outw( old_dmaar
, SEEQ_DMAAR
);
240 outw( old_cfg1
, SEEQ_CFG1
);
246 outw( SEEQCFG2_RESET
, SEEQ_CFG2
); /* reset the card */
248 outw( SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
251 printk("seeq8005: prom sum = 0x%08x\n",j
);
252 for(j
=0; j
<32; j
+=16) {
253 printk("seeq8005: prom %02x: ",j
);
255 printk("%02x ",SA_prom
[j
|i
]);
259 if ((SA_prom
[j
|i
]>31)&&(SA_prom
[j
|i
]<127)) {
260 printk("%c", SA_prom
[j
|i
]);
271 * testing the packet buffer memory doesn't work yet
272 * but all other buffer accesses do
273 * - fixing is not a priority
275 if (net_debug
>1) { /* test packet buffer memory */
276 printk("seeq8005: testing packet buffer ... ");
277 outw( SEEQCFG1_BUFFER_BUFFER
, SEEQ_CFG1
);
278 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
279 outw( 0 , SEEQ_DMAAR
);
280 for(i
=0;i
<32768;i
++) {
281 outw(0x5a5a, SEEQ_BUFFER
);
284 while ( ((inw(SEEQ_STATUS
) & SEEQSTAT_FIFO_EMPTY
) != SEEQSTAT_FIFO_EMPTY
) && time_before(jiffies
, j
) )
286 outw( 0 , SEEQ_DMAAR
);
287 while ( ((inw(SEEQ_STATUS
) & SEEQSTAT_WINDOW_INT
) != SEEQSTAT_WINDOW_INT
) && time_before(jiffies
, j
+HZ
))
289 if ( (inw(SEEQ_STATUS
) & SEEQSTAT_WINDOW_INT
) == SEEQSTAT_WINDOW_INT
)
290 outw( SEEQCMD_WINDOW_INT_ACK
| (inw(SEEQ_STATUS
)& SEEQCMD_INT_MASK
), SEEQ_CMD
);
291 outw( SEEQCMD_FIFO_READ
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
293 for(i
=0;i
<32768;i
++) {
294 if (inw(SEEQ_BUFFER
) != 0x5a5a)
305 if (net_debug
&& version_printed
++ == 0)
308 printk("%s: %s found at %#3x, ", dev
->name
, "seeq8005", ioaddr
);
310 /* Fill in the 'dev' fields. */
311 dev
->base_addr
= ioaddr
;
314 /* Retrieve and print the ethernet address. */
315 for (i
= 0; i
< 6; i
++)
316 dev
->dev_addr
[i
] = SA_prom
[i
+6];
317 printk("%pM", dev
->dev_addr
);
319 if (dev
->irq
== 0xff)
320 ; /* Do nothing: a user-level program will set it. */
321 else if (dev
->irq
< 2) { /* "Auto-IRQ" */
322 unsigned long cookie
= probe_irq_on();
324 outw( SEEQCMD_RX_INT_EN
| SEEQCMD_SET_RX_ON
| SEEQCMD_SET_RX_OFF
, SEEQ_CMD
);
326 dev
->irq
= probe_irq_off(cookie
);
329 printk(" autoirq is %d\n", dev
->irq
);
330 } else if (dev
->irq
== 2)
331 /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
332 * or don't know which one to set.
338 int irqval
= request_irq(dev
->irq
, &seeq8005_interrupt
, 0, "seeq8005", dev
);
340 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev
->name
,
347 dev
->netdev_ops
= &seeq8005_netdev_ops
;
348 dev
->watchdog_timeo
= HZ
/20;
349 dev
->flags
&= ~IFF_MULTICAST
;
353 release_region(ioaddr
, SEEQ8005_IO_EXTENT
);
358 /* Open/initialize the board. This is called (in the current kernel)
359 sometime after booting when the 'ifconfig' program is run.
361 This routine should set everything up anew at each open, even
362 registers that "should" only need to be set once at boot, so that
363 there is non-reboot way to recover if something goes wrong.
365 static int seeq8005_open(struct net_device
*dev
)
367 struct net_local
*lp
= netdev_priv(dev
);
370 int irqval
= request_irq(dev
->irq
, &seeq8005_interrupt
, 0, "seeq8005", dev
);
372 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev
->name
,
378 /* Reset the hardware here. Don't forget to set the station address. */
379 seeq8005_init(dev
, 1);
381 lp
->open_time
= jiffies
;
383 netif_start_queue(dev
);
387 static void seeq8005_timeout(struct net_device
*dev
)
389 int ioaddr
= dev
->base_addr
;
390 printk(KERN_WARNING
"%s: transmit timed out, %s?\n", dev
->name
,
391 tx_done(dev
) ? "IRQ conflict" : "network cable problem");
392 /* Try to restart the adaptor. */
393 seeq8005_init(dev
, 1);
394 dev
->trans_start
= jiffies
;
395 netif_wake_queue(dev
);
398 static netdev_tx_t
seeq8005_send_packet(struct sk_buff
*skb
,
399 struct net_device
*dev
)
401 short length
= skb
->len
;
404 if (length
< ETH_ZLEN
) {
405 if (skb_padto(skb
, ETH_ZLEN
))
411 /* Block a timer-based transmit from overlapping */
412 netif_stop_queue(dev
);
414 hardware_send_packet(dev
, buf
, length
);
415 dev
->trans_start
= jiffies
;
416 dev
->stats
.tx_bytes
+= length
;
418 /* You might need to clean up and record Tx statistics here. */
426 * This routine waits for the SEEQ chip to assert that the FIFO is ready
427 * by checking for a window interrupt, and then clearing it. This has to
428 * occur in the interrupt handler!
430 inline void wait_for_buffer(struct net_device
* dev
)
432 int ioaddr
= dev
->base_addr
;
437 while ( ( ((status
=inw(SEEQ_STATUS
)) & SEEQSTAT_WINDOW_INT
) != SEEQSTAT_WINDOW_INT
) && time_before(jiffies
, tmp
))
440 if ( (status
& SEEQSTAT_WINDOW_INT
) == SEEQSTAT_WINDOW_INT
)
441 outw( SEEQCMD_WINDOW_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
444 /* The typical workload of the driver:
445 Handle the network interface interrupts. */
446 static irqreturn_t
seeq8005_interrupt(int irq
, void *dev_id
)
448 struct net_device
*dev
= dev_id
;
449 struct net_local
*lp
;
450 int ioaddr
, status
, boguscount
= 0;
453 ioaddr
= dev
->base_addr
;
454 lp
= netdev_priv(dev
);
456 status
= inw(SEEQ_STATUS
);
459 printk("%s: int, status=0x%04x\n",dev
->name
,status
);
462 if (status
& SEEQSTAT_WINDOW_INT
) {
464 outw( SEEQCMD_WINDOW_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
466 printk("%s: window int!\n",dev
->name
);
469 if (status
& SEEQSTAT_TX_INT
) {
471 outw( SEEQCMD_TX_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
472 dev
->stats
.tx_packets
++;
473 netif_wake_queue(dev
); /* Inform upper layers. */
475 if (status
& SEEQSTAT_RX_INT
) {
477 /* Got a packet(s). */
480 status
= inw(SEEQ_STATUS
);
481 } while ( (++boguscount
< 10) && (status
& SEEQSTAT_ANY_INT
)) ;
484 printk("%s: eoi\n",dev
->name
);
486 return IRQ_RETVAL(handled
);
489 /* We have a good packet(s), get it/them out of the buffers. */
490 static void seeq8005_rx(struct net_device
*dev
)
492 struct net_local
*lp
= netdev_priv(dev
);
495 int ioaddr
= dev
->base_addr
;
503 status
= inw(SEEQ_STATUS
);
504 outw( lp
->receive_ptr
, SEEQ_DMAAR
);
505 outw(SEEQCMD_FIFO_READ
| SEEQCMD_RX_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
506 wait_for_buffer(dev
);
507 next_packet
= ntohs(inw(SEEQ_BUFFER
));
508 pkt_hdr
= inw(SEEQ_BUFFER
);
511 printk("%s: 0x%04x recv next=0x%04x, hdr=0x%04x\n",dev
->name
,lp
->receive_ptr
,next_packet
,pkt_hdr
);
514 if ((next_packet
== 0) || ((pkt_hdr
& SEEQPKTH_CHAIN
)==0)) { /* Read all the frames? */
515 return; /* Done for now */
518 if ((pkt_hdr
& SEEQPKTS_DONE
)==0)
521 if (next_packet
< lp
->receive_ptr
) {
522 pkt_len
= (next_packet
+ 0x10000 - ((DEFAULT_TEA
+1)<<8)) - lp
->receive_ptr
- 4;
524 pkt_len
= next_packet
- lp
->receive_ptr
- 4;
527 if (next_packet
< ((DEFAULT_TEA
+1)<<8)) { /* is the next_packet address sane? */
528 printk("%s: recv packet ring corrupt, resetting board\n",dev
->name
);
529 seeq8005_init(dev
,1);
533 lp
->receive_ptr
= next_packet
;
536 printk("%s: recv len=0x%04x\n",dev
->name
,pkt_len
);
539 if (pkt_hdr
& SEEQPKTS_ANY_ERROR
) { /* There was an error. */
540 dev
->stats
.rx_errors
++;
541 if (pkt_hdr
& SEEQPKTS_SHORT
) dev
->stats
.rx_frame_errors
++;
542 if (pkt_hdr
& SEEQPKTS_DRIB
) dev
->stats
.rx_frame_errors
++;
543 if (pkt_hdr
& SEEQPKTS_OVERSIZE
) dev
->stats
.rx_over_errors
++;
544 if (pkt_hdr
& SEEQPKTS_CRC_ERR
) dev
->stats
.rx_crc_errors
++;
545 /* skip over this packet */
546 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_DMA_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
547 outw( (lp
->receive_ptr
& 0xff00)>>8, SEEQ_REA
);
549 /* Malloc up new buffer. */
553 skb
= dev_alloc_skb(pkt_len
);
555 printk("%s: Memory squeeze, dropping packet.\n", dev
->name
);
556 dev
->stats
.rx_dropped
++;
559 skb_reserve(skb
, 2); /* align data on 16 byte */
560 buf
= skb_put(skb
,pkt_len
);
562 insw(SEEQ_BUFFER
, buf
, (pkt_len
+ 1) >> 1);
566 printk("%s: recv ",dev
->name
);
568 printk("%02x ",*(p
++)&0xff);
573 skb
->protocol
=eth_type_trans(skb
,dev
);
575 dev
->stats
.rx_packets
++;
576 dev
->stats
.rx_bytes
+= pkt_len
;
578 } while ((--boguscount
) && (pkt_hdr
& SEEQPKTH_CHAIN
));
580 /* If any worth-while packets have been received, netif_rx()
581 has done a mark_bh(NET_BH) for us and will work on them
582 when we get to the bottom-half routine. */
586 /* The inverse routine to net_open(). */
587 static int seeq8005_close(struct net_device
*dev
)
589 struct net_local
*lp
= netdev_priv(dev
);
590 int ioaddr
= dev
->base_addr
;
594 netif_stop_queue(dev
);
596 /* Flush the Tx and disable Rx here. */
597 outw( SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
599 free_irq(dev
->irq
, dev
);
601 /* Update the statistics here. */
607 /* Set or clear the multicast filter for this adaptor.
608 num_addrs == -1 Promiscuous mode, receive all packets
609 num_addrs == 0 Normal mode, clear multicast list
610 num_addrs > 0 Multicast mode, receive normal and MC packets, and do
611 best-effort filtering.
613 static void set_multicast_list(struct net_device
*dev
)
616 * I _could_ do up to 6 addresses here, but won't (yet?)
620 int ioaddr
= dev
->base_addr
;
622 * hmm, not even sure if my matching works _anyway_ - seem to be receiving
626 if (num_addrs
) { /* Enable promiscuous mode */
627 outw( (inw(SEEQ_CFG1
) & ~SEEQCFG1_MATCH_MASK
)| SEEQCFG1_MATCH_ALL
, SEEQ_CFG1
);
628 dev
->flags
|=IFF_PROMISC
;
629 } else { /* Disable promiscuous mode, use normal mode */
630 outw( (inw(SEEQ_CFG1
) & ~SEEQCFG1_MATCH_MASK
)| SEEQCFG1_MATCH_BROAD
, SEEQ_CFG1
);
635 void seeq8005_init(struct net_device
*dev
, int startp
)
637 struct net_local
*lp
= netdev_priv(dev
);
638 int ioaddr
= dev
->base_addr
;
641 outw(SEEQCFG2_RESET
, SEEQ_CFG2
); /* reset device */
644 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
645 outw( 0, SEEQ_DMAAR
); /* load start address into both low and high byte */
646 /* wait_for_buffer(dev); */ /* I think that you only need a wait for memory buffer */
647 outw( SEEQCFG1_BUFFER_MAC0
, SEEQ_CFG1
);
649 for(i
=0;i
<6;i
++) { /* set Station address */
650 outb(dev
->dev_addr
[i
], SEEQ_BUFFER
);
654 outw( SEEQCFG1_BUFFER_TEA
, SEEQ_CFG1
); /* set xmit end area pointer to 16K */
655 outb( DEFAULT_TEA
, SEEQ_BUFFER
); /* this gives us 16K of send buffer and 48K of recv buffer */
657 lp
->receive_ptr
= (DEFAULT_TEA
+1)<<8; /* so we can find our packet_header */
658 outw( lp
->receive_ptr
, SEEQ_RPR
); /* Receive Pointer Register is set to recv buffer memory */
660 outw( 0x00ff, SEEQ_REA
); /* Receive Area End */
663 printk("%s: SA0 = ",dev
->name
);
665 outw( SEEQCMD_FIFO_READ
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
666 outw( 0, SEEQ_DMAAR
);
667 outw( SEEQCFG1_BUFFER_MAC0
, SEEQ_CFG1
);
670 printk("%02x ",inb(SEEQ_BUFFER
));
675 outw( SEEQCFG1_MAC0_EN
| SEEQCFG1_MATCH_BROAD
| SEEQCFG1_BUFFER_BUFFER
, SEEQ_CFG1
);
676 outw( SEEQCFG2_AUTO_REA
| SEEQCFG2_CTRLO
, SEEQ_CFG2
);
677 outw( SEEQCMD_SET_RX_ON
| SEEQCMD_TX_INT_EN
| SEEQCMD_RX_INT_EN
, SEEQ_CMD
);
681 old_cfg1
= inw(SEEQ_CFG1
);
682 printk("%s: stat = 0x%04x\n",dev
->name
,inw(SEEQ_STATUS
));
683 printk("%s: cfg1 = 0x%04x\n",dev
->name
,old_cfg1
);
684 printk("%s: cfg2 = 0x%04x\n",dev
->name
,inw(SEEQ_CFG2
));
685 printk("%s: raer = 0x%04x\n",dev
->name
,inw(SEEQ_REA
));
686 printk("%s: dmaar= 0x%04x\n",dev
->name
,inw(SEEQ_DMAAR
));
692 static void hardware_send_packet(struct net_device
* dev
, char *buf
, int length
)
694 int ioaddr
= dev
->base_addr
;
695 int status
= inw(SEEQ_STATUS
);
696 int transmit_ptr
= 0;
700 printk("%s: send 0x%04x\n",dev
->name
,length
);
703 /* Set FIFO to writemode and set packet-buffer address */
704 outw( SEEQCMD_FIFO_WRITE
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
705 outw( transmit_ptr
, SEEQ_DMAAR
);
707 /* output SEEQ Packet header barfage */
708 outw( htons(length
+ 4), SEEQ_BUFFER
);
709 outw( SEEQPKTH_XMIT
| SEEQPKTH_DATA_FOLLOWS
| SEEQPKTH_XMIT_INT_EN
, SEEQ_BUFFER
);
711 /* blat the buffer */
712 outsw( SEEQ_BUFFER
, buf
, (length
+1) >> 1);
714 outw( 0, SEEQ_BUFFER
);
715 outw( 0, SEEQ_BUFFER
);
717 /* set address of start of transmit chain */
718 outw( transmit_ptr
, SEEQ_TPR
);
722 while ( (((status
=inw(SEEQ_STATUS
)) & SEEQSTAT_FIFO_EMPTY
) == 0) && time_before(jiffies
, tmp
+ HZ
))
726 outw( SEEQCMD_WINDOW_INT_ACK
| SEEQCMD_SET_TX_ON
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
733 static struct net_device
*dev_seeq
;
734 MODULE_LICENSE("GPL");
735 module_param(io
, int, 0);
736 module_param(irq
, int, 0);
737 MODULE_PARM_DESC(io
, "SEEQ 8005 I/O base address");
738 MODULE_PARM_DESC(irq
, "SEEQ 8005 IRQ number");
740 int __init
init_module(void)
742 dev_seeq
= seeq8005_probe(-1);
743 if (IS_ERR(dev_seeq
))
744 return PTR_ERR(dev_seeq
);
748 void __exit
cleanup_module(void)
750 unregister_netdev(dev_seeq
);
751 release_region(dev_seeq
->base_addr
, SEEQ8005_IO_EXTENT
);
752 free_netdev(dev_seeq
);