This source file includes following definitions.
- el16_probe
- el16_probe1
- el16_open
- el16_send_packet
- el16_interrupt
- el16_close
- el16_get_stats
- init_rx_bufs
- init_82586_mem
- hardware_send_packet
- el16_rx
- init_module
- cleanup_module
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 static const char *version =
27 "3c507.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
28
29
30 #ifdef MODULE
31 #include <linux/module.h>
32 #include <linux/version.h>
33 #endif
34
35 #include <linux/config.h>
36
37
38
39
40
41
42
43
44
45
46
47
48 #include <linux/kernel.h>
49 #include <linux/sched.h>
50 #include <linux/types.h>
51 #include <linux/fcntl.h>
52 #include <linux/interrupt.h>
53 #include <linux/ptrace.h>
54 #include <linux/ioport.h>
55 #include <linux/in.h>
56 #include <linux/string.h>
57 #include <asm/system.h>
58 #include <asm/bitops.h>
59 #include <asm/io.h>
60 #include <asm/dma.h>
61 #include <linux/errno.h>
62
63 #include <linux/netdevice.h>
64 #include <linux/etherdevice.h>
65 #include <linux/skbuff.h>
66 #include <linux/malloc.h>
67
68
69
70 #ifndef NET_DEBUG
71 #define NET_DEBUG 1
72 #endif
73 static unsigned int net_debug = NET_DEBUG;
74
75
76 static unsigned int netcard_portlist[] =
77 { 0x300, 0x320, 0x340, 0x280, 0};
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 #define CUC_START 0x0100
95 #define CUC_RESUME 0x0200
96 #define CUC_SUSPEND 0x0300
97 #define RX_START 0x0010
98 #define RX_RESUME 0x0020
99 #define RX_SUSPEND 0x0030
100
101
102
103
104
105
106
107
108
109
110
111
112
113 #define CMD_EOL 0x8000
114 #define CMD_SUSP 0x4000
115 #define CMD_INTR 0x2000
116
117 enum commands {
118 CmdNOp = 0, CmdSASetup = 1, CmdConfigure = 2, CmdMulticastList = 3,
119 CmdTx = 4, CmdTDR = 5, CmdDump = 6, CmdDiagnose = 7};
120
121
122 struct net_local {
123 struct enet_statistics stats;
124 int last_restart;
125 ushort rx_head;
126 ushort rx_tail;
127 ushort tx_head;
128 ushort tx_cmd_link;
129 ushort tx_reap;
130 };
131
132
133
134
135
136
137
138
139
140 #define SA_DATA 0
141 #define MISC_CTRL 6
142 #define RESET_IRQ 10
143 #define SIGNAL_CA 11
144 #define ROM_CONFIG 13
145 #define MEM_CONFIG 14
146 #define IRQ_CONFIG 15
147 #define EL16_IO_EXTENT 16
148
149
150 #define ID_PORT 0x100
151
152
153 #define iSCB_STATUS 0x8
154 #define iSCB_CMD 0xA
155 #define iSCB_CBL 0xC
156 #define iSCB_RFA 0xE
157
158
159
160
161
162
163
164
165
166
167 #define SCB_BASE ((unsigned)64*1024 - (dev->mem_end - dev->mem_start))
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185 #define CONFIG_CMD 0x0018
186 #define SET_SA_CMD 0x0024
187 #define SA_OFFSET 0x002A
188 #define IDLELOOP 0x30
189 #define TDR_CMD 0x38
190 #define TDR_TIME 0x3C
191 #define DUMP_CMD 0x40
192 #define DIAG_CMD 0x48
193 #define SET_MC_CMD 0x4E
194 #define DUMP_DATA 0x56
195
196 #define TX_BUF_START 0x0100
197 #define NUM_TX_BUFS 4
198 #define TX_BUF_SIZE (1518+14+20+16)
199
200 #define RX_BUF_START 0x2000
201 #define RX_BUF_SIZE (1518+14+18)
202 #define RX_BUF_END (dev->mem_end - dev->mem_start)
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237 unsigned short init_words[] = {
238
239 0x0000,
240 0,0,
241 0x0000,0x0000,
242
243
244 0x0001,
245 0x0008,0,0,
246
247
248 0,0xf000|RX_START|CUC_START,
249 CONFIG_CMD,
250 RX_BUF_START,
251 0,0,0,0,
252
253
254 0, CmdConfigure,
255 SET_SA_CMD,
256 0x0804,
257 0x2e40,
258 0,
259
260
261 0, CmdSASetup,
262 SET_MC_CMD,
263 0xaa00,0xb000,0x0bad,
264
265
266 0, CmdNOp, IDLELOOP, 0 ,
267
268
269 0, CmdTDR, IDLELOOP, 0,
270
271
272 0, CmdDump, IDLELOOP, DUMP_DATA,
273
274
275 0, CmdDiagnose, IDLELOOP,
276
277
278 0, CmdMulticastList, IDLELOOP, 0,
279 };
280
281
282
283 extern int el16_probe(struct device *dev);
284
285 static int el16_probe1(struct device *dev, int ioaddr);
286 static int el16_open(struct device *dev);
287 static int el16_send_packet(struct sk_buff *skb, struct device *dev);
288 static void el16_interrupt(int irq, struct pt_regs *regs);
289 static void el16_rx(struct device *dev);
290 static int el16_close(struct device *dev);
291 static struct enet_statistics *el16_get_stats(struct device *dev);
292
293 static void hardware_send_packet(struct device *dev, void *buf, short length);
294 void init_82586_mem(struct device *dev);
295
296
297 #ifdef HAVE_DEVLIST
298 struct netdev_entry netcard_drv =
299 {"3c507", el16_probe1, EL16_IO_EXTENT, netcard_portlist};
300 #endif
301
302
303
304
305
306
307
308 int
309 el16_probe(struct device *dev)
310 {
311 int base_addr = dev ? dev->base_addr : 0;
312 int i;
313
314 if (base_addr > 0x1ff)
315 return el16_probe1(dev, base_addr);
316 else if (base_addr != 0)
317 return ENXIO;
318
319 for (i = 0; netcard_portlist[i]; i++) {
320 int ioaddr = netcard_portlist[i];
321 if (check_region(ioaddr, EL16_IO_EXTENT))
322 continue;
323 if (el16_probe1(dev, ioaddr) == 0)
324 return 0;
325 }
326
327 return ENODEV;
328 }
329
330 int el16_probe1(struct device *dev, int ioaddr)
331 {
332 static unsigned char init_ID_done = 0, version_printed = 0;
333 int i, irq, irqval;
334
335 if (init_ID_done == 0) {
336 ushort lrs_state = 0xff;
337
338 outb(0x00, ID_PORT);
339 for(i = 0; i < 255; i++) {
340 outb(lrs_state, ID_PORT);
341 lrs_state <<= 1;
342 if (lrs_state & 0x100)
343 lrs_state ^= 0xe7;
344 }
345 outb(0x00, ID_PORT);
346 init_ID_done = 1;
347 }
348
349 if (inb(ioaddr) == '*' && inb(ioaddr+1) == '3'
350 && inb(ioaddr+2) == 'C' && inb(ioaddr+3) == 'O')
351 ;
352 else
353 return ENODEV;
354
355
356 if (dev == NULL)
357 dev = init_etherdev(0, sizeof(struct net_local), 0);
358
359 if (net_debug && version_printed++ == 0)
360 printk(version);
361
362 printk("%s: 3c507 at %#x,", dev->name, ioaddr);
363
364
365
366
367 irq = inb(ioaddr + IRQ_CONFIG) & 0x0f;
368
369 irqval = request_irq(irq, &el16_interrupt, 0, "3c507");
370 if (irqval) {
371 printk ("unable to get IRQ %d (irqval=%d).\n", irq, irqval);
372 return EAGAIN;
373 }
374
375
376 request_region(ioaddr, EL16_IO_EXTENT, "3c507");
377 dev->base_addr = ioaddr;
378
379 outb(0x01, ioaddr + MISC_CTRL);
380 for (i = 0; i < 6; i++) {
381 dev->dev_addr[i] = inb(ioaddr + i);
382 printk(" %02x", dev->dev_addr[i]);
383 }
384
385 if ((dev->mem_start & 0xf) > 0)
386 net_debug = dev->mem_start & 7;
387
388 #ifdef MEM_BASE
389 dev->mem_start = MEM_BASE;
390 dev->mem_end = dev->mem_start + 0x10000;
391 #else
392 {
393 int base;
394 int size;
395 char mem_config = inb(ioaddr + MEM_CONFIG);
396 if (mem_config & 0x20) {
397 size = 64*1024;
398 base = 0xf00000 + (mem_config & 0x08 ? 0x080000
399 : ((mem_config & 3) << 17));
400 } else {
401 size = ((mem_config & 3) + 1) << 14;
402 base = 0x0c0000 + ( (mem_config & 0x18) << 12);
403 }
404 dev->mem_start = base;
405 dev->mem_end = base + size;
406 }
407 #endif
408
409 dev->if_port = (inb(ioaddr + ROM_CONFIG) & 0x80) ? 1 : 0;
410 dev->irq = inb(ioaddr + IRQ_CONFIG) & 0x0f;
411
412 printk(", IRQ %d, %sternal xcvr, memory %#lx-%#lx.\n", dev->irq,
413 dev->if_port ? "ex" : "in", dev->mem_start, dev->mem_end-1);
414
415 if (net_debug)
416 printk(version);
417
418
419 if (dev->priv == NULL)
420 dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
421 memset(dev->priv, 0, sizeof(struct net_local));
422
423 dev->open = el16_open;
424 dev->stop = el16_close;
425 dev->hard_start_xmit = el16_send_packet;
426 dev->get_stats = el16_get_stats;
427
428 ether_setup(dev);
429
430 return 0;
431 }
432
433
434
435 static int
436 el16_open(struct device *dev)
437 {
438 irq2dev_map[dev->irq] = dev;
439
440
441 init_82586_mem(dev);
442
443 dev->tbusy = 0;
444 dev->interrupt = 0;
445 dev->start = 1;
446
447 #ifdef MODULE
448 MOD_INC_USE_COUNT;
449 #endif
450
451 return 0;
452 }
453
454 static int
455 el16_send_packet(struct sk_buff *skb, struct device *dev)
456 {
457 struct net_local *lp = (struct net_local *)dev->priv;
458 int ioaddr = dev->base_addr;
459 short *shmem = (short*)dev->mem_start;
460
461 if (dev->tbusy) {
462
463
464 int tickssofar = jiffies - dev->trans_start;
465 if (tickssofar < 5)
466 return 1;
467 if (net_debug > 1)
468 printk("%s: transmit timed out, %s? ", dev->name,
469 shmem[iSCB_STATUS>>1] & 0x8000 ? "IRQ conflict" :
470 "network cable problem");
471
472 if (lp->last_restart == lp->stats.tx_packets) {
473 if (net_debug > 1) printk("Resetting board.\n");
474
475 init_82586_mem(dev);
476 } else {
477
478 if (net_debug > 1) printk("Kicking board.\n");
479 shmem[iSCB_CMD>>1] = 0xf000|CUC_START|RX_START;
480 outb(0, ioaddr + SIGNAL_CA);
481 lp->last_restart = lp->stats.tx_packets;
482 }
483 dev->tbusy=0;
484 dev->trans_start = jiffies;
485 }
486
487
488
489
490 if (skb == NULL) {
491 dev_tint(dev);
492 return 0;
493 }
494
495
496 if (set_bit(0, (void*)&dev->tbusy) != 0)
497 printk("%s: Transmitter access conflict.\n", dev->name);
498 else {
499 short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
500 unsigned char *buf = skb->data;
501
502
503 outb(0x80, ioaddr + MISC_CTRL);
504 hardware_send_packet(dev, buf, length);
505 dev->trans_start = jiffies;
506
507 outb(0x84, ioaddr + MISC_CTRL);
508 }
509
510 dev_kfree_skb (skb, FREE_WRITE);
511
512
513
514 return 0;
515 }
516
517
518
519 static void
520 el16_interrupt(int irq, struct pt_regs *regs)
521 {
522 struct device *dev = (struct device *)(irq2dev_map[irq]);
523 struct net_local *lp;
524 int ioaddr, status, boguscount = 0;
525 ushort ack_cmd = 0;
526 ushort *shmem;
527
528 if (dev == NULL) {
529 printk ("net_interrupt(): irq %d for unknown device.\n", irq);
530 return;
531 }
532 dev->interrupt = 1;
533
534 ioaddr = dev->base_addr;
535 lp = (struct net_local *)dev->priv;
536 shmem = ((ushort*)dev->mem_start);
537
538 status = shmem[iSCB_STATUS>>1];
539
540 if (net_debug > 4) {
541 printk("%s: 3c507 interrupt, status %4.4x.\n", dev->name, status);
542 }
543
544
545 outb(0x80, ioaddr + MISC_CTRL);
546
547
548 while (lp->tx_reap != lp->tx_head) {
549 unsigned short tx_status = shmem[lp->tx_reap>>1];
550
551 if (tx_status == 0) {
552 if (net_debug > 5) printk("Couldn't reap %#x.\n", lp->tx_reap);
553 break;
554 }
555 if (tx_status & 0x2000) {
556 lp->stats.tx_packets++;
557 lp->stats.collisions += tx_status & 0xf;
558 dev->tbusy = 0;
559 mark_bh(NET_BH);
560 } else {
561 lp->stats.tx_errors++;
562 if (tx_status & 0x0600) lp->stats.tx_carrier_errors++;
563 if (tx_status & 0x0100) lp->stats.tx_fifo_errors++;
564 if (!(tx_status & 0x0040)) lp->stats.tx_heartbeat_errors++;
565 if (tx_status & 0x0020) lp->stats.tx_aborted_errors++;
566 }
567 if (net_debug > 5)
568 printk("Reaped %x, Tx status %04x.\n" , lp->tx_reap, tx_status);
569 lp->tx_reap += TX_BUF_SIZE;
570 if (lp->tx_reap > RX_BUF_START - TX_BUF_SIZE)
571 lp->tx_reap = TX_BUF_START;
572 if (++boguscount > 4)
573 break;
574 }
575
576 if (status & 0x4000) {
577 if (net_debug > 5)
578 printk("Received packet, rx_head %04x.\n", lp->rx_head);
579 el16_rx(dev);
580 }
581
582
583 ack_cmd = status & 0xf000;
584
585 if ((status & 0x0700) != 0x0200 && dev->start) {
586 if (net_debug)
587 printk("%s: Command unit stopped, status %04x, restarting.\n",
588 dev->name, status);
589
590
591
592 ack_cmd |= CUC_RESUME;
593 }
594
595 if ((status & 0x0070) != 0x0040 && dev->start) {
596 static void init_rx_bufs(struct device *);
597
598
599 if (net_debug)
600 printk("%s: Rx unit stopped, status %04x, restarting.\n",
601 dev->name, status);
602 init_rx_bufs(dev);
603 shmem[iSCB_RFA >> 1] = RX_BUF_START;
604 ack_cmd |= RX_START;
605 }
606
607 shmem[iSCB_CMD>>1] = ack_cmd;
608 outb(0, ioaddr + SIGNAL_CA);
609
610
611 outb(0, ioaddr + RESET_IRQ);
612
613
614 outb(0x84, ioaddr + MISC_CTRL);
615
616 return;
617 }
618
619 static int
620 el16_close(struct device *dev)
621 {
622 int ioaddr = dev->base_addr;
623 ushort *shmem = (short*)dev->mem_start;
624
625 dev->tbusy = 1;
626 dev->start = 0;
627
628
629 shmem[iSCB_CMD >> 1] = RX_SUSPEND | CUC_SUSPEND;
630 outb(0, ioaddr + SIGNAL_CA);
631
632
633 outb(0x80, ioaddr + MISC_CTRL);
634
635
636
637
638 irq2dev_map[dev->irq] = 0;
639
640
641
642 #ifdef MODULE
643 MOD_DEC_USE_COUNT;
644 #endif
645
646 return 0;
647 }
648
649
650
651 static struct enet_statistics *
652 el16_get_stats(struct device *dev)
653 {
654 struct net_local *lp = (struct net_local *)dev->priv;
655
656
657
658 return &lp->stats;
659 }
660
661
662 static void
663 init_rx_bufs(struct device *dev)
664 {
665 struct net_local *lp = (struct net_local *)dev->priv;
666 unsigned short *write_ptr;
667 unsigned short SCB_base = SCB_BASE;
668
669 int cur_rxbuf = lp->rx_head = RX_BUF_START;
670
671
672 do {
673
674 write_ptr = (unsigned short *)(dev->mem_start + cur_rxbuf);
675
676 *write_ptr++ = 0x0000;
677 *write_ptr++ = 0x0000;
678 *write_ptr++ = cur_rxbuf + RX_BUF_SIZE;
679 *write_ptr++ = cur_rxbuf + 22;
680 *write_ptr++ = 0x0000;
681 *write_ptr++ = 0x0000;
682 *write_ptr++ = 0x0000;
683 *write_ptr++ = 0x0000;
684 *write_ptr++ = 0x0000;
685 *write_ptr++ = 0x0000;
686 *write_ptr++ = 0x0000;
687
688 *write_ptr++ = 0x0000;
689 *write_ptr++ = -1;
690 *write_ptr++ = cur_rxbuf + 0x20 + SCB_base;
691 *write_ptr++ = 0x0000;
692
693 *write_ptr++ = 0x8000 + RX_BUF_SIZE-0x20;
694
695 lp->rx_tail = cur_rxbuf;
696 cur_rxbuf += RX_BUF_SIZE;
697 } while (cur_rxbuf <= RX_BUF_END - RX_BUF_SIZE);
698
699
700
701 write_ptr = (unsigned short *)
702 (dev->mem_start + lp->rx_tail + 2);
703 *write_ptr++ = 0xC000;
704 *write_ptr++ = lp->rx_head;
705
706 }
707
708 void
709 init_82586_mem(struct device *dev)
710 {
711 struct net_local *lp = (struct net_local *)dev->priv;
712 short ioaddr = dev->base_addr;
713 ushort *shmem = (short*)dev->mem_start;
714
715
716
717 outb(0x20, ioaddr + MISC_CTRL);
718
719
720 init_words[3] = SCB_BASE;
721 init_words[7] = SCB_BASE;
722
723
724 memcpy((void*)dev->mem_end-10, init_words, 10);
725
726
727 memcpy((char*)dev->mem_start, init_words + 5, sizeof(init_words) - 10);
728
729
730 memcpy((char*)dev->mem_start+SA_OFFSET, dev->dev_addr,
731 sizeof(dev->dev_addr));
732
733
734 lp->tx_cmd_link = IDLELOOP + 4;
735 lp->tx_head = lp->tx_reap = TX_BUF_START;
736
737 init_rx_bufs(dev);
738
739
740 outb(0xA0, ioaddr + MISC_CTRL);
741
742
743
744 outb(0, ioaddr + SIGNAL_CA);
745
746 {
747 int boguscnt = 50;
748 while (shmem[iSCB_STATUS>>1] == 0)
749 if (--boguscnt == 0) {
750 printk("%s: i82586 initialization timed out with status %04x,"
751 "cmd %04x.\n", dev->name,
752 shmem[iSCB_STATUS>>1], shmem[iSCB_CMD>>1]);
753 break;
754 }
755
756 outb(0, ioaddr + SIGNAL_CA);
757 }
758
759
760 outb(0x84, ioaddr + MISC_CTRL);
761 if (net_debug > 4)
762 printk("%s: Initialized 82586, status %04x.\n", dev->name,
763 shmem[iSCB_STATUS>>1]);
764 return;
765 }
766
767 static void
768 hardware_send_packet(struct device *dev, void *buf, short length)
769 {
770 struct net_local *lp = (struct net_local *)dev->priv;
771 short ioaddr = dev->base_addr;
772 ushort tx_block = lp->tx_head;
773 ushort *write_ptr = (ushort *)(dev->mem_start + tx_block);
774
775
776 *write_ptr++ = 0x0000;
777 *write_ptr++ = CMD_INTR|CmdTx;
778 *write_ptr++ = tx_block+16;
779 *write_ptr++ = tx_block+8;
780
781
782 *write_ptr++ = length | 0x8000;
783 *write_ptr++ = -1;
784 *write_ptr++ = tx_block+22+SCB_BASE;
785 *write_ptr++ = 0x0000;
786
787
788 *write_ptr++ = 0x0000;
789 *write_ptr++ = CmdNOp;
790 *write_ptr++ = tx_block+16;
791
792
793 memcpy(write_ptr, buf, length);
794
795
796 *(ushort*)(dev->mem_start + lp->tx_cmd_link) = tx_block;
797 lp->tx_cmd_link = tx_block + 20;
798
799
800 lp->tx_head = tx_block + TX_BUF_SIZE;
801 if (lp->tx_head > RX_BUF_START - TX_BUF_SIZE)
802 lp->tx_head = TX_BUF_START;
803
804 if (net_debug > 4) {
805 printk("%s: 3c507 @%x send length = %d, tx_block %3x, next %3x.\n",
806 dev->name, ioaddr, length, tx_block, lp->tx_head);
807 }
808
809 if (lp->tx_head != lp->tx_reap)
810 dev->tbusy = 0;
811 }
812
813 static void
814 el16_rx(struct device *dev)
815 {
816 struct net_local *lp = (struct net_local *)dev->priv;
817 short *shmem = (short*)dev->mem_start;
818 ushort rx_head = lp->rx_head;
819 ushort rx_tail = lp->rx_tail;
820 ushort boguscount = 10;
821 short frame_status;
822
823 while ((frame_status = shmem[rx_head>>1]) < 0) {
824 ushort *read_frame = (short *)(dev->mem_start + rx_head);
825 ushort rfd_cmd = read_frame[1];
826 ushort next_rx_frame = read_frame[2];
827 ushort data_buffer_addr = read_frame[3];
828 ushort *data_frame = (short *)(dev->mem_start + data_buffer_addr);
829 ushort pkt_len = data_frame[0];
830
831 if (rfd_cmd != 0 || data_buffer_addr != rx_head + 22
832 || pkt_len & 0xC000 != 0xC000) {
833 printk("%s: Rx frame at %#x corrupted, status %04x cmd %04x"
834 "next %04x data-buf @%04x %04x.\n", dev->name, rx_head,
835 frame_status, rfd_cmd, next_rx_frame, data_buffer_addr,
836 pkt_len);
837 } else if ((frame_status & 0x2000) == 0) {
838
839 lp->stats.rx_errors++;
840 if (frame_status & 0x0800) lp->stats.rx_crc_errors++;
841 if (frame_status & 0x0400) lp->stats.rx_frame_errors++;
842 if (frame_status & 0x0200) lp->stats.rx_fifo_errors++;
843 if (frame_status & 0x0100) lp->stats.rx_over_errors++;
844 if (frame_status & 0x0080) lp->stats.rx_length_errors++;
845 } else {
846
847 struct sk_buff *skb;
848
849 pkt_len &= 0x3fff;
850 skb = dev_alloc_skb(pkt_len+2);
851 if (skb == NULL) {
852 printk("%s: Memory squeeze, dropping packet.\n", dev->name);
853 lp->stats.rx_dropped++;
854 break;
855 }
856
857 skb_reserve(skb,2);
858 skb->dev = dev;
859
860
861 memcpy(skb_put(skb,pkt_len), data_frame + 5, pkt_len);
862
863 skb->protocol=eth_type_trans(skb,dev);
864 netif_rx(skb);
865 lp->stats.rx_packets++;
866 }
867
868
869 read_frame[0] = 0;
870 read_frame[1] = 0xC000;
871
872 *(short*)(dev->mem_start + rx_tail + 2) = 0x0000;
873
874 rx_tail = rx_head;
875 rx_head = next_rx_frame;
876 if (--boguscount == 0)
877 break;
878 }
879
880 lp->rx_head = rx_head;
881 lp->rx_tail = rx_tail;
882 }
883 #ifdef MODULE
884 char kernel_version[] = UTS_RELEASE;
885 static char devicename[9] = { 0, };
886 static struct device dev_3c507 = {
887 devicename,
888 0, 0, 0, 0,
889 0, 0,
890 0, 0, 0, NULL, el16_probe
891 };
892
893 int io = 0x300;
894 int irq = 0;
895
896 int init_module(void)
897 {
898 if (io == 0)
899 printk("3c507: You should not use auto-probing with insmod!\n");
900 dev_3c507.base_addr = io;
901 dev_3c507.irq = irq;
902 if (register_netdev(&dev_3c507) != 0) {
903 printk("3c507: register_netdev() returned non-zero.\n");
904 return -EIO;
905 }
906 return 0;
907 }
908
909 void
910 cleanup_module(void)
911 {
912 if (MOD_IN_USE)
913 printk("3c507: device busy, remove delayed\n");
914 else
915 {
916 unregister_netdev(&dev_3c507);
917
918
919 free_irq(dev_3c507.irq);
920 release_region(dev_3c507.base_addr, EL16_IO_EXTENT);
921 }
922 }
923 #endif
924
925
926
927
928
929
930
931
932
933