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/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>
55 /* First, a few definitions that the brave might change. */
56 /* A zero-terminated list of I/O addresses to be probed. */
57 static unsigned int seeq8005_portlist
[] __initdata
=
58 { 0x300, 0x320, 0x340, 0x360, 0};
60 /* use 0 for production, 1 for verification, >2 for debug */
64 static unsigned int net_debug
= NET_DEBUG
;
66 /* Information that need to be kept for each board. */
68 unsigned short receive_ptr
; /* What address in packet memory do we expect a recv_pkt_header? */
69 long open_time
; /* Useless example local info. */
72 /* The station (ethernet) address prefix, used for IDing the board. */
77 /* Index to functions, as function prototypes. */
79 static int seeq8005_probe1(struct net_device
*dev
, int ioaddr
);
80 static int seeq8005_open(struct net_device
*dev
);
81 static void seeq8005_timeout(struct net_device
*dev
);
82 static netdev_tx_t
seeq8005_send_packet(struct sk_buff
*skb
,
83 struct net_device
*dev
);
84 static irqreturn_t
seeq8005_interrupt(int irq
, void *dev_id
);
85 static void seeq8005_rx(struct net_device
*dev
);
86 static int seeq8005_close(struct net_device
*dev
);
87 static void set_multicast_list(struct net_device
*dev
);
89 /* Example routines you must write ;->. */
90 #define tx_done(dev) (inw(SEEQ_STATUS) & SEEQSTAT_TX_ON)
91 static void hardware_send_packet(struct net_device
*dev
, char *buf
, int length
);
92 extern void seeq8005_init(struct net_device
*dev
, int startp
);
93 static inline void wait_for_buffer(struct net_device
*dev
);
96 /* Check for a network adaptor of this type, and return '0' iff one exists.
97 If dev->base_addr == 0, probe all likely locations.
98 If dev->base_addr == 1, always return failure.
101 static int io
= 0x320;
104 struct net_device
* __init
seeq8005_probe(int unit
)
106 struct net_device
*dev
= alloc_etherdev(sizeof(struct net_local
));
111 return ERR_PTR(-ENODEV
);
114 sprintf(dev
->name
, "eth%d", unit
);
115 netdev_boot_setup_check(dev
);
120 if (io
> 0x1ff) { /* Check a single specified location. */
121 err
= seeq8005_probe1(dev
, io
);
122 } else if (io
!= 0) { /* Don't probe at all. */
125 for (port
= seeq8005_portlist
; *port
; port
++) {
126 if (seeq8005_probe1(dev
, *port
) == 0)
134 err
= register_netdev(dev
);
139 release_region(dev
->base_addr
, SEEQ8005_IO_EXTENT
);
145 static const struct net_device_ops seeq8005_netdev_ops
= {
146 .ndo_open
= seeq8005_open
,
147 .ndo_stop
= seeq8005_close
,
148 .ndo_start_xmit
= seeq8005_send_packet
,
149 .ndo_tx_timeout
= seeq8005_timeout
,
150 .ndo_set_rx_mode
= set_multicast_list
,
151 .ndo_change_mtu
= eth_change_mtu
,
152 .ndo_set_mac_address
= eth_mac_addr
,
153 .ndo_validate_addr
= eth_validate_addr
,
156 /* This is the real probe routine. Linux has a history of friendly device
157 probes on the ISA bus. A good device probes avoids doing writes, and
158 verifies that the correct device exists and functions. */
160 static int __init
seeq8005_probe1(struct net_device
*dev
, int ioaddr
)
162 static unsigned version_printed
;
164 unsigned char SA_prom
[32];
172 if (!request_region(ioaddr
, SEEQ8005_IO_EXTENT
, "seeq8005"))
176 printk("seeq8005: probing at 0x%x\n",ioaddr
);
178 old_stat
= inw(SEEQ_STATUS
); /* read status register */
179 if (old_stat
== 0xffff) {
181 goto out
; /* assume that 0xffff == no device */
183 if ( (old_stat
& 0x1800) != 0x1800 ) { /* assume that unused bits are 1, as my manual says */
185 printk("seeq8005: reserved stat bits != 0x1800\n");
186 printk(" == 0x%04x\n",old_stat
);
192 old_rear
= inw(SEEQ_REA
);
193 if (old_rear
== 0xffff) {
195 if (inw(SEEQ_REA
) == 0xffff) { /* assume that 0xffff == no device */
199 } else if ((old_rear
& 0xff00) != 0xff00) { /* assume that unused bits are 1 */
201 printk("seeq8005: unused rear bits != 0xff00\n");
202 printk(" == 0x%04x\n",old_rear
);
208 old_cfg2
= inw(SEEQ_CFG2
); /* read CFG2 register */
209 old_cfg1
= inw(SEEQ_CFG1
);
210 old_dmaar
= inw(SEEQ_DMAAR
);
213 printk("seeq8005: stat = 0x%04x\n",old_stat
);
214 printk("seeq8005: cfg1 = 0x%04x\n",old_cfg1
);
215 printk("seeq8005: cfg2 = 0x%04x\n",old_cfg2
);
216 printk("seeq8005: raer = 0x%04x\n",old_rear
);
217 printk("seeq8005: dmaar= 0x%04x\n",old_dmaar
);
220 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
); /* setup for reading PROM */
221 outw( 0, SEEQ_DMAAR
); /* set starting PROM address */
222 outw( SEEQCFG1_BUFFER_PROM
, SEEQ_CFG1
); /* set buffer to look at PROM */
226 for(i
=0; i
<32; i
++) {
227 j
+= SA_prom
[i
] = inw(SEEQ_BUFFER
) & 0xff;
231 /* untested because I only have the one card */
232 if ( (j
&0xff) != 0 ) { /* checksum appears to be 8bit = 0 */
233 if (net_debug
>1) { /* check this before deciding that we have a card */
234 printk("seeq8005: prom sum error\n");
236 outw( old_stat
, SEEQ_STATUS
);
237 outw( old_dmaar
, SEEQ_DMAAR
);
238 outw( old_cfg1
, SEEQ_CFG1
);
244 outw( SEEQCFG2_RESET
, SEEQ_CFG2
); /* reset the card */
246 outw( SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
249 printk("seeq8005: prom sum = 0x%08x\n",j
);
250 for(j
=0; j
<32; j
+=16) {
251 printk("seeq8005: prom %02x: ",j
);
253 printk("%02x ",SA_prom
[j
|i
]);
257 if ((SA_prom
[j
|i
]>31)&&(SA_prom
[j
|i
]<127)) {
258 printk("%c", SA_prom
[j
|i
]);
269 * testing the packet buffer memory doesn't work yet
270 * but all other buffer accesses do
271 * - fixing is not a priority
273 if (net_debug
>1) { /* test packet buffer memory */
274 printk("seeq8005: testing packet buffer ... ");
275 outw( SEEQCFG1_BUFFER_BUFFER
, SEEQ_CFG1
);
276 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
277 outw( 0 , SEEQ_DMAAR
);
278 for(i
=0;i
<32768;i
++) {
279 outw(0x5a5a, SEEQ_BUFFER
);
282 while ( ((inw(SEEQ_STATUS
) & SEEQSTAT_FIFO_EMPTY
) != SEEQSTAT_FIFO_EMPTY
) && time_before(jiffies
, j
) )
284 outw( 0 , SEEQ_DMAAR
);
285 while ( ((inw(SEEQ_STATUS
) & SEEQSTAT_WINDOW_INT
) != SEEQSTAT_WINDOW_INT
) && time_before(jiffies
, j
+HZ
))
287 if ( (inw(SEEQ_STATUS
) & SEEQSTAT_WINDOW_INT
) == SEEQSTAT_WINDOW_INT
)
288 outw( SEEQCMD_WINDOW_INT_ACK
| (inw(SEEQ_STATUS
)& SEEQCMD_INT_MASK
), SEEQ_CMD
);
289 outw( SEEQCMD_FIFO_READ
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
291 for(i
=0;i
<32768;i
++) {
292 if (inw(SEEQ_BUFFER
) != 0x5a5a)
303 if (net_debug
&& version_printed
++ == 0)
306 printk("%s: %s found at %#3x, ", dev
->name
, "seeq8005", ioaddr
);
308 /* Fill in the 'dev' fields. */
309 dev
->base_addr
= ioaddr
;
312 /* Retrieve and print the ethernet address. */
313 for (i
= 0; i
< 6; i
++)
314 dev
->dev_addr
[i
] = SA_prom
[i
+6];
315 printk("%pM", dev
->dev_addr
);
317 if (dev
->irq
== 0xff)
318 ; /* Do nothing: a user-level program will set it. */
319 else if (dev
->irq
< 2) { /* "Auto-IRQ" */
320 unsigned long cookie
= probe_irq_on();
322 outw( SEEQCMD_RX_INT_EN
| SEEQCMD_SET_RX_ON
| SEEQCMD_SET_RX_OFF
, SEEQ_CMD
);
324 dev
->irq
= probe_irq_off(cookie
);
327 printk(" autoirq is %d\n", dev
->irq
);
328 } else if (dev
->irq
== 2)
329 /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
330 * or don't know which one to set.
336 int irqval
= request_irq(dev
->irq
, seeq8005_interrupt
, 0, "seeq8005", dev
);
338 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev
->name
,
345 dev
->netdev_ops
= &seeq8005_netdev_ops
;
346 dev
->watchdog_timeo
= HZ
/20;
347 dev
->flags
&= ~IFF_MULTICAST
;
351 release_region(ioaddr
, SEEQ8005_IO_EXTENT
);
356 /* Open/initialize the board. This is called (in the current kernel)
357 sometime after booting when the 'ifconfig' program is run.
359 This routine should set everything up anew at each open, even
360 registers that "should" only need to be set once at boot, so that
361 there is non-reboot way to recover if something goes wrong.
363 static int seeq8005_open(struct net_device
*dev
)
365 struct net_local
*lp
= netdev_priv(dev
);
368 int irqval
= request_irq(dev
->irq
, seeq8005_interrupt
, 0, "seeq8005", dev
);
370 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev
->name
,
376 /* Reset the hardware here. Don't forget to set the station address. */
377 seeq8005_init(dev
, 1);
379 lp
->open_time
= jiffies
;
381 netif_start_queue(dev
);
385 static void seeq8005_timeout(struct net_device
*dev
)
387 int ioaddr
= dev
->base_addr
;
388 printk(KERN_WARNING
"%s: transmit timed out, %s?\n", dev
->name
,
389 tx_done(dev
) ? "IRQ conflict" : "network cable problem");
390 /* Try to restart the adaptor. */
391 seeq8005_init(dev
, 1);
392 dev
->trans_start
= jiffies
; /* prevent tx timeout */
393 netif_wake_queue(dev
);
396 static netdev_tx_t
seeq8005_send_packet(struct sk_buff
*skb
,
397 struct net_device
*dev
)
399 short length
= skb
->len
;
402 if (length
< ETH_ZLEN
) {
403 if (skb_padto(skb
, ETH_ZLEN
))
409 /* Block a timer-based transmit from overlapping */
410 netif_stop_queue(dev
);
412 hardware_send_packet(dev
, buf
, length
);
413 dev
->stats
.tx_bytes
+= length
;
415 /* You might need to clean up and record Tx statistics here. */
423 * This routine waits for the SEEQ chip to assert that the FIFO is ready
424 * by checking for a window interrupt, and then clearing it. This has to
425 * occur in the interrupt handler!
427 inline void wait_for_buffer(struct net_device
* dev
)
429 int ioaddr
= dev
->base_addr
;
434 while ( ( ((status
=inw(SEEQ_STATUS
)) & SEEQSTAT_WINDOW_INT
) != SEEQSTAT_WINDOW_INT
) && time_before(jiffies
, tmp
))
437 if ( (status
& SEEQSTAT_WINDOW_INT
) == SEEQSTAT_WINDOW_INT
)
438 outw( SEEQCMD_WINDOW_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
441 /* The typical workload of the driver:
442 Handle the network interface interrupts. */
443 static irqreturn_t
seeq8005_interrupt(int irq
, void *dev_id
)
445 struct net_device
*dev
= dev_id
;
446 struct net_local
*lp
;
447 int ioaddr
, status
, boguscount
= 0;
450 ioaddr
= dev
->base_addr
;
451 lp
= netdev_priv(dev
);
453 status
= inw(SEEQ_STATUS
);
456 printk("%s: int, status=0x%04x\n",dev
->name
,status
);
459 if (status
& SEEQSTAT_WINDOW_INT
) {
461 outw( SEEQCMD_WINDOW_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
463 printk("%s: window int!\n",dev
->name
);
466 if (status
& SEEQSTAT_TX_INT
) {
468 outw( SEEQCMD_TX_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
469 dev
->stats
.tx_packets
++;
470 netif_wake_queue(dev
); /* Inform upper layers. */
472 if (status
& SEEQSTAT_RX_INT
) {
474 /* Got a packet(s). */
477 status
= inw(SEEQ_STATUS
);
478 } while ( (++boguscount
< 10) && (status
& SEEQSTAT_ANY_INT
)) ;
481 printk("%s: eoi\n",dev
->name
);
483 return IRQ_RETVAL(handled
);
486 /* We have a good packet(s), get it/them out of the buffers. */
487 static void seeq8005_rx(struct net_device
*dev
)
489 struct net_local
*lp
= netdev_priv(dev
);
492 int ioaddr
= dev
->base_addr
;
500 status
= inw(SEEQ_STATUS
);
501 outw( lp
->receive_ptr
, SEEQ_DMAAR
);
502 outw(SEEQCMD_FIFO_READ
| SEEQCMD_RX_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
503 wait_for_buffer(dev
);
504 next_packet
= ntohs(inw(SEEQ_BUFFER
));
505 pkt_hdr
= inw(SEEQ_BUFFER
);
508 printk("%s: 0x%04x recv next=0x%04x, hdr=0x%04x\n",dev
->name
,lp
->receive_ptr
,next_packet
,pkt_hdr
);
511 if ((next_packet
== 0) || ((pkt_hdr
& SEEQPKTH_CHAIN
)==0)) { /* Read all the frames? */
512 return; /* Done for now */
515 if ((pkt_hdr
& SEEQPKTS_DONE
)==0)
518 if (next_packet
< lp
->receive_ptr
) {
519 pkt_len
= (next_packet
+ 0x10000 - ((DEFAULT_TEA
+1)<<8)) - lp
->receive_ptr
- 4;
521 pkt_len
= next_packet
- lp
->receive_ptr
- 4;
524 if (next_packet
< ((DEFAULT_TEA
+1)<<8)) { /* is the next_packet address sane? */
525 printk("%s: recv packet ring corrupt, resetting board\n",dev
->name
);
526 seeq8005_init(dev
,1);
530 lp
->receive_ptr
= next_packet
;
533 printk("%s: recv len=0x%04x\n",dev
->name
,pkt_len
);
536 if (pkt_hdr
& SEEQPKTS_ANY_ERROR
) { /* There was an error. */
537 dev
->stats
.rx_errors
++;
538 if (pkt_hdr
& SEEQPKTS_SHORT
) dev
->stats
.rx_frame_errors
++;
539 if (pkt_hdr
& SEEQPKTS_DRIB
) dev
->stats
.rx_frame_errors
++;
540 if (pkt_hdr
& SEEQPKTS_OVERSIZE
) dev
->stats
.rx_over_errors
++;
541 if (pkt_hdr
& SEEQPKTS_CRC_ERR
) dev
->stats
.rx_crc_errors
++;
542 /* skip over this packet */
543 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_DMA_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
544 outw( (lp
->receive_ptr
& 0xff00)>>8, SEEQ_REA
);
546 /* Malloc up new buffer. */
550 skb
= netdev_alloc_skb(dev
, pkt_len
);
552 printk("%s: Memory squeeze, dropping packet.\n", dev
->name
);
553 dev
->stats
.rx_dropped
++;
556 skb_reserve(skb
, 2); /* align data on 16 byte */
557 buf
= skb_put(skb
,pkt_len
);
559 insw(SEEQ_BUFFER
, buf
, (pkt_len
+ 1) >> 1);
563 printk("%s: recv ",dev
->name
);
565 printk("%02x ",*(p
++)&0xff);
570 skb
->protocol
=eth_type_trans(skb
,dev
);
572 dev
->stats
.rx_packets
++;
573 dev
->stats
.rx_bytes
+= pkt_len
;
575 } while ((--boguscount
) && (pkt_hdr
& SEEQPKTH_CHAIN
));
577 /* If any worth-while packets have been received, netif_rx()
578 has done a mark_bh(NET_BH) for us and will work on them
579 when we get to the bottom-half routine. */
582 /* The inverse routine to net_open(). */
583 static int seeq8005_close(struct net_device
*dev
)
585 struct net_local
*lp
= netdev_priv(dev
);
586 int ioaddr
= dev
->base_addr
;
590 netif_stop_queue(dev
);
592 /* Flush the Tx and disable Rx here. */
593 outw( SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
595 free_irq(dev
->irq
, dev
);
597 /* Update the statistics here. */
603 /* Set or clear the multicast filter for this adaptor.
604 num_addrs == -1 Promiscuous mode, receive all packets
605 num_addrs == 0 Normal mode, clear multicast list
606 num_addrs > 0 Multicast mode, receive normal and MC packets, and do
607 best-effort filtering.
609 static void set_multicast_list(struct net_device
*dev
)
612 * I _could_ do up to 6 addresses here, but won't (yet?)
616 int ioaddr
= dev
->base_addr
;
618 * hmm, not even sure if my matching works _anyway_ - seem to be receiving
622 if (num_addrs
) { /* Enable promiscuous mode */
623 outw( (inw(SEEQ_CFG1
) & ~SEEQCFG1_MATCH_MASK
)| SEEQCFG1_MATCH_ALL
, SEEQ_CFG1
);
624 dev
->flags
|=IFF_PROMISC
;
625 } else { /* Disable promiscuous mode, use normal mode */
626 outw( (inw(SEEQ_CFG1
) & ~SEEQCFG1_MATCH_MASK
)| SEEQCFG1_MATCH_BROAD
, SEEQ_CFG1
);
631 void seeq8005_init(struct net_device
*dev
, int startp
)
633 struct net_local
*lp
= netdev_priv(dev
);
634 int ioaddr
= dev
->base_addr
;
637 outw(SEEQCFG2_RESET
, SEEQ_CFG2
); /* reset device */
640 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
641 outw( 0, SEEQ_DMAAR
); /* load start address into both low and high byte */
642 /* wait_for_buffer(dev); */ /* I think that you only need a wait for memory buffer */
643 outw( SEEQCFG1_BUFFER_MAC0
, SEEQ_CFG1
);
645 for(i
=0;i
<6;i
++) { /* set Station address */
646 outb(dev
->dev_addr
[i
], SEEQ_BUFFER
);
650 outw( SEEQCFG1_BUFFER_TEA
, SEEQ_CFG1
); /* set xmit end area pointer to 16K */
651 outb( DEFAULT_TEA
, SEEQ_BUFFER
); /* this gives us 16K of send buffer and 48K of recv buffer */
653 lp
->receive_ptr
= (DEFAULT_TEA
+1)<<8; /* so we can find our packet_header */
654 outw( lp
->receive_ptr
, SEEQ_RPR
); /* Receive Pointer Register is set to recv buffer memory */
656 outw( 0x00ff, SEEQ_REA
); /* Receive Area End */
659 printk("%s: SA0 = ",dev
->name
);
661 outw( SEEQCMD_FIFO_READ
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
662 outw( 0, SEEQ_DMAAR
);
663 outw( SEEQCFG1_BUFFER_MAC0
, SEEQ_CFG1
);
666 printk("%02x ",inb(SEEQ_BUFFER
));
671 outw( SEEQCFG1_MAC0_EN
| SEEQCFG1_MATCH_BROAD
| SEEQCFG1_BUFFER_BUFFER
, SEEQ_CFG1
);
672 outw( SEEQCFG2_AUTO_REA
| SEEQCFG2_CTRLO
, SEEQ_CFG2
);
673 outw( SEEQCMD_SET_RX_ON
| SEEQCMD_TX_INT_EN
| SEEQCMD_RX_INT_EN
, SEEQ_CMD
);
677 old_cfg1
= inw(SEEQ_CFG1
);
678 printk("%s: stat = 0x%04x\n",dev
->name
,inw(SEEQ_STATUS
));
679 printk("%s: cfg1 = 0x%04x\n",dev
->name
,old_cfg1
);
680 printk("%s: cfg2 = 0x%04x\n",dev
->name
,inw(SEEQ_CFG2
));
681 printk("%s: raer = 0x%04x\n",dev
->name
,inw(SEEQ_REA
));
682 printk("%s: dmaar= 0x%04x\n",dev
->name
,inw(SEEQ_DMAAR
));
688 static void hardware_send_packet(struct net_device
* dev
, char *buf
, int length
)
690 int ioaddr
= dev
->base_addr
;
691 int status
= inw(SEEQ_STATUS
);
692 int transmit_ptr
= 0;
696 printk("%s: send 0x%04x\n",dev
->name
,length
);
699 /* Set FIFO to writemode and set packet-buffer address */
700 outw( SEEQCMD_FIFO_WRITE
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
701 outw( transmit_ptr
, SEEQ_DMAAR
);
703 /* output SEEQ Packet header barfage */
704 outw( htons(length
+ 4), SEEQ_BUFFER
);
705 outw( SEEQPKTH_XMIT
| SEEQPKTH_DATA_FOLLOWS
| SEEQPKTH_XMIT_INT_EN
, SEEQ_BUFFER
);
707 /* blat the buffer */
708 outsw( SEEQ_BUFFER
, buf
, (length
+1) >> 1);
710 outw( 0, SEEQ_BUFFER
);
711 outw( 0, SEEQ_BUFFER
);
713 /* set address of start of transmit chain */
714 outw( transmit_ptr
, SEEQ_TPR
);
718 while ( (((status
=inw(SEEQ_STATUS
)) & SEEQSTAT_FIFO_EMPTY
) == 0) && time_before(jiffies
, tmp
+ HZ
))
722 outw( SEEQCMD_WINDOW_INT_ACK
| SEEQCMD_SET_TX_ON
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
729 static struct net_device
*dev_seeq
;
730 MODULE_LICENSE("GPL");
731 module_param(io
, int, 0);
732 module_param(irq
, int, 0);
733 MODULE_PARM_DESC(io
, "SEEQ 8005 I/O base address");
734 MODULE_PARM_DESC(irq
, "SEEQ 8005 IRQ number");
736 int __init
init_module(void)
738 dev_seeq
= seeq8005_probe(-1);
739 if (IS_ERR(dev_seeq
))
740 return PTR_ERR(dev_seeq
);
744 void __exit
cleanup_module(void)
746 unregister_netdev(dev_seeq
);
747 release_region(dev_seeq
->base_addr
, SEEQ8005_IO_EXTENT
);
748 free_netdev(dev_seeq
);