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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90#define DRV_NAME "3c523"
91#define DRV_VERSION "17-Nov-2001"
92
93#include <linux/init.h>
94#include <linux/netdevice.h>
95#include <linux/etherdevice.h>
96#include <linux/module.h>
97#include <linux/kernel.h>
98#include <linux/string.h>
99#include <linux/errno.h>
100#include <linux/ioport.h>
101#include <linux/skbuff.h>
102#include <linux/slab.h>
103#include <linux/interrupt.h>
104#include <linux/delay.h>
105#include <linux/mca-legacy.h>
106#include <linux/ethtool.h>
107
108#include <asm/uaccess.h>
109#include <asm/processor.h>
110#include <asm/bitops.h>
111#include <asm/io.h>
112
113#include "3c523.h"
114
115
116#define DEBUG
117#define SYSBUSVAL 0
118#undef ELMC_MULTICAST
119
120#define make32(ptr16) (p->memtop + (short) (ptr16) )
121#define make24(ptr32) ((char *) (ptr32) - p->base)
122#define make16(ptr32) ((unsigned short) ((unsigned long) (ptr32) - (unsigned long) p->memtop ))
123
124
125
126
127
128static int irq_table[] __initdata = {
129 12, 7, 3, 9
130};
131
132static int csr_table[] __initdata = {
133 0x300, 0x1300, 0x2300, 0x3300
134};
135
136static int shm_table[] __initdata = {
137 0x0c0000, 0x0c8000, 0x0d0000, 0x0d8000
138};
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155#define RECV_BUFF_SIZE 1524
156#define XMIT_BUFF_SIZE 1524
157#define NUM_XMIT_BUFFS 1
158#define NUM_RECV_BUFFS_8 4
159#define NUM_RECV_BUFFS_16 9
160
161#if (NUM_XMIT_BUFFS == 1)
162#define NO_NOPCOMMANDS
163#endif
164
165
166
167#define DELAY(x) { mdelay(32 * x); }
168
169
170#define DELAY_16(); { udelay(16) ; }
171
172
173#define WAIT_4_SCB_CMD() { int i; \
174 for(i=0;i<1024;i++) { \
175 if(!p->scb->cmd) break; \
176 DELAY_16(); \
177 if(i == 1023) { \
178 printk(KERN_WARNING "%s:%d: scb_cmd timed out .. resetting i82586\n",\
179 dev->name,__LINE__); \
180 elmc_id_reset586(); } } }
181
182static irqreturn_t elmc_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr);
183static int elmc_open(struct net_device *dev);
184static int elmc_close(struct net_device *dev);
185static int elmc_send_packet(struct sk_buff *, struct net_device *);
186static struct net_device_stats *elmc_get_stats(struct net_device *dev);
187static void elmc_timeout(struct net_device *dev);
188#ifdef ELMC_MULTICAST
189static void set_multicast_list(struct net_device *dev);
190#endif
191static struct ethtool_ops netdev_ethtool_ops;
192
193
194static int init586(struct net_device *dev);
195static int check586(struct net_device *dev, unsigned long where, unsigned size);
196static void alloc586(struct net_device *dev);
197static void startrecv586(struct net_device *dev);
198static void *alloc_rfa(struct net_device *dev, void *ptr);
199static void elmc_rcv_int(struct net_device *dev);
200static void elmc_xmt_int(struct net_device *dev);
201static void elmc_rnr_int(struct net_device *dev);
202
203struct priv {
204 struct net_device_stats stats;
205 unsigned long base;
206 char *memtop;
207 unsigned long mapped_start;
208 volatile struct rfd_struct *rfd_last, *rfd_top, *rfd_first;
209 volatile struct scp_struct *scp;
210 volatile struct iscp_struct *iscp;
211 volatile struct scb_struct *scb;
212 volatile struct tbd_struct *xmit_buffs[NUM_XMIT_BUFFS];
213#if (NUM_XMIT_BUFFS == 1)
214 volatile struct transmit_cmd_struct *xmit_cmds[2];
215 volatile struct nop_cmd_struct *nop_cmds[2];
216#else
217 volatile struct transmit_cmd_struct *xmit_cmds[NUM_XMIT_BUFFS];
218 volatile struct nop_cmd_struct *nop_cmds[NUM_XMIT_BUFFS];
219#endif
220 volatile int nop_point, num_recv_buffs;
221 volatile char *xmit_cbuffs[NUM_XMIT_BUFFS];
222 volatile int xmit_count, xmit_last;
223 volatile int slot;
224};
225
226#define elmc_attn586() {elmc_do_attn586(dev->base_addr,ELMC_CTRL_INTE);}
227#define elmc_reset586() {elmc_do_reset586(dev->base_addr,ELMC_CTRL_INTE);}
228
229
230
231
232#define elmc_id_attn586() {elmc_do_attn586(dev->base_addr,0);}
233#define elmc_id_reset586() {elmc_do_reset586(dev->base_addr,0);}
234
235
236
237
238
239static void elmc_do_attn586(int ioaddr, int ints)
240{
241
242
243
244
245
246
247
248
249
250 outb(ELMC_CTRL_RST | 0x3 | ELMC_CTRL_CA | ints, ioaddr + ELMC_CTRL);
251 DELAY_16();
252 outb(ELMC_CTRL_RST | 0x3 | ints, ioaddr + ELMC_CTRL);
253}
254
255
256
257
258
259static void elmc_do_reset586(int ioaddr, int ints)
260{
261
262 outb(0x3 | ELMC_CTRL_LBK, ioaddr + ELMC_CTRL);
263 DELAY_16();
264 outb(ELMC_CTRL_RST | ELMC_CTRL_LBK | 0x3, ioaddr + ELMC_CTRL);
265
266 elmc_do_attn586(ioaddr, ints);
267}
268
269
270
271
272
273static int elmc_close(struct net_device *dev)
274{
275 netif_stop_queue(dev);
276 elmc_id_reset586();
277 free_irq(dev->irq, dev);
278 return 0;
279}
280
281
282
283
284
285static int elmc_open(struct net_device *dev)
286{
287 int ret;
288
289 elmc_id_attn586();
290
291 ret = request_irq(dev->irq, &elmc_interrupt, SA_SHIRQ | SA_SAMPLE_RANDOM,
292 dev->name, dev);
293 if (ret) {
294 printk(KERN_ERR "%s: couldn't get irq %d\n", dev->name, dev->irq);
295 elmc_id_reset586();
296 return ret;
297 }
298 alloc586(dev);
299 init586(dev);
300 startrecv586(dev);
301 netif_start_queue(dev);
302 return 0;
303}
304
305
306
307
308
309static int __init check586(struct net_device *dev, unsigned long where, unsigned size)
310{
311 struct priv *p = (struct priv *) dev->priv;
312 char *iscp_addrs[2];
313 int i = 0;
314
315 p->base = (unsigned long) isa_bus_to_virt((unsigned long)where) + size - 0x01000000;
316 p->memtop = isa_bus_to_virt((unsigned long)where) + size;
317 p->scp = (struct scp_struct *)(p->base + SCP_DEFAULT_ADDRESS);
318 memset((char *) p->scp, 0, sizeof(struct scp_struct));
319 p->scp->sysbus = SYSBUSVAL;
320
321 iscp_addrs[0] = isa_bus_to_virt((unsigned long)where);
322 iscp_addrs[1] = (char *) p->scp - sizeof(struct iscp_struct);
323
324 for (i = 0; i < 2; i++) {
325 p->iscp = (struct iscp_struct *) iscp_addrs[i];
326 memset((char *) p->iscp, 0, sizeof(struct iscp_struct));
327
328 p->scp->iscp = make24(p->iscp);
329 p->iscp->busy = 1;
330
331 elmc_id_reset586();
332
333
334
335
336 elmc_id_attn586();
337 DELAY(1);
338
339 if (p->iscp->busy) {
340 return 0;
341 }
342 }
343 return 1;
344}
345
346
347
348
349
350void alloc586(struct net_device *dev)
351{
352 struct priv *p = (struct priv *) dev->priv;
353
354 elmc_id_reset586();
355 DELAY(2);
356
357 p->scp = (struct scp_struct *) (p->base + SCP_DEFAULT_ADDRESS);
358 p->scb = (struct scb_struct *) isa_bus_to_virt(dev->mem_start);
359 p->iscp = (struct iscp_struct *) ((char *) p->scp - sizeof(struct iscp_struct));
360
361 memset((char *) p->iscp, 0, sizeof(struct iscp_struct));
362 memset((char *) p->scp, 0, sizeof(struct scp_struct));
363
364 p->scp->iscp = make24(p->iscp);
365 p->scp->sysbus = SYSBUSVAL;
366 p->iscp->scb_offset = make16(p->scb);
367
368 p->iscp->busy = 1;
369 elmc_id_reset586();
370 elmc_id_attn586();
371
372 DELAY(2);
373
374 if (p->iscp->busy) {
375 printk(KERN_ERR "%s: Init-Problems (alloc).\n", dev->name);
376 }
377 memset((char *) p->scb, 0, sizeof(struct scb_struct));
378}
379
380
381
382static int elmc_getinfo(char *buf, int slot, void *d)
383{
384 int len = 0;
385 struct net_device *dev = (struct net_device *) d;
386 int i;
387
388 if (dev == NULL)
389 return len;
390
391 len += sprintf(buf + len, "Revision: 0x%x\n",
392 inb(dev->base_addr + ELMC_REVISION) & 0xf);
393 len += sprintf(buf + len, "IRQ: %d\n", dev->irq);
394 len += sprintf(buf + len, "IO Address: %#lx-%#lx\n", dev->base_addr,
395 dev->base_addr + ELMC_IO_EXTENT);
396 len += sprintf(buf + len, "Memory: %#lx-%#lx\n", dev->mem_start,
397 dev->mem_end - 1);
398 len += sprintf(buf + len, "Transceiver: %s\n", dev->if_port ?
399 "External" : "Internal");
400 len += sprintf(buf + len, "Device: %s\n", dev->name);
401 len += sprintf(buf + len, "Hardware Address:");
402 for (i = 0; i < 6; i++) {
403 len += sprintf(buf + len, " %02x", dev->dev_addr[i]);
404 }
405 buf[len++] = '\n';
406 buf[len] = 0;
407
408 return len;
409}
410
411
412
413int __init elmc_probe(struct net_device *dev)
414{
415 static int slot;
416 int base_addr = dev->base_addr;
417 int irq = dev->irq;
418 u_char status = 0;
419 u_char revision = 0;
420 int i = 0;
421 unsigned int size = 0;
422 int retval;
423 struct priv *pr;
424
425 SET_MODULE_OWNER(dev);
426 if (MCA_bus == 0) {
427 return -ENODEV;
428 }
429
430 slot = mca_find_adapter(ELMC_MCA_ID, 0);
431 while (slot != -1) {
432 status = mca_read_stored_pos(slot, 2);
433
434 dev->irq=irq_table[(status & ELMC_STATUS_IRQ_SELECT) >> 6];
435 dev->base_addr=csr_table[(status & ELMC_STATUS_CSR_SELECT) >> 1];
436
437
438
439
440
441
442
443 if ((irq && irq != dev->irq) ||
444 (base_addr && base_addr != dev->base_addr)) {
445 slot = mca_find_adapter(ELMC_MCA_ID, slot + 1);
446 continue;
447 }
448 if (!request_region(dev->base_addr, ELMC_IO_EXTENT, dev->name)) {
449 slot = mca_find_adapter(ELMC_MCA_ID, slot + 1);
450 continue;
451 }
452
453
454 break;
455 }
456
457
458 if (slot == MCA_NOTFOUND) {
459 retval = ((base_addr || irq) ? -ENXIO : -ENODEV);
460 goto err_out;
461 }
462 mca_set_adapter_name(slot, "3Com 3c523 Etherlink/MC");
463 mca_set_adapter_procfn(slot, (MCA_ProcFn) elmc_getinfo, dev);
464
465
466 printk(KERN_INFO "%s: 3c523 adapter found in slot %d\n", dev->name, slot + 1);
467
468
469
470
471
472
473
474
475
476
477
478
479
480 revision = inb(dev->base_addr + ELMC_REVISION) & 0xf;
481
482
483
484
485 switch (dev->irq) {
486 case 3:
487 mca_write_pos(slot, 3, 0x04);
488 break;
489 case 7:
490 mca_write_pos(slot, 3, 0x02);
491 break;
492 case 9:
493 mca_write_pos(slot, 3, 0x08);
494 break;
495 case 12:
496 mca_write_pos(slot, 3, 0x01);
497 break;
498 }
499
500 pr = dev->priv = kmalloc(sizeof(struct priv), GFP_KERNEL);
501 if (dev->priv == NULL) {
502 retval = -ENOMEM;
503 goto err_out;
504 }
505 memset(pr, 0, sizeof(struct priv));
506
507 pr->slot = slot;
508
509 printk(KERN_INFO "%s: 3Com 3c523 Rev 0x%x at %#lx\n", dev->name, (int) revision,
510 dev->base_addr);
511
512
513
514
515 dev->if_port = (status & ELMC_STATUS_DISABLE_THIN);
516
517
518
519
520
521
522 dev->mem_start = shm_table[(status & ELMC_STATUS_MEMORY_SELECT) >> 3];
523
524
525
526
527 elmc_id_reset586();
528
529 size = 0x4000;
530 if (!check586(dev, dev->mem_start, size)) {
531 printk(KERN_ERR "%s: memprobe, Can't find memory at 0x%lx!\n", dev->name,
532 dev->mem_start);
533 kfree(dev->priv);
534 dev->priv = NULL;
535 retval = -ENODEV;
536 goto err_out;
537 }
538 dev->mem_end = dev->mem_start + size;
539
540 pr->memtop = isa_bus_to_virt(dev->mem_start) + size;
541 pr->base = (unsigned long) isa_bus_to_virt(dev->mem_start) + size - 0x01000000;
542 alloc586(dev);
543
544 elmc_id_reset586();
545
546
547 pr->num_recv_buffs = NUM_RECV_BUFFS_16;
548
549
550 printk(KERN_INFO "%s: IRQ %d, %sternal xcvr, memory %#lx-%#lx.\n", dev->name,
551 dev->irq, dev->if_port ? "ex" : "in",
552 dev->mem_start, dev->mem_end - 1);
553
554
555
556 printk(KERN_INFO "%s: hardware address ", dev->name);
557 for (i = 0; i < 6; i++) {
558 dev->dev_addr[i] = inb(dev->base_addr + i);
559 printk(" %02x", dev->dev_addr[i]);
560 }
561 printk("\n");
562
563 dev->open = &elmc_open;
564 dev->stop = &elmc_close;
565 dev->get_stats = &elmc_get_stats;
566 dev->hard_start_xmit = &elmc_send_packet;
567 dev->tx_timeout = &elmc_timeout;
568 dev->watchdog_timeo = HZ;
569#ifdef ELMC_MULTICAST
570 dev->set_multicast_list = &set_multicast_list;
571#else
572 dev->set_multicast_list = NULL;
573#endif
574 dev->ethtool_ops = &netdev_ethtool_ops;
575
576 ether_setup(dev);
577
578
579
580
581
582#ifndef ELMC_MULTICAST
583 dev->flags&=~IFF_MULTICAST;
584#endif
585
586 return 0;
587err_out:
588 release_region(dev->base_addr, ELMC_IO_EXTENT);
589 return retval;
590}
591
592
593
594
595
596
597static int init586(struct net_device *dev)
598{
599 void *ptr;
600 unsigned long s;
601 int i, result = 0;
602 struct priv *p = (struct priv *) dev->priv;
603 volatile struct configure_cmd_struct *cfg_cmd;
604 volatile struct iasetup_cmd_struct *ias_cmd;
605 volatile struct tdr_cmd_struct *tdr_cmd;
606 volatile struct mcsetup_cmd_struct *mc_cmd;
607 struct dev_mc_list *dmi = dev->mc_list;
608 int num_addrs = dev->mc_count;
609
610 ptr = (void *) ((char *) p->scb + sizeof(struct scb_struct));
611
612 cfg_cmd = (struct configure_cmd_struct *) ptr;
613 cfg_cmd->cmd_status = 0;
614 cfg_cmd->cmd_cmd = CMD_CONFIGURE | CMD_LAST;
615 cfg_cmd->cmd_link = 0xffff;
616
617 cfg_cmd->byte_cnt = 0x0a;
618 cfg_cmd->fifo = 0x08;
619 cfg_cmd->sav_bf = 0x40;
620 cfg_cmd->adr_len = 0x2e;
621 cfg_cmd->priority = 0x00;
622 cfg_cmd->ifs = 0x60;
623 cfg_cmd->time_low = 0x00;
624 cfg_cmd->time_high = 0xf2;
625 cfg_cmd->promisc = 0;
626 if (dev->flags & (IFF_ALLMULTI | IFF_PROMISC)) {
627 cfg_cmd->promisc = 1;
628 dev->flags |= IFF_PROMISC;
629 }
630 cfg_cmd->carr_coll = 0x00;
631
632 p->scb->cbl_offset = make16(cfg_cmd);
633
634 p->scb->cmd = CUC_START;
635 elmc_id_attn586();
636
637 s = jiffies;
638 while (!(cfg_cmd->cmd_status & STAT_COMPL)) {
639 if (jiffies - s > 30*HZ/100)
640 break;
641 }
642
643 if ((cfg_cmd->cmd_status & (STAT_OK | STAT_COMPL)) != (STAT_COMPL | STAT_OK)) {
644 printk(KERN_WARNING "%s (elmc): configure command failed: %x\n", dev->name, cfg_cmd->cmd_status);
645 return 1;
646 }
647
648
649
650 ias_cmd = (struct iasetup_cmd_struct *) ptr;
651
652 ias_cmd->cmd_status = 0;
653 ias_cmd->cmd_cmd = CMD_IASETUP | CMD_LAST;
654 ias_cmd->cmd_link = 0xffff;
655
656 memcpy((char *) &ias_cmd->iaddr, (char *) dev->dev_addr, ETH_ALEN);
657
658 p->scb->cbl_offset = make16(ias_cmd);
659
660 p->scb->cmd = CUC_START;
661 elmc_id_attn586();
662
663 s = jiffies;
664 while (!(ias_cmd->cmd_status & STAT_COMPL)) {
665 if (jiffies - s > 30*HZ/100)
666 break;
667 }
668
669 if ((ias_cmd->cmd_status & (STAT_OK | STAT_COMPL)) != (STAT_OK | STAT_COMPL)) {
670 printk(KERN_WARNING "%s (elmc): individual address setup command failed: %04x\n", dev->name, ias_cmd->cmd_status);
671 return 1;
672 }
673
674
675
676 tdr_cmd = (struct tdr_cmd_struct *) ptr;
677
678 tdr_cmd->cmd_status = 0;
679 tdr_cmd->cmd_cmd = CMD_TDR | CMD_LAST;
680 tdr_cmd->cmd_link = 0xffff;
681 tdr_cmd->status = 0;
682
683 p->scb->cbl_offset = make16(tdr_cmd);
684
685 p->scb->cmd = CUC_START;
686 elmc_attn586();
687
688 s = jiffies;
689 while (!(tdr_cmd->cmd_status & STAT_COMPL)) {
690 if (jiffies - s > 30*HZ/100) {
691 printk(KERN_WARNING "%s: %d Problems while running the TDR.\n", dev->name, __LINE__);
692 result = 1;
693 break;
694 }
695 }
696
697 if (!result) {
698 DELAY(2);
699 result = tdr_cmd->status;
700
701 p->scb->cmd = p->scb->status & STAT_MASK;
702 elmc_id_attn586();
703
704 if (result & TDR_LNK_OK) {
705
706 } else if (result & TDR_XCVR_PRB) {
707 printk(KERN_WARNING "%s: TDR: Transceiver problem!\n", dev->name);
708 } else if (result & TDR_ET_OPN) {
709 printk(KERN_WARNING "%s: TDR: No correct termination %d clocks away.\n", dev->name, result & TDR_TIMEMASK);
710 } else if (result & TDR_ET_SRT) {
711 if (result & TDR_TIMEMASK)
712 printk(KERN_WARNING "%s: TDR: Detected a short circuit %d clocks away.\n", dev->name, result & TDR_TIMEMASK);
713 } else {
714 printk(KERN_WARNING "%s: TDR: Unknown status %04x\n", dev->name, result);
715 }
716 }
717
718
719
720 p->scb->cmd = p->scb->status & STAT_MASK;
721 elmc_id_attn586();
722
723
724
725
726#if (NUM_XMIT_BUFFS == 1)
727 for (i = 0; i < 2; i++) {
728 p->nop_cmds[i] = (struct nop_cmd_struct *) ptr;
729 p->nop_cmds[i]->cmd_cmd = CMD_NOP;
730 p->nop_cmds[i]->cmd_status = 0;
731 p->nop_cmds[i]->cmd_link = make16((p->nop_cmds[i]));
732 ptr = (char *) ptr + sizeof(struct nop_cmd_struct);
733 }
734 p->xmit_cmds[0] = (struct transmit_cmd_struct *) ptr;
735 ptr = (char *) ptr + sizeof(struct transmit_cmd_struct);
736#else
737 for (i = 0; i < NUM_XMIT_BUFFS; i++) {
738 p->nop_cmds[i] = (struct nop_cmd_struct *) ptr;
739 p->nop_cmds[i]->cmd_cmd = CMD_NOP;
740 p->nop_cmds[i]->cmd_status = 0;
741 p->nop_cmds[i]->cmd_link = make16((p->nop_cmds[i]));
742 ptr = (char *) ptr + sizeof(struct nop_cmd_struct);
743 p->xmit_cmds[i] = (struct transmit_cmd_struct *) ptr;
744 ptr = (char *) ptr + sizeof(struct transmit_cmd_struct);
745 }
746#endif
747
748 ptr = alloc_rfa(dev, (void *) ptr);
749
750
751
752
753
754 if (dev->mc_count) {
755
756 int len = ((char *) p->iscp - (char *) ptr - 8) / 6;
757 if (len <= 0) {
758 printk(KERN_ERR "%s: Ooooops, no memory for MC-Setup!\n", dev->name);
759 } else {
760 if (len < num_addrs) {
761 num_addrs = len;
762 printk(KERN_WARNING "%s: Sorry, can only apply %d MC-Address(es).\n",
763 dev->name, num_addrs);
764 }
765 mc_cmd = (struct mcsetup_cmd_struct *) ptr;
766 mc_cmd->cmd_status = 0;
767 mc_cmd->cmd_cmd = CMD_MCSETUP | CMD_LAST;
768 mc_cmd->cmd_link = 0xffff;
769 mc_cmd->mc_cnt = num_addrs * 6;
770 for (i = 0; i < num_addrs; i++) {
771 memcpy((char *) mc_cmd->mc_list[i], dmi->dmi_addr, 6);
772 dmi = dmi->next;
773 }
774 p->scb->cbl_offset = make16(mc_cmd);
775 p->scb->cmd = CUC_START;
776 elmc_id_attn586();
777 s = jiffies;
778 while (!(mc_cmd->cmd_status & STAT_COMPL)) {
779 if (jiffies - s > 30*HZ/100)
780 break;
781 }
782 if (!(mc_cmd->cmd_status & STAT_COMPL)) {
783 printk(KERN_WARNING "%s: Can't apply multicast-address-list.\n", dev->name);
784 }
785 }
786 }
787
788
789
790 for (i = 0; i < NUM_XMIT_BUFFS; i++) {
791 p->xmit_cbuffs[i] = (char *) ptr;
792 ptr = (char *) ptr + XMIT_BUFF_SIZE;
793 p->xmit_buffs[i] = (struct tbd_struct *) ptr;
794 ptr = (char *) ptr + sizeof(struct tbd_struct);
795 if ((void *) ptr > (void *) p->iscp) {
796 printk(KERN_ERR "%s: not enough shared-mem for your configuration!\n", dev->name);
797 return 1;
798 }
799 memset((char *) (p->xmit_cmds[i]), 0, sizeof(struct transmit_cmd_struct));
800 memset((char *) (p->xmit_buffs[i]), 0, sizeof(struct tbd_struct));
801 p->xmit_cmds[i]->cmd_status = STAT_COMPL;
802 p->xmit_cmds[i]->cmd_cmd = CMD_XMIT | CMD_INT;
803 p->xmit_cmds[i]->tbd_offset = make16((p->xmit_buffs[i]));
804 p->xmit_buffs[i]->next = 0xffff;
805 p->xmit_buffs[i]->buffer = make24((p->xmit_cbuffs[i]));
806 }
807
808 p->xmit_count = 0;
809 p->xmit_last = 0;
810#ifndef NO_NOPCOMMANDS
811 p->nop_point = 0;
812#endif
813
814
815
816
817#ifndef NO_NOPCOMMANDS
818 p->scb->cbl_offset = make16(p->nop_cmds[0]);
819 p->scb->cmd = CUC_START;
820 elmc_id_attn586();
821 WAIT_4_SCB_CMD();
822#else
823 p->xmit_cmds[0]->cmd_link = 0xffff;
824 p->xmit_cmds[0]->cmd_cmd = CMD_XMIT | CMD_LAST | CMD_INT;
825#endif
826
827 return 0;
828}
829
830
831
832
833
834
835static void *alloc_rfa(struct net_device *dev, void *ptr)
836{
837 volatile struct rfd_struct *rfd = (struct rfd_struct *) ptr;
838 volatile struct rbd_struct *rbd;
839 int i;
840 struct priv *p = (struct priv *) dev->priv;
841
842 memset((char *) rfd, 0, sizeof(struct rfd_struct) * p->num_recv_buffs);
843 p->rfd_first = rfd;
844
845 for (i = 0; i < p->num_recv_buffs; i++) {
846 rfd[i].next = make16(rfd + (i + 1) % p->num_recv_buffs);
847 }
848 rfd[p->num_recv_buffs - 1].last = RFD_SUSP;
849
850 ptr = (void *) (rfd + p->num_recv_buffs);
851
852 rbd = (struct rbd_struct *) ptr;
853 ptr = (void *) (rbd + p->num_recv_buffs);
854
855
856 memset((char *) rbd, 0, sizeof(struct rbd_struct) * p->num_recv_buffs);
857
858 for (i = 0; i < p->num_recv_buffs; i++) {
859 rbd[i].next = make16((rbd + (i + 1) % p->num_recv_buffs));
860 rbd[i].size = RECV_BUFF_SIZE;
861 rbd[i].buffer = make24(ptr);
862 ptr = (char *) ptr + RECV_BUFF_SIZE;
863 }
864
865 p->rfd_top = p->rfd_first;
866 p->rfd_last = p->rfd_first + p->num_recv_buffs - 1;
867
868 p->scb->rfa_offset = make16(p->rfd_first);
869 p->rfd_first->rbd_offset = make16(rbd);
870
871 return ptr;
872}
873
874
875
876
877
878
879static irqreturn_t
880elmc_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr)
881{
882 struct net_device *dev = (struct net_device *) dev_id;
883 unsigned short stat;
884 struct priv *p;
885
886 if (dev == NULL) {
887 printk(KERN_ERR "elmc-interrupt: irq %d for unknown device.\n", (int) -(((struct pt_regs *) reg_ptr)->orig_eax + 2));
888 return IRQ_NONE;
889 } else if (!netif_running(dev)) {
890
891
892
893
894
895
896 elmc_id_attn586();
897 return IRQ_HANDLED;
898 } else if (!(ELMC_CTRL_INT & inb(dev->base_addr + ELMC_CTRL))) {
899
900 return IRQ_NONE;
901 }
902
903
904 p = (struct priv *) dev->priv;
905
906 while ((stat = p->scb->status & STAT_MASK))
907 {
908 p->scb->cmd = stat;
909 elmc_attn586();
910
911 if (stat & STAT_CX) {
912
913 elmc_xmt_int(dev);
914 }
915 if (stat & STAT_FR) {
916
917 elmc_rcv_int(dev);
918 }
919#ifndef NO_NOPCOMMANDS
920 if (stat & STAT_CNA) {
921
922 if (netif_running(dev)) {
923 printk(KERN_WARNING "%s: oops! CU has left active state. stat: %04x/%04x.\n", dev->name, (int) stat, (int) p->scb->status);
924 }
925 }
926#endif
927
928 if (stat & STAT_RNR) {
929
930
931 if (p->scb->status & RU_SUSPEND) {
932
933
934 WAIT_4_SCB_CMD();
935 p->scb->cmd = RUC_RESUME;
936 elmc_attn586();
937 } else {
938 printk(KERN_WARNING "%s: Receiver-Unit went 'NOT READY': %04x/%04x.\n", dev->name, (int) stat, (int) p->scb->status);
939 elmc_rnr_int(dev);
940 }
941 }
942 WAIT_4_SCB_CMD();
943 if (p->scb->cmd) {
944 break;
945 }
946 }
947 return IRQ_HANDLED;
948}
949
950
951
952
953
954static void elmc_rcv_int(struct net_device *dev)
955{
956 int status;
957 unsigned short totlen;
958 struct sk_buff *skb;
959 struct rbd_struct *rbd;
960 struct priv *p = (struct priv *) dev->priv;
961
962 for (; (status = p->rfd_top->status) & STAT_COMPL;) {
963 rbd = (struct rbd_struct *) make32(p->rfd_top->rbd_offset);
964
965 if (status & STAT_OK) {
966 if ((totlen = rbd->status) & RBD_LAST) {
967 totlen &= RBD_MASK;
968 rbd->status = 0;
969 skb = (struct sk_buff *) dev_alloc_skb(totlen + 2);
970 if (skb != NULL) {
971 skb->dev = dev;
972 skb_reserve(skb, 2);
973 skb_put(skb,totlen);
974 eth_copy_and_sum(skb, (char *) p->base+(unsigned long) rbd->buffer,totlen,0);
975 skb->protocol = eth_type_trans(skb, dev);
976 netif_rx(skb);
977 dev->last_rx = jiffies;
978 p->stats.rx_packets++;
979 p->stats.rx_bytes += totlen;
980 } else {
981 p->stats.rx_dropped++;
982 }
983 } else {
984 printk(KERN_WARNING "%s: received oversized frame.\n", dev->name);
985 p->stats.rx_dropped++;
986 }
987 } else {
988 printk(KERN_WARNING "%s: oops! rfd-error-status: %04x\n", dev->name, status);
989 p->stats.rx_errors++;
990 }
991 p->rfd_top->status = 0;
992 p->rfd_top->last = RFD_SUSP;
993 p->rfd_last->last = 0;
994 p->rfd_last = p->rfd_top;
995 p->rfd_top = (struct rfd_struct *) make32(p->rfd_top->next);
996 }
997}
998
999
1000
1001
1002
1003static void elmc_rnr_int(struct net_device *dev)
1004{
1005 struct priv *p = (struct priv *) dev->priv;
1006
1007 p->stats.rx_errors++;
1008
1009 WAIT_4_SCB_CMD();
1010 p->scb->cmd = RUC_ABORT;
1011 elmc_attn586();
1012 WAIT_4_SCB_CMD();
1013
1014 alloc_rfa(dev, (char *) p->rfd_first);
1015 startrecv586(dev);
1016
1017 printk(KERN_WARNING "%s: Receive-Unit restarted. Status: %04x\n", dev->name, p->scb->status);
1018
1019}
1020
1021
1022
1023
1024
1025static void elmc_xmt_int(struct net_device *dev)
1026{
1027 int status;
1028 struct priv *p = (struct priv *) dev->priv;
1029
1030 status = p->xmit_cmds[p->xmit_last]->cmd_status;
1031 if (!(status & STAT_COMPL)) {
1032 printk(KERN_WARNING "%s: strange .. xmit-int without a 'COMPLETE'\n", dev->name);
1033 }
1034 if (status & STAT_OK) {
1035 p->stats.tx_packets++;
1036 p->stats.collisions += (status & TCMD_MAXCOLLMASK);
1037 } else {
1038 p->stats.tx_errors++;
1039 if (status & TCMD_LATECOLL) {
1040 printk(KERN_WARNING "%s: late collision detected.\n", dev->name);
1041 p->stats.collisions++;
1042 } else if (status & TCMD_NOCARRIER) {
1043 p->stats.tx_carrier_errors++;
1044 printk(KERN_WARNING "%s: no carrier detected.\n", dev->name);
1045 } else if (status & TCMD_LOSTCTS) {
1046 printk(KERN_WARNING "%s: loss of CTS detected.\n", dev->name);
1047 } else if (status & TCMD_UNDERRUN) {
1048 p->stats.tx_fifo_errors++;
1049 printk(KERN_WARNING "%s: DMA underrun detected.\n", dev->name);
1050 } else if (status & TCMD_MAXCOLL) {
1051 printk(KERN_WARNING "%s: Max. collisions exceeded.\n", dev->name);
1052 p->stats.collisions += 16;
1053 }
1054 }
1055
1056#if (NUM_XMIT_BUFFS != 1)
1057 if ((++p->xmit_last) == NUM_XMIT_BUFFS) {
1058 p->xmit_last = 0;
1059 }
1060#endif
1061
1062 netif_wake_queue(dev);
1063}
1064
1065
1066
1067
1068
1069static void startrecv586(struct net_device *dev)
1070{
1071 struct priv *p = (struct priv *) dev->priv;
1072
1073 p->scb->rfa_offset = make16(p->rfd_first);
1074 p->scb->cmd = RUC_START;
1075 elmc_attn586();
1076 WAIT_4_SCB_CMD();
1077}
1078
1079
1080
1081
1082
1083static void elmc_timeout(struct net_device *dev)
1084{
1085 struct priv *p = (struct priv *) dev->priv;
1086
1087 if (p->scb->status & CU_ACTIVE) {
1088#ifdef DEBUG
1089 printk("%s: strange ... timeout with CU active?!?\n", dev->name);
1090 printk("%s: X0: %04x N0: %04x N1: %04x %d\n", dev->name, (int) p->xmit_cmds[0]->cmd_status, (int) p->nop_cmds[0]->cmd_status, (int) p->nop_cmds[1]->cmd_status, (int) p->nop_point);
1091#endif
1092 p->scb->cmd = CUC_ABORT;
1093 elmc_attn586();
1094 WAIT_4_SCB_CMD();
1095 p->scb->cbl_offset = make16(p->nop_cmds[p->nop_point]);
1096 p->scb->cmd = CUC_START;
1097 elmc_attn586();
1098 WAIT_4_SCB_CMD();
1099 netif_wake_queue(dev);
1100 } else {
1101#ifdef DEBUG
1102 printk("%s: xmitter timed out, try to restart! stat: %04x\n", dev->name, p->scb->status);
1103 printk("%s: command-stats: %04x %04x\n", dev->name, p->xmit_cmds[0]->cmd_status, p->xmit_cmds[1]->cmd_status);
1104#endif
1105 elmc_close(dev);
1106 elmc_open(dev);
1107 }
1108}
1109
1110
1111
1112
1113
1114static int elmc_send_packet(struct sk_buff *skb, struct net_device *dev)
1115{
1116 int len;
1117 int i;
1118#ifndef NO_NOPCOMMANDS
1119 int next_nop;
1120#endif
1121 struct priv *p = (struct priv *) dev->priv;
1122
1123 netif_stop_queue(dev);
1124
1125 len = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN;
1126
1127 if (len != skb->len)
1128 memset((char *) p->xmit_cbuffs[p->xmit_count], 0, ETH_ZLEN);
1129 memcpy((char *) p->xmit_cbuffs[p->xmit_count], (char *) (skb->data), skb->len);
1130
1131#if (NUM_XMIT_BUFFS == 1)
1132#ifdef NO_NOPCOMMANDS
1133 p->xmit_buffs[0]->size = TBD_LAST | len;
1134 for (i = 0; i < 16; i++) {
1135 p->scb->cbl_offset = make16(p->xmit_cmds[0]);
1136 p->scb->cmd = CUC_START;
1137 p->xmit_cmds[0]->cmd_status = 0;
1138 elmc_attn586();
1139 dev->trans_start = jiffies;
1140 if (!i) {
1141 dev_kfree_skb(skb);
1142 }
1143 WAIT_4_SCB_CMD();
1144 if ((p->scb->status & CU_ACTIVE)) {
1145 break;
1146 }
1147 if (p->xmit_cmds[0]->cmd_status) {
1148 break;
1149 }
1150 if (i == 15) {
1151 printk(KERN_WARNING "%s: Can't start transmit-command.\n", dev->name);
1152 }
1153 }
1154#else
1155 next_nop = (p->nop_point + 1) & 0x1;
1156 p->xmit_buffs[0]->size = TBD_LAST | len;
1157
1158 p->xmit_cmds[0]->cmd_link = p->nop_cmds[next_nop]->cmd_link
1159 = make16((p->nop_cmds[next_nop]));
1160 p->xmit_cmds[0]->cmd_status = p->nop_cmds[next_nop]->cmd_status = 0;
1161
1162 p->nop_cmds[p->nop_point]->cmd_link = make16((p->xmit_cmds[0]));
1163 dev->trans_start = jiffies;
1164 p->nop_point = next_nop;
1165 dev_kfree_skb(skb);
1166#endif
1167#else
1168 p->xmit_buffs[p->xmit_count]->size = TBD_LAST | len;
1169 if ((next_nop = p->xmit_count + 1) == NUM_XMIT_BUFFS) {
1170 next_nop = 0;
1171 }
1172 p->xmit_cmds[p->xmit_count]->cmd_status = 0;
1173 p->xmit_cmds[p->xmit_count]->cmd_link = p->nop_cmds[next_nop]->cmd_link
1174 = make16((p->nop_cmds[next_nop]));
1175 p->nop_cmds[next_nop]->cmd_status = 0;
1176 p->nop_cmds[p->xmit_count]->cmd_link = make16((p->xmit_cmds[p->xmit_count]));
1177 dev->trans_start = jiffies;
1178 p->xmit_count = next_nop;
1179 if (p->xmit_count != p->xmit_last)
1180 netif_wake_queue(dev);
1181 dev_kfree_skb(skb);
1182#endif
1183 return 0;
1184}
1185
1186
1187
1188
1189
1190static struct net_device_stats *elmc_get_stats(struct net_device *dev)
1191{
1192 struct priv *p = (struct priv *) dev->priv;
1193 unsigned short crc, aln, rsc, ovrn;
1194
1195 crc = p->scb->crc_errs;
1196 p->scb->crc_errs -= crc;
1197 aln = p->scb->aln_errs;
1198 p->scb->aln_errs -= aln;
1199 rsc = p->scb->rsc_errs;
1200 p->scb->rsc_errs -= rsc;
1201 ovrn = p->scb->ovrn_errs;
1202 p->scb->ovrn_errs -= ovrn;
1203
1204 p->stats.rx_crc_errors += crc;
1205 p->stats.rx_fifo_errors += ovrn;
1206 p->stats.rx_frame_errors += aln;
1207 p->stats.rx_dropped += rsc;
1208
1209 return &p->stats;
1210}
1211
1212
1213
1214
1215
1216#ifdef ELMC_MULTICAST
1217static void set_multicast_list(struct net_device *dev)
1218{
1219 if (!dev->start) {
1220
1221 return;
1222 }
1223 dev->start = 0;
1224 alloc586(dev);
1225 init586(dev);
1226 startrecv586(dev);
1227 dev->start = 1;
1228}
1229#endif
1230
1231static void netdev_get_drvinfo(struct net_device *dev,
1232 struct ethtool_drvinfo *info)
1233{
1234 strcpy(info->driver, DRV_NAME);
1235 strcpy(info->version, DRV_VERSION);
1236 sprintf(info->bus_info, "MCA 0x%lx", dev->base_addr);
1237}
1238
1239static struct ethtool_ops netdev_ethtool_ops = {
1240 .get_drvinfo = netdev_get_drvinfo,
1241};
1242
1243#ifdef MODULE
1244
1245
1246#define MAX_3C523_CARDS 4
1247
1248static struct net_device dev_elmc[MAX_3C523_CARDS];
1249static int irq[MAX_3C523_CARDS];
1250static int io[MAX_3C523_CARDS];
1251MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_3C523_CARDS) "i");
1252MODULE_PARM(io, "1-" __MODULE_STRING(MAX_3C523_CARDS) "i");
1253MODULE_PARM_DESC(io, "EtherLink/MC I/O base address(es)");
1254MODULE_PARM_DESC(irq, "EtherLink/MC IRQ number(s)");
1255
1256int init_module(void)
1257{
1258 int this_dev,found = 0;
1259
1260
1261 for(this_dev=0; this_dev<MAX_3C523_CARDS; this_dev++)
1262 {
1263 struct net_device *dev = &dev_elmc[this_dev];
1264 dev->irq=irq[this_dev];
1265 dev->base_addr=io[this_dev];
1266 dev->init=elmc_probe;
1267 if(register_netdev(dev)!=0) {
1268 if(io[this_dev]==0) break;
1269 printk(KERN_WARNING "3c523.c: No 3c523 card found at io=%#x\n",io[this_dev]);
1270 } else found++;
1271 }
1272
1273 if(found==0) {
1274 if(io[0]==0) printk(KERN_NOTICE "3c523.c: No 3c523 cards found\n");
1275 return -ENXIO;
1276 } else return 0;
1277}
1278
1279void cleanup_module(void)
1280{
1281 int this_dev;
1282 for(this_dev=0; this_dev<MAX_3C523_CARDS; this_dev++) {
1283
1284 struct net_device *dev = &dev_elmc[this_dev];
1285 if(dev->priv) {
1286
1287 elmc_id_reset586();
1288 if (dev->irq != 0) {
1289
1290
1291 free_irq(dev->irq, dev);
1292 dev->irq = 0;
1293 }
1294 if (dev->base_addr != 0) {
1295 release_region(dev->base_addr, ELMC_IO_EXTENT);
1296 dev->base_addr = 0;
1297 }
1298 irq[this_dev] = 0;
1299 io[this_dev] = 0;
1300 unregister_netdev(dev);
1301
1302 mca_set_adapter_procfn(((struct priv *) (dev->priv))->slot,
1303 NULL, NULL);
1304
1305 kfree(dev->priv);
1306 dev->priv = NULL;
1307 }
1308 }
1309}
1310
1311#endif
1312