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 int seeq8005_send_packet(struct sk_buff
*skb
, struct net_device
*dev
);
85 static irqreturn_t
seeq8005_interrupt(int irq
, void *dev_id
);
86 static void seeq8005_rx(struct net_device
*dev
);
87 static int seeq8005_close(struct net_device
*dev
);
88 static void set_multicast_list(struct net_device
*dev
);
90 /* Example routines you must write ;->. */
91 #define tx_done(dev) (inw(SEEQ_STATUS) & SEEQSTAT_TX_ON)
92 static void hardware_send_packet(struct net_device
*dev
, char *buf
, int length
);
93 extern void seeq8005_init(struct net_device
*dev
, int startp
);
94 static inline void wait_for_buffer(struct net_device
*dev
);
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.
102 static int io
= 0x320;
105 struct net_device
* __init
seeq8005_probe(int unit
)
107 struct net_device
*dev
= alloc_etherdev(sizeof(struct net_local
));
112 return ERR_PTR(-ENODEV
);
115 sprintf(dev
->name
, "eth%d", unit
);
116 netdev_boot_setup_check(dev
);
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. */
126 for (port
= seeq8005_portlist
; *port
; port
++) {
127 if (seeq8005_probe1(dev
, *port
) == 0)
135 err
= register_netdev(dev
);
140 release_region(dev
->base_addr
, SEEQ8005_IO_EXTENT
);
146 static 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
,
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. */
161 static int __init
seeq8005_probe1(struct net_device
*dev
, int ioaddr
)
163 static unsigned version_printed
;
165 unsigned char SA_prom
[32];
173 if (!request_region(ioaddr
, SEEQ8005_IO_EXTENT
, "seeq8005"))
177 printk("seeq8005: probing at 0x%x\n",ioaddr
);
179 old_stat
= inw(SEEQ_STATUS
); /* read status register */
180 if (old_stat
== 0xffff) {
182 goto out
; /* assume that 0xffff == no device */
184 if ( (old_stat
& 0x1800) != 0x1800 ) { /* assume that unused bits are 1, as my manual says */
186 printk("seeq8005: reserved stat bits != 0x1800\n");
187 printk(" == 0x%04x\n",old_stat
);
193 old_rear
= inw(SEEQ_REA
);
194 if (old_rear
== 0xffff) {
196 if (inw(SEEQ_REA
) == 0xffff) { /* assume that 0xffff == no device */
200 } else if ((old_rear
& 0xff00) != 0xff00) { /* assume that unused bits are 1 */
202 printk("seeq8005: unused rear bits != 0xff00\n");
203 printk(" == 0x%04x\n",old_rear
);
209 old_cfg2
= inw(SEEQ_CFG2
); /* read CFG2 register */
210 old_cfg1
= inw(SEEQ_CFG1
);
211 old_dmaar
= inw(SEEQ_DMAAR
);
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
);
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 */
227 for(i
=0; i
<32; i
++) {
228 j
+= SA_prom
[i
] = inw(SEEQ_BUFFER
) & 0xff;
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");
237 outw( old_stat
, SEEQ_STATUS
);
238 outw( old_dmaar
, SEEQ_DMAAR
);
239 outw( old_cfg1
, SEEQ_CFG1
);
245 outw( SEEQCFG2_RESET
, SEEQ_CFG2
); /* reset the card */
247 outw( SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
250 printk("seeq8005: prom sum = 0x%08x\n",j
);
251 for(j
=0; j
<32; j
+=16) {
252 printk("seeq8005: prom %02x: ",j
);
254 printk("%02x ",SA_prom
[j
|i
]);
258 if ((SA_prom
[j
|i
]>31)&&(SA_prom
[j
|i
]<127)) {
259 printk("%c", SA_prom
[j
|i
]);
270 * testing the packet buffer memory doesn't work yet
271 * but all other buffer accesses do
272 * - fixing is not a priority
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
);
283 while ( ((inw(SEEQ_STATUS
) & SEEQSTAT_FIFO_EMPTY
) != SEEQSTAT_FIFO_EMPTY
) && time_before(jiffies
, j
) )
285 outw( 0 , SEEQ_DMAAR
);
286 while ( ((inw(SEEQ_STATUS
) & SEEQSTAT_WINDOW_INT
) != SEEQSTAT_WINDOW_INT
) && time_before(jiffies
, j
+HZ
))
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
);
292 for(i
=0;i
<32768;i
++) {
293 if (inw(SEEQ_BUFFER
) != 0x5a5a)
304 if (net_debug
&& version_printed
++ == 0)
307 printk("%s: %s found at %#3x, ", dev
->name
, "seeq8005", ioaddr
);
309 /* Fill in the 'dev' fields. */
310 dev
->base_addr
= ioaddr
;
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
);
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();
323 outw( SEEQCMD_RX_INT_EN
| SEEQCMD_SET_RX_ON
| SEEQCMD_SET_RX_OFF
, SEEQ_CMD
);
325 dev
->irq
= probe_irq_off(cookie
);
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.
337 int irqval
= request_irq(dev
->irq
, &seeq8005_interrupt
, 0, "seeq8005", dev
);
339 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev
->name
,
346 dev
->netdev_ops
= &seeq8005_netdev_ops
;
347 dev
->watchdog_timeo
= HZ
/20;
348 dev
->flags
&= ~IFF_MULTICAST
;
352 release_region(ioaddr
, SEEQ8005_IO_EXTENT
);
357 /* Open/initialize the board. This is called (in the current kernel)
358 sometime after booting when the 'ifconfig' program is run.
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.
364 static int seeq8005_open(struct net_device
*dev
)
366 struct net_local
*lp
= netdev_priv(dev
);
369 int irqval
= request_irq(dev
->irq
, &seeq8005_interrupt
, 0, "seeq8005", dev
);
371 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev
->name
,
377 /* Reset the hardware here. Don't forget to set the station address. */
378 seeq8005_init(dev
, 1);
380 lp
->open_time
= jiffies
;
382 netif_start_queue(dev
);
386 static void seeq8005_timeout(struct net_device
*dev
)
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
;
394 netif_wake_queue(dev
);
397 static int seeq8005_send_packet(struct sk_buff
*skb
, 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
->trans_start
= jiffies
;
414 dev
->stats
.tx_bytes
+= length
;
416 /* You might need to clean up and record Tx statistics here. */
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!
428 inline void wait_for_buffer(struct net_device
* dev
)
430 int ioaddr
= dev
->base_addr
;
435 while ( ( ((status
=inw(SEEQ_STATUS
)) & SEEQSTAT_WINDOW_INT
) != SEEQSTAT_WINDOW_INT
) && time_before(jiffies
, tmp
))
438 if ( (status
& SEEQSTAT_WINDOW_INT
) == SEEQSTAT_WINDOW_INT
)
439 outw( SEEQCMD_WINDOW_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
442 /* The typical workload of the driver:
443 Handle the network interface interrupts. */
444 static irqreturn_t
seeq8005_interrupt(int irq
, void *dev_id
)
446 struct net_device
*dev
= dev_id
;
447 struct net_local
*lp
;
448 int ioaddr
, status
, boguscount
= 0;
451 ioaddr
= dev
->base_addr
;
452 lp
= netdev_priv(dev
);
454 status
= inw(SEEQ_STATUS
);
457 printk("%s: int, status=0x%04x\n",dev
->name
,status
);
460 if (status
& SEEQSTAT_WINDOW_INT
) {
462 outw( SEEQCMD_WINDOW_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
464 printk("%s: window int!\n",dev
->name
);
467 if (status
& SEEQSTAT_TX_INT
) {
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. */
473 if (status
& SEEQSTAT_RX_INT
) {
475 /* Got a packet(s). */
478 status
= inw(SEEQ_STATUS
);
479 } while ( (++boguscount
< 10) && (status
& SEEQSTAT_ANY_INT
)) ;
482 printk("%s: eoi\n",dev
->name
);
484 return IRQ_RETVAL(handled
);
487 /* We have a good packet(s), get it/them out of the buffers. */
488 static void seeq8005_rx(struct net_device
*dev
)
490 struct net_local
*lp
= netdev_priv(dev
);
493 int ioaddr
= dev
->base_addr
;
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
);
509 printk("%s: 0x%04x recv next=0x%04x, hdr=0x%04x\n",dev
->name
,lp
->receive_ptr
,next_packet
,pkt_hdr
);
512 if ((next_packet
== 0) || ((pkt_hdr
& SEEQPKTH_CHAIN
)==0)) { /* Read all the frames? */
513 return; /* Done for now */
516 if ((pkt_hdr
& SEEQPKTS_DONE
)==0)
519 if (next_packet
< lp
->receive_ptr
) {
520 pkt_len
= (next_packet
+ 0x10000 - ((DEFAULT_TEA
+1)<<8)) - lp
->receive_ptr
- 4;
522 pkt_len
= next_packet
- lp
->receive_ptr
- 4;
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);
531 lp
->receive_ptr
= next_packet
;
534 printk("%s: recv len=0x%04x\n",dev
->name
,pkt_len
);
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
);
547 /* Malloc up new buffer. */
551 skb
= dev_alloc_skb(pkt_len
);
553 printk("%s: Memory squeeze, dropping packet.\n", dev
->name
);
554 dev
->stats
.rx_dropped
++;
557 skb_reserve(skb
, 2); /* align data on 16 byte */
558 buf
= skb_put(skb
,pkt_len
);
560 insw(SEEQ_BUFFER
, buf
, (pkt_len
+ 1) >> 1);
564 printk("%s: recv ",dev
->name
);
566 printk("%02x ",*(p
++)&0xff);
571 skb
->protocol
=eth_type_trans(skb
,dev
);
573 dev
->stats
.rx_packets
++;
574 dev
->stats
.rx_bytes
+= pkt_len
;
576 } while ((--boguscount
) && (pkt_hdr
& SEEQPKTH_CHAIN
));
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. */
584 /* The inverse routine to net_open(). */
585 static int seeq8005_close(struct net_device
*dev
)
587 struct net_local
*lp
= netdev_priv(dev
);
588 int ioaddr
= dev
->base_addr
;
592 netif_stop_queue(dev
);
594 /* Flush the Tx and disable Rx here. */
595 outw( SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
597 free_irq(dev
->irq
, dev
);
599 /* Update the statistics here. */
605 /* Set or clear the multicast filter for this adaptor.
606 num_addrs == -1 Promiscuous mode, receive all packets
607 num_addrs == 0 Normal mode, clear multicast list
608 num_addrs > 0 Multicast mode, receive normal and MC packets, and do
609 best-effort filtering.
611 static void set_multicast_list(struct net_device
*dev
)
614 * I _could_ do up to 6 addresses here, but won't (yet?)
618 int ioaddr
= dev
->base_addr
;
620 * hmm, not even sure if my matching works _anyway_ - seem to be receiving
624 if (num_addrs
) { /* Enable promiscuous mode */
625 outw( (inw(SEEQ_CFG1
) & ~SEEQCFG1_MATCH_MASK
)| SEEQCFG1_MATCH_ALL
, SEEQ_CFG1
);
626 dev
->flags
|=IFF_PROMISC
;
627 } else { /* Disable promiscuous mode, use normal mode */
628 outw( (inw(SEEQ_CFG1
) & ~SEEQCFG1_MATCH_MASK
)| SEEQCFG1_MATCH_BROAD
, SEEQ_CFG1
);
633 void seeq8005_init(struct net_device
*dev
, int startp
)
635 struct net_local
*lp
= netdev_priv(dev
);
636 int ioaddr
= dev
->base_addr
;
639 outw(SEEQCFG2_RESET
, SEEQ_CFG2
); /* reset device */
642 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
643 outw( 0, SEEQ_DMAAR
); /* load start address into both low and high byte */
644 /* wait_for_buffer(dev); */ /* I think that you only need a wait for memory buffer */
645 outw( SEEQCFG1_BUFFER_MAC0
, SEEQ_CFG1
);
647 for(i
=0;i
<6;i
++) { /* set Station address */
648 outb(dev
->dev_addr
[i
], SEEQ_BUFFER
);
652 outw( SEEQCFG1_BUFFER_TEA
, SEEQ_CFG1
); /* set xmit end area pointer to 16K */
653 outb( DEFAULT_TEA
, SEEQ_BUFFER
); /* this gives us 16K of send buffer and 48K of recv buffer */
655 lp
->receive_ptr
= (DEFAULT_TEA
+1)<<8; /* so we can find our packet_header */
656 outw( lp
->receive_ptr
, SEEQ_RPR
); /* Receive Pointer Register is set to recv buffer memory */
658 outw( 0x00ff, SEEQ_REA
); /* Receive Area End */
661 printk("%s: SA0 = ",dev
->name
);
663 outw( SEEQCMD_FIFO_READ
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
664 outw( 0, SEEQ_DMAAR
);
665 outw( SEEQCFG1_BUFFER_MAC0
, SEEQ_CFG1
);
668 printk("%02x ",inb(SEEQ_BUFFER
));
673 outw( SEEQCFG1_MAC0_EN
| SEEQCFG1_MATCH_BROAD
| SEEQCFG1_BUFFER_BUFFER
, SEEQ_CFG1
);
674 outw( SEEQCFG2_AUTO_REA
| SEEQCFG2_CTRLO
, SEEQ_CFG2
);
675 outw( SEEQCMD_SET_RX_ON
| SEEQCMD_TX_INT_EN
| SEEQCMD_RX_INT_EN
, SEEQ_CMD
);
679 old_cfg1
= inw(SEEQ_CFG1
);
680 printk("%s: stat = 0x%04x\n",dev
->name
,inw(SEEQ_STATUS
));
681 printk("%s: cfg1 = 0x%04x\n",dev
->name
,old_cfg1
);
682 printk("%s: cfg2 = 0x%04x\n",dev
->name
,inw(SEEQ_CFG2
));
683 printk("%s: raer = 0x%04x\n",dev
->name
,inw(SEEQ_REA
));
684 printk("%s: dmaar= 0x%04x\n",dev
->name
,inw(SEEQ_DMAAR
));
690 static void hardware_send_packet(struct net_device
* dev
, char *buf
, int length
)
692 int ioaddr
= dev
->base_addr
;
693 int status
= inw(SEEQ_STATUS
);
694 int transmit_ptr
= 0;
698 printk("%s: send 0x%04x\n",dev
->name
,length
);
701 /* Set FIFO to writemode and set packet-buffer address */
702 outw( SEEQCMD_FIFO_WRITE
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
703 outw( transmit_ptr
, SEEQ_DMAAR
);
705 /* output SEEQ Packet header barfage */
706 outw( htons(length
+ 4), SEEQ_BUFFER
);
707 outw( SEEQPKTH_XMIT
| SEEQPKTH_DATA_FOLLOWS
| SEEQPKTH_XMIT_INT_EN
, SEEQ_BUFFER
);
709 /* blat the buffer */
710 outsw( SEEQ_BUFFER
, buf
, (length
+1) >> 1);
712 outw( 0, SEEQ_BUFFER
);
713 outw( 0, SEEQ_BUFFER
);
715 /* set address of start of transmit chain */
716 outw( transmit_ptr
, SEEQ_TPR
);
720 while ( (((status
=inw(SEEQ_STATUS
)) & SEEQSTAT_FIFO_EMPTY
) == 0) && time_before(jiffies
, tmp
+ HZ
))
724 outw( SEEQCMD_WINDOW_INT_ACK
| SEEQCMD_SET_TX_ON
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
731 static struct net_device
*dev_seeq
;
732 MODULE_LICENSE("GPL");
733 module_param(io
, int, 0);
734 module_param(irq
, int, 0);
735 MODULE_PARM_DESC(io
, "SEEQ 8005 I/O base address");
736 MODULE_PARM_DESC(irq
, "SEEQ 8005 IRQ number");
738 int __init
init_module(void)
740 dev_seeq
= seeq8005_probe(-1);
741 if (IS_ERR(dev_seeq
))
742 return PTR_ERR(dev_seeq
);
746 void __exit
cleanup_module(void)
748 unregister_netdev(dev_seeq
);
749 release_region(dev_seeq
->base_addr
, SEEQ8005_IO_EXTENT
);
750 free_netdev(dev_seeq
);