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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
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
238#include <linux/config.h>
239#include <linux/module.h>
240#include <linux/kernel.h>
241#include <linux/string.h>
242#include <linux/errno.h>
243#include <linux/ioport.h>
244#include <linux/slab.h>
245#include <linux/interrupt.h>
246#include <linux/delay.h>
247#include <linux/init.h>
248#include <linux/crc32.h>
249#include <linux/netdevice.h>
250#include <linux/etherdevice.h>
251#include <linux/skbuff.h>
252#include <linux/time.h>
253#include <linux/types.h>
254#include <linux/unistd.h>
255#include <linux/ctype.h>
256#include <linux/moduleparam.h>
257#include <linux/device.h>
258
259#include <asm/uaccess.h>
260#include <asm/bitops.h>
261#include <asm/io.h>
262#include <asm/dma.h>
263
264#ifdef CONFIG_MCA
265#include <linux/mca.h>
266#endif
267
268#ifdef CONFIG_EISA
269#include <linux/eisa.h>
270#endif
271
272#include "depca.h"
273
274static char version[] __initdata = "depca.c:v0.53 2001/1/12 davies@maniac.ultranet.com\n";
275
276#ifdef DEPCA_DEBUG
277static int depca_debug = DEPCA_DEBUG;
278#else
279static int depca_debug = 1;
280#endif
281
282#define DEPCA_NDA 0xffe0
283
284#define TX_TIMEOUT (1*HZ)
285
286
287
288
289#define PROBE_LENGTH 32
290#define ETH_PROM_SIG 0xAA5500FFUL
291
292
293
294
295
296
297
298
299#define NUM_RX_DESC 8
300#define NUM_TX_DESC 8
301#define RX_BUFF_SZ 1536
302#define TX_BUFF_SZ 1536
303
304
305
306
307#define DEPCA_EISA_IO_PORTS 0x0c00
308
309
310
311
312#define DEPCA_RAM_BASE_ADDRESSES {0xc0000,0xd0000,0xe0000,0x00000}
313#define DEPCA_TOTAL_SIZE 0x10
314
315static struct {
316 u_long iobase;
317 struct platform_device *device;
318} depca_io_ports[] = {
319 { 0x300, NULL },
320 { 0x200, NULL },
321 { 0 , NULL },
322};
323
324
325
326
327#define DEPCA_SIGNATURE {"DEPCA",\
328 "DE100","DE101",\
329 "DE200","DE201","DE202",\
330 "DE210","DE212",\
331 "DE422",\
332 ""}
333
334static char* __initdata depca_signature[] = DEPCA_SIGNATURE;
335
336enum depca_type {
337 DEPCA, de100, de101, de200, de201, de202, de210, de212, de422, unknown
338};
339
340static char depca_string[] = "depca";
341
342static int depca_device_remove (struct device *device);
343
344#ifdef CONFIG_EISA
345struct eisa_device_id depca_eisa_ids[] = {
346 { "DEC4220", de422 },
347 { "" }
348};
349
350static int depca_eisa_probe (struct device *device);
351
352struct eisa_driver depca_eisa_driver = {
353 .id_table = depca_eisa_ids,
354 .driver = {
355 .name = depca_string,
356 .probe = depca_eisa_probe,
357 .remove = __devexit_p (depca_device_remove)
358 }
359};
360#endif
361
362#ifdef CONFIG_MCA
363
364
365
366#define DE210_ID 0x628d
367#define DE212_ID 0x6def
368
369static short depca_mca_adapter_ids[] = {
370 DE210_ID,
371 DE212_ID,
372 0x0000
373};
374
375static char *depca_mca_adapter_name[] = {
376 "DEC EtherWORKS MC Adapter (DE210)",
377 "DEC EtherWORKS MC Adapter (DE212)",
378 NULL
379};
380
381static enum depca_type depca_mca_adapter_type[] = {
382 de210,
383 de212,
384 0
385};
386
387static int depca_mca_probe (struct device *);
388
389static struct mca_driver depca_mca_driver = {
390 .id_table = depca_mca_adapter_ids,
391 .driver = {
392 .name = depca_string,
393 .bus = &mca_bus_type,
394 .probe = depca_mca_probe,
395 .remove = __devexit_p(depca_device_remove),
396 },
397};
398#endif
399
400static int depca_isa_probe (struct device *);
401
402static struct device_driver depca_isa_driver = {
403 .name = depca_string,
404 .bus = &platform_bus_type,
405 .probe = depca_isa_probe,
406 .remove = __devexit_p(depca_device_remove),
407};
408
409
410
411
412#define DEPCA_STRLEN 16
413
414
415
416
417
418
419
420#define DEPCA_ALIGN4 ((u_long)4 - 1)
421#define DEPCA_ALIGN8 ((u_long)8 - 1)
422#define DEPCA_ALIGN DEPCA_ALIGN8
423
424
425
426
427struct depca_rx_desc {
428 volatile s32 base;
429 s16 buf_length;
430 s16 msg_length;
431};
432
433struct depca_tx_desc {
434 volatile s32 base;
435 s16 length;
436 s16 misc;
437};
438
439#define LA_MASK 0x0000ffff
440
441
442
443
444
445struct depca_init {
446 u16 mode;
447 u8 phys_addr[ETH_ALEN];
448 u8 mcast_table[8];
449 u32 rx_ring;
450 u32 tx_ring;
451};
452
453#define DEPCA_PKT_STAT_SZ 16
454#define DEPCA_PKT_BIN_SZ 128
455
456struct depca_private {
457 char adapter_name[DEPCA_STRLEN];
458 enum depca_type adapter;
459 enum {
460 DEPCA_BUS_MCA = 1,
461 DEPCA_BUS_ISA,
462 DEPCA_BUS_EISA,
463 } depca_bus;
464 struct depca_init init_block;
465
466 struct depca_rx_desc *rx_ring;
467 struct depca_tx_desc *tx_ring;
468 void *rx_buff[NUM_RX_DESC];
469 void *tx_buff[NUM_TX_DESC];
470 void *sh_mem;
471 u_long mem_start;
472 u_long mem_len;
473
474 u_long device_ram_start;
475
476 u_long rx_ring_offset;
477 u_long tx_ring_offset;
478 u_long buffs_offset;
479
480 int rx_new, tx_new;
481 int rx_old, tx_old;
482 struct net_device_stats stats;
483 spinlock_t lock;
484 struct {
485 u32 bins[DEPCA_PKT_STAT_SZ];
486 u32 unicast;
487 u32 multicast;
488 u32 broadcast;
489 u32 excessive_collisions;
490 u32 tx_underruns;
491 u32 excessive_underruns;
492 } pktStats;
493 int txRingMask;
494 int rxRingMask;
495 s32 rx_rlen;
496 s32 tx_rlen;
497};
498
499
500
501
502
503
504
505
506#define TX_BUFFS_AVAIL ((lp->tx_old<=lp->tx_new)?\
507 lp->tx_old+lp->txRingMask-lp->tx_new:\
508 lp->tx_old -lp->tx_new-1)
509
510
511
512
513static int depca_open(struct net_device *dev);
514static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev);
515static irqreturn_t depca_interrupt(int irq, void *dev_id, struct pt_regs *regs);
516static int depca_close(struct net_device *dev);
517static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
518static void depca_tx_timeout(struct net_device *dev);
519static struct net_device_stats *depca_get_stats(struct net_device *dev);
520static void set_multicast_list(struct net_device *dev);
521
522
523
524
525static void depca_init_ring(struct net_device *dev);
526static int depca_rx(struct net_device *dev);
527static int depca_tx(struct net_device *dev);
528
529static void LoadCSRs(struct net_device *dev);
530static int InitRestartDepca(struct net_device *dev);
531static int DepcaSignature(char *name, u_long paddr);
532static int DevicePresent(u_long ioaddr);
533static int get_hw_addr(struct net_device *dev);
534static void SetMulticastFilter(struct net_device *dev);
535static int load_packet(struct net_device *dev, struct sk_buff *skb);
536static void depca_dbg_open(struct net_device *dev);
537
538static u_char de1xx_irq[] __initdata = { 2, 3, 4, 5, 7, 9, 0 };
539static u_char de2xx_irq[] __initdata = { 5, 9, 10, 11, 15, 0 };
540static u_char de422_irq[] __initdata = { 5, 9, 10, 11, 0 };
541static u_char *depca_irq;
542
543static int irq;
544static int io;
545static char *adapter_name;
546static int mem;
547
548module_param (irq, int, 0);
549module_param (io, int, 0);
550module_param (adapter_name, charp, 0);
551module_param (mem, int, 0);
552MODULE_PARM_DESC(irq, "DEPCA IRQ number");
553MODULE_PARM_DESC(io, "DEPCA I/O base address");
554MODULE_PARM_DESC(adapter_name, "DEPCA adapter name");
555MODULE_PARM_DESC(mem, "DEPCA shared memory address");
556MODULE_LICENSE("GPL");
557
558
559
560
561#define STOP_DEPCA \
562 outw(CSR0, DEPCA_ADDR);\
563 outw(STOP, DEPCA_DATA)
564
565static int __init depca_hw_init (struct net_device *dev, struct device *device)
566{
567 struct depca_private *lp;
568 int i, j, offset, netRAM, mem_len, status = 0;
569 s16 nicsr;
570 u_long ioaddr;
571 u_long mem_start;
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587 ioaddr = dev->base_addr;
588
589 STOP_DEPCA;
590
591 nicsr = inb(DEPCA_NICSR);
592 nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
593 outb(nicsr, DEPCA_NICSR);
594
595 if (inw(DEPCA_DATA) != STOP) {
596 return -ENXIO;
597 }
598
599 lp = (struct depca_private *) dev->priv;
600 mem_start = lp->mem_start;
601
602 if (!mem_start || lp->adapter < DEPCA || lp->adapter >=unknown)
603 return -ENXIO;
604
605 printk ("%s: %s at 0x%04lx",
606 device->bus_id, depca_signature[lp->adapter], ioaddr);
607
608 switch (lp->depca_bus) {
609#ifdef CONFIG_MCA
610 case DEPCA_BUS_MCA:
611 printk(" (MCA slot %d)", to_mca_device(device)->slot + 1);
612 break;
613#endif
614
615#ifdef CONFIG_EISA
616 case DEPCA_BUS_EISA:
617 printk(" (EISA slot %d)", to_eisa_device(device)->slot);
618 break;
619#endif
620
621 case DEPCA_BUS_ISA:
622 break;
623
624 default:
625 printk("Unknown DEPCA bus %d\n", lp->depca_bus);
626 return -ENXIO;
627 }
628
629 printk(", h/w address ");
630 status = get_hw_addr(dev);
631 if (status != 0) {
632 printk(" which has an Ethernet PROM CRC error.\n");
633 return -ENXIO;
634 }
635 for (i = 0; i < ETH_ALEN - 1; i++) {
636 printk("%2.2x:", dev->dev_addr[i]);
637 }
638 printk("%2.2x", dev->dev_addr[i]);
639
640
641 netRAM = ((lp->adapter != DEPCA) ? 64 : 48);
642 if ((nicsr & _128KB) && (lp->adapter == de422))
643 netRAM = 128;
644
645
646 if (nicsr & BUF) {
647 nicsr &= ~BS;
648 netRAM -= 32;
649
650
651 if (lp->depca_bus != DEPCA_BUS_MCA)
652 mem_start += 0x8000;
653 }
654
655 if ((mem_len = (NUM_RX_DESC * (sizeof(struct depca_rx_desc) + RX_BUFF_SZ) + NUM_TX_DESC * (sizeof(struct depca_tx_desc) + TX_BUFF_SZ) + sizeof(struct depca_init)))
656 > (netRAM << 10)) {
657 printk(",\n requests %dkB RAM: only %dkB is available!\n", (mem_len >> 10), netRAM);
658 return -ENXIO;
659 }
660
661 printk(",\n has %dkB RAM at 0x%.5lx", netRAM, mem_start);
662
663
664 if (lp->adapter != DEPCA) {
665 nicsr |= SHE;
666 outb(nicsr, DEPCA_NICSR);
667 }
668
669 lp->lock = SPIN_LOCK_UNLOCKED;
670 sprintf(lp->adapter_name, "%s (%s)",
671 depca_signature[lp->adapter], device->bus_id);
672 status = -EBUSY;
673
674
675 if (!request_mem_region (mem_start, mem_len, lp->adapter_name)) {
676 printk(KERN_ERR "depca: cannot request ISA memory, aborting\n");
677 goto out_priv;
678 }
679
680 status = -EIO;
681 lp->sh_mem = ioremap(mem_start, mem_len);
682 if (lp->sh_mem == NULL) {
683 printk(KERN_ERR "depca: cannot remap ISA memory, aborting\n");
684 release_mem_region (mem_start, mem_len);
685 goto out_priv;
686 }
687
688 lp->mem_start = mem_start;
689 lp->mem_len = mem_len;
690 lp->device_ram_start = mem_start & LA_MASK;
691
692 offset = 0;
693 offset += sizeof(struct depca_init);
694
695
696 offset = (offset + DEPCA_ALIGN) & ~DEPCA_ALIGN;
697 lp->rx_ring = (struct depca_rx_desc *) (lp->sh_mem + offset);
698 lp->rx_ring_offset = offset;
699
700 offset += (sizeof(struct depca_rx_desc) * NUM_RX_DESC);
701 lp->tx_ring = (struct depca_tx_desc *) (lp->sh_mem + offset);
702 lp->tx_ring_offset = offset;
703
704 offset += (sizeof(struct depca_tx_desc) * NUM_TX_DESC);
705
706 lp->buffs_offset = offset;
707
708
709 lp->rxRingMask = NUM_RX_DESC - 1;
710 lp->txRingMask = NUM_TX_DESC - 1;
711
712
713 for (i = 0, j = lp->rxRingMask; j > 0; i++) {
714 j >>= 1;
715 }
716 lp->rx_rlen = (s32) (i << 29);
717 for (i = 0, j = lp->txRingMask; j > 0; i++) {
718 j >>= 1;
719 }
720 lp->tx_rlen = (s32) (i << 29);
721
722
723 depca_init_ring(dev);
724
725
726 LoadCSRs(dev);
727
728
729 nicsr = ((nicsr & ~IM) | IEN);
730 outb(nicsr, DEPCA_NICSR);
731
732
733
734 if (dev->irq < 2) {
735 unsigned char irqnum;
736 unsigned long irq_mask, delay;
737
738 irq_mask = probe_irq_on();
739
740
741 switch (lp->adapter) {
742 case DEPCA:
743 case de100:
744 case de101:
745 depca_irq = de1xx_irq;
746 break;
747 case de200:
748 case de201:
749 case de202:
750 case de210:
751 case de212:
752 depca_irq = de2xx_irq;
753 break;
754 case de422:
755 depca_irq = de422_irq;
756 break;
757
758 default:
759 break;
760 }
761
762
763 outw(INEA | INIT, DEPCA_DATA);
764
765 delay = jiffies + HZ/50;
766 while (time_before(jiffies, delay))
767 yield();
768
769 irqnum = probe_irq_off(irq_mask);
770
771 status = -ENXIO;
772 if (!irqnum) {
773 printk(" and failed to detect IRQ line.\n");
774 goto out_priv;
775 } else {
776 for (dev->irq = 0, i = 0; (depca_irq[i]) && (!dev->irq); i++)
777 if (irqnum == depca_irq[i]) {
778 dev->irq = irqnum;
779 printk(" and uses IRQ%d.\n", dev->irq);
780 }
781
782 if (!dev->irq) {
783 printk(" but incorrect IRQ line detected.\n");
784 return -ENXIO;
785 }
786 }
787 } else {
788 printk(" and assigned IRQ%d.\n", dev->irq);
789 }
790
791 if (depca_debug > 1) {
792 printk(version);
793 }
794
795
796 dev->open = &depca_open;
797 dev->hard_start_xmit = &depca_start_xmit;
798 dev->stop = &depca_close;
799 dev->get_stats = &depca_get_stats;
800 dev->set_multicast_list = &set_multicast_list;
801 dev->do_ioctl = &depca_ioctl;
802 dev->tx_timeout = depca_tx_timeout;
803 dev->watchdog_timeo = TX_TIMEOUT;
804
805 dev->mem_start = 0;
806
807 device->driver_data = dev;
808 SET_NETDEV_DEV (dev, device);
809
810 register_netdev (dev);
811 return 0;
812
813 out_priv:
814
815 return status;
816}
817
818
819static int depca_open(struct net_device *dev)
820{
821 struct depca_private *lp = (struct depca_private *) dev->priv;
822 u_long ioaddr = dev->base_addr;
823 s16 nicsr;
824 int status = 0;
825
826 STOP_DEPCA;
827 nicsr = inb(DEPCA_NICSR);
828
829
830 if (lp->adapter != DEPCA) {
831 nicsr |= SHE;
832 outb(nicsr, DEPCA_NICSR);
833 }
834
835
836 depca_init_ring(dev);
837 LoadCSRs(dev);
838
839 depca_dbg_open(dev);
840
841 if (request_irq(dev->irq, &depca_interrupt, 0, lp->adapter_name, dev)) {
842 printk("depca_open(): Requested IRQ%d is busy\n", dev->irq);
843 status = -EAGAIN;
844 } else {
845
846
847 nicsr = ((nicsr & ~IM & ~LED) | IEN);
848 outb(nicsr, DEPCA_NICSR);
849 outw(CSR0, DEPCA_ADDR);
850
851 netif_start_queue(dev);
852
853 status = InitRestartDepca(dev);
854
855 if (depca_debug > 1) {
856 printk("CSR0: 0x%4.4x\n", inw(DEPCA_DATA));
857 printk("nicsr: 0x%02x\n", inb(DEPCA_NICSR));
858 }
859 }
860 return status;
861}
862
863
864static void depca_init_ring(struct net_device *dev)
865{
866 struct depca_private *lp = (struct depca_private *) dev->priv;
867 u_int i;
868 u_long offset;
869
870
871 netif_stop_queue(dev);
872
873 lp->rx_new = lp->tx_new = 0;
874 lp->rx_old = lp->tx_old = 0;
875
876
877 for (i = 0; i <= lp->rxRingMask; i++) {
878 offset = lp->buffs_offset + i * RX_BUFF_SZ;
879 writel((lp->device_ram_start + offset) | R_OWN, &lp->rx_ring[i].base);
880 writew(-RX_BUFF_SZ, &lp->rx_ring[i].buf_length);
881 lp->rx_buff[i] = lp->sh_mem + offset;
882 }
883
884 for (i = 0; i <= lp->txRingMask; i++) {
885 offset = lp->buffs_offset + (i + lp->rxRingMask + 1) * TX_BUFF_SZ;
886 writel((lp->device_ram_start + offset) & 0x00ffffff, &lp->tx_ring[i].base);
887 lp->tx_buff[i] = lp->sh_mem + offset;
888 }
889
890
891 lp->init_block.rx_ring = (lp->device_ram_start + lp->rx_ring_offset) | lp->rx_rlen;
892 lp->init_block.tx_ring = (lp->device_ram_start + lp->tx_ring_offset) | lp->tx_rlen;
893
894 SetMulticastFilter(dev);
895
896 for (i = 0; i < ETH_ALEN; i++) {
897 lp->init_block.phys_addr[i] = dev->dev_addr[i];
898 }
899
900 lp->init_block.mode = 0x0000;
901}
902
903
904static void depca_tx_timeout(struct net_device *dev)
905{
906 u_long ioaddr = dev->base_addr;
907
908 printk("%s: transmit timed out, status %04x, resetting.\n", dev->name, inw(DEPCA_DATA));
909
910 STOP_DEPCA;
911 depca_init_ring(dev);
912 LoadCSRs(dev);
913 dev->trans_start = jiffies;
914 netif_wake_queue(dev);
915 InitRestartDepca(dev);
916}
917
918
919
920
921
922static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev)
923{
924 struct depca_private *lp = (struct depca_private *) dev->priv;
925 u_long ioaddr = dev->base_addr;
926 int status = 0;
927
928
929 if (skb->len < 1)
930 goto out;
931
932 if (skb->len < ETH_ZLEN) {
933 skb = skb_padto(skb, ETH_ZLEN);
934 if (skb == NULL)
935 goto out;
936 }
937
938 netif_stop_queue(dev);
939
940 if (TX_BUFFS_AVAIL) {
941 status = load_packet(dev, skb);
942
943 if (!status) {
944
945 outw(CSR0, DEPCA_ADDR);
946 outw(INEA | TDMD, DEPCA_DATA);
947
948 dev->trans_start = jiffies;
949 dev_kfree_skb(skb);
950 }
951 if (TX_BUFFS_AVAIL)
952 netif_start_queue(dev);
953 } else
954 status = -1;
955
956 out:
957 return status;
958}
959
960
961
962
963static irqreturn_t depca_interrupt(int irq, void *dev_id, struct pt_regs *regs)
964{
965 struct net_device *dev = dev_id;
966 struct depca_private *lp;
967 s16 csr0, nicsr;
968 u_long ioaddr;
969
970 if (dev == NULL) {
971 printk("depca_interrupt(): irq %d for unknown device.\n", irq);
972 return IRQ_NONE;
973 }
974
975 lp = (struct depca_private *) dev->priv;
976 ioaddr = dev->base_addr;
977
978 spin_lock(&lp->lock);
979
980
981 nicsr = inb(DEPCA_NICSR);
982 nicsr |= (IM | LED);
983 outb(nicsr, DEPCA_NICSR);
984
985 outw(CSR0, DEPCA_ADDR);
986 csr0 = inw(DEPCA_DATA);
987
988
989 outw(csr0 & INTE, DEPCA_DATA);
990
991 if (csr0 & RINT)
992 depca_rx(dev);
993
994 if (csr0 & TINT)
995 depca_tx(dev);
996
997
998 if ((TX_BUFFS_AVAIL >= 0) && netif_queue_stopped(dev)) {
999 netif_wake_queue(dev);
1000 }
1001
1002
1003 nicsr = (nicsr & ~IM & ~LED);
1004 outb(nicsr, DEPCA_NICSR);
1005
1006 spin_unlock(&lp->lock);
1007 return IRQ_HANDLED;
1008}
1009
1010
1011static int depca_rx(struct net_device *dev)
1012{
1013 struct depca_private *lp = (struct depca_private *) dev->priv;
1014 int i, entry;
1015 s32 status;
1016
1017 for (entry = lp->rx_new; !(readl(&lp->rx_ring[entry].base) & R_OWN); entry = lp->rx_new) {
1018 status = readl(&lp->rx_ring[entry].base) >> 16;
1019 if (status & R_STP) {
1020 lp->rx_old = entry;
1021 }
1022 if (status & R_ENP) {
1023 if (status & R_ERR) {
1024 lp->stats.rx_errors++;
1025 if (status & R_FRAM)
1026 lp->stats.rx_frame_errors++;
1027 if (status & R_OFLO)
1028 lp->stats.rx_over_errors++;
1029 if (status & R_CRC)
1030 lp->stats.rx_crc_errors++;
1031 if (status & R_BUFF)
1032 lp->stats.rx_fifo_errors++;
1033 } else {
1034 short len, pkt_len = readw(&lp->rx_ring[entry].msg_length) - 4;
1035 struct sk_buff *skb;
1036
1037 skb = dev_alloc_skb(pkt_len + 2);
1038 if (skb != NULL) {
1039 unsigned char *buf;
1040 skb_reserve(skb, 2);
1041 buf = skb_put(skb, pkt_len);
1042 skb->dev = dev;
1043 if (entry < lp->rx_old) {
1044 len = (lp->rxRingMask - lp->rx_old + 1) * RX_BUFF_SZ;
1045 memcpy_fromio(buf, lp->rx_buff[lp->rx_old], len);
1046 memcpy_fromio(buf + len, lp->rx_buff[0], pkt_len - len);
1047 } else {
1048 memcpy_fromio(buf, lp->rx_buff[lp->rx_old], pkt_len);
1049 }
1050
1051
1052
1053
1054
1055 skb->protocol = eth_type_trans(skb, dev);
1056 netif_rx(skb);
1057
1058
1059
1060
1061 dev->last_rx = jiffies;
1062 lp->stats.rx_packets++;
1063 lp->stats.rx_bytes += pkt_len;
1064 for (i = 1; i < DEPCA_PKT_STAT_SZ - 1; i++) {
1065 if (pkt_len < (i * DEPCA_PKT_BIN_SZ)) {
1066 lp->pktStats.bins[i]++;
1067 i = DEPCA_PKT_STAT_SZ;
1068 }
1069 }
1070 if (buf[0] & 0x01) {
1071 if ((*(s16 *) & buf[0] == -1) && (*(s16 *) & buf[2] == -1) && (*(s16 *) & buf[4] == -1)) {
1072 lp->pktStats.broadcast++;
1073 } else {
1074 lp->pktStats.multicast++;
1075 }
1076 } else if ((*(s16 *) & buf[0] == *(s16 *) & dev->dev_addr[0]) && (*(s16 *) & buf[2] == *(s16 *) & dev->dev_addr[2]) && (*(s16 *) & buf[4] == *(s16 *) & dev->dev_addr[4])) {
1077 lp->pktStats.unicast++;
1078 }
1079
1080 lp->pktStats.bins[0]++;
1081 if (lp->pktStats.bins[0] == 0) {
1082 memset((char *) &lp->pktStats, 0, sizeof(lp->pktStats));
1083 }
1084 } else {
1085 printk("%s: Memory squeeze, deferring packet.\n", dev->name);
1086 lp->stats.rx_dropped++;
1087 break;
1088 }
1089 }
1090
1091 for (; lp->rx_old != entry; lp->rx_old = (++lp->rx_old) & lp->rxRingMask) {
1092 writel(readl(&lp->rx_ring[lp->rx_old].base) | R_OWN, &lp->rx_ring[lp->rx_old].base);
1093 }
1094 writel(readl(&lp->rx_ring[entry].base) | R_OWN, &lp->rx_ring[entry].base);
1095 }
1096
1097
1098
1099
1100 lp->rx_new = (++lp->rx_new) & lp->rxRingMask;
1101 }
1102
1103 return 0;
1104}
1105
1106
1107
1108
1109
1110static int depca_tx(struct net_device *dev)
1111{
1112 struct depca_private *lp = (struct depca_private *) dev->priv;
1113 int entry;
1114 s32 status;
1115 u_long ioaddr = dev->base_addr;
1116
1117 for (entry = lp->tx_old; entry != lp->tx_new; entry = lp->tx_old) {
1118 status = readl(&lp->tx_ring[entry].base) >> 16;
1119
1120 if (status < 0) {
1121 break;
1122 } else if (status & T_ERR) {
1123 status = readl(&lp->tx_ring[entry].misc);
1124 lp->stats.tx_errors++;
1125 if (status & TMD3_RTRY)
1126 lp->stats.tx_aborted_errors++;
1127 if (status & TMD3_LCAR)
1128 lp->stats.tx_carrier_errors++;
1129 if (status & TMD3_LCOL)
1130 lp->stats.tx_window_errors++;
1131 if (status & TMD3_UFLO)
1132 lp->stats.tx_fifo_errors++;
1133 if (status & (TMD3_BUFF | TMD3_UFLO)) {
1134
1135 outw(CSR0, DEPCA_ADDR);
1136 outw(INEA | TDMD, DEPCA_DATA);
1137 }
1138 } else if (status & (T_MORE | T_ONE)) {
1139 lp->stats.collisions++;
1140 } else {
1141 lp->stats.tx_packets++;
1142 }
1143
1144
1145 lp->tx_old = (++lp->tx_old) & lp->txRingMask;
1146 }
1147
1148 return 0;
1149}
1150
1151static int depca_close(struct net_device *dev)
1152{
1153 struct depca_private *lp = (struct depca_private *) dev->priv;
1154 s16 nicsr;
1155 u_long ioaddr = dev->base_addr;
1156
1157 netif_stop_queue(dev);
1158
1159 outw(CSR0, DEPCA_ADDR);
1160
1161 if (depca_debug > 1) {
1162 printk("%s: Shutting down ethercard, status was %2.2x.\n", dev->name, inw(DEPCA_DATA));
1163 }
1164
1165
1166
1167
1168
1169 outw(STOP, DEPCA_DATA);
1170
1171
1172
1173
1174 if (lp->adapter != DEPCA) {
1175 nicsr = inb(DEPCA_NICSR);
1176 nicsr &= ~SHE;
1177 outb(nicsr, DEPCA_NICSR);
1178 }
1179
1180
1181
1182
1183 free_irq(dev->irq, dev);
1184 return 0;
1185}
1186
1187static void LoadCSRs(struct net_device *dev)
1188{
1189 struct depca_private *lp = (struct depca_private *) dev->priv;
1190 u_long ioaddr = dev->base_addr;
1191
1192 outw(CSR1, DEPCA_ADDR);
1193 outw((u16) lp->device_ram_start, DEPCA_DATA);
1194 outw(CSR2, DEPCA_ADDR);
1195 outw((u16) (lp->device_ram_start >> 16), DEPCA_DATA);
1196 outw(CSR3, DEPCA_ADDR);
1197 outw(ACON, DEPCA_DATA);
1198
1199 outw(CSR0, DEPCA_ADDR);
1200
1201 return;
1202}
1203
1204static int InitRestartDepca(struct net_device *dev)
1205{
1206 struct depca_private *lp = (struct depca_private *) dev->priv;
1207 u_long ioaddr = dev->base_addr;
1208 int i, status = 0;
1209
1210
1211 memcpy_toio(lp->sh_mem, &lp->init_block, sizeof(struct depca_init));
1212
1213 outw(CSR0, DEPCA_ADDR);
1214 outw(INIT, DEPCA_DATA);
1215
1216
1217 for (i = 0; (i < 100) && !(inw(DEPCA_DATA) & IDON); i++);
1218
1219 if (i != 100) {
1220
1221 outw(IDON | INEA | STRT, DEPCA_DATA);
1222 if (depca_debug > 2) {
1223 printk("%s: DEPCA open after %d ticks, init block 0x%08lx csr0 %4.4x.\n", dev->name, i, virt_to_phys(lp->sh_mem), inw(DEPCA_DATA));
1224 }
1225 } else {
1226 printk("%s: DEPCA unopen after %d ticks, init block 0x%08lx csr0 %4.4x.\n", dev->name, i, virt_to_phys(lp->sh_mem), inw(DEPCA_DATA));
1227 status = -1;
1228 }
1229
1230 return status;
1231}
1232
1233static struct net_device_stats *depca_get_stats(struct net_device *dev)
1234{
1235 struct depca_private *lp = (struct depca_private *) dev->priv;
1236
1237
1238
1239 return &lp->stats;
1240}
1241
1242
1243
1244
1245static void set_multicast_list(struct net_device *dev)
1246{
1247 struct depca_private *lp = (struct depca_private *) dev->priv;
1248 u_long ioaddr = dev->base_addr;
1249
1250 if (dev) {
1251 netif_stop_queue(dev);
1252 while (lp->tx_old != lp->tx_new);
1253
1254 STOP_DEPCA;
1255 depca_init_ring(dev);
1256
1257 if (dev->flags & IFF_PROMISC) {
1258 lp->init_block.mode |= PROM;
1259 } else {
1260 SetMulticastFilter(dev);
1261 lp->init_block.mode &= ~PROM;
1262 }
1263
1264 LoadCSRs(dev);
1265 InitRestartDepca(dev);
1266 netif_start_queue(dev);
1267 }
1268}
1269
1270
1271
1272
1273
1274
1275
1276static void SetMulticastFilter(struct net_device *dev)
1277{
1278 struct depca_private *lp = (struct depca_private *) dev->priv;
1279 struct dev_mc_list *dmi = dev->mc_list;
1280 char *addrs;
1281 int i, j, bit, byte;
1282 u16 hashcode;
1283 u32 crc;
1284
1285 if (dev->flags & IFF_ALLMULTI) {
1286 for (i = 0; i < (HASH_TABLE_LEN >> 3); i++) {
1287 lp->init_block.mcast_table[i] = (char) 0xff;
1288 }
1289 } else {
1290 for (i = 0; i < (HASH_TABLE_LEN >> 3); i++) {
1291 lp->init_block.mcast_table[i] = 0;
1292 }
1293
1294 for (i = 0; i < dev->mc_count; i++) {
1295 addrs = dmi->dmi_addr;
1296 dmi = dmi->next;
1297 if ((*addrs & 0x01) == 1) {
1298 crc = ether_crc(ETH_ALEN, addrs);
1299 hashcode = (crc & 1);
1300 for (j = 0; j < 5; j++) {
1301 hashcode = (hashcode << 1) | ((crc >>= 1) & 1);
1302 }
1303
1304
1305 byte = hashcode >> 3;
1306 bit = 1 << (hashcode & 0x07);
1307 lp->init_block.mcast_table[byte] |= bit;
1308 }
1309 }
1310 }
1311
1312 return;
1313}
1314
1315static int __init depca_common_init (u_long ioaddr, struct net_device **devp)
1316{
1317 int status = 0;
1318
1319 if (!request_region (ioaddr, DEPCA_TOTAL_SIZE, depca_string)) {
1320 status = -EBUSY;
1321 goto out;
1322 }
1323
1324 if (DevicePresent(ioaddr)) {
1325 status = -ENODEV;
1326 goto out_release;
1327 }
1328
1329 if (!(*devp = alloc_etherdev (sizeof (struct depca_private)))) {
1330 status = -ENOMEM;
1331 goto out_release;
1332 }
1333
1334 return 0;
1335
1336 out_release:
1337 release_region (ioaddr, DEPCA_TOTAL_SIZE);
1338 out:
1339 return status;
1340}
1341
1342#ifdef CONFIG_MCA
1343
1344
1345
1346static int __init depca_mca_probe(struct device *device)
1347{
1348 unsigned char pos[2];
1349 unsigned char where;
1350 unsigned long iobase, mem_start;
1351 int irq, err;
1352 struct mca_device *mdev = to_mca_device (device);
1353 struct net_device *dev;
1354 struct depca_private *lp;
1355
1356
1357
1358
1359
1360
1361
1362 pos[0] = mca_device_read_stored_pos(mdev, 2);
1363 pos[1] = mca_device_read_stored_pos(mdev, 3);
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374 where = (pos[0] & 6) >> 1;
1375 iobase = 0x2c00 + (0x10 * where);
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391 where = pos[1] & 0x0f;
1392 switch (where) {
1393 case 1:
1394 irq = 9;
1395 break;
1396 case 2:
1397 irq = 5;
1398 break;
1399 case 4:
1400 irq = 10;
1401 break;
1402 case 8:
1403 irq = 11;
1404 break;
1405 default:
1406 printk("%s: mca_probe IRQ error. You should never get here (%d).\n", dev->name, where);
1407 return -EINVAL;
1408 }
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423 where = (pos[0] & 0x18) >> 3;
1424 mem_start = 0xc0000 + (where * 0x10000);
1425 if (pos[0] & 0x20) {
1426 mem_start += 0x8000;
1427 }
1428
1429
1430 strncpy(mdev->name, depca_mca_adapter_name[mdev->index],
1431 sizeof(mdev->name));
1432 mca_device_set_claim(mdev, 1);
1433
1434
1435
1436
1437
1438 irq = mca_device_transform_irq(mdev, irq);
1439 iobase = mca_device_transform_ioport(mdev, iobase);
1440
1441 if ((err = depca_common_init (iobase, &dev)))
1442 goto out_unclaim;
1443
1444 dev->irq = irq;
1445 dev->base_addr = iobase;
1446 lp = dev->priv;
1447 lp->depca_bus = DEPCA_BUS_MCA;
1448 lp->adapter = depca_mca_adapter_type[mdev->index];
1449 lp->mem_start = mem_start;
1450
1451 if ((err = depca_hw_init(dev, device)))
1452 goto out_free;
1453
1454 return 0;
1455
1456 out_free:
1457 free_netdev (dev);
1458 release_region (iobase, DEPCA_TOTAL_SIZE);
1459 out_unclaim:
1460 mca_device_set_claim(mdev, 0);
1461
1462 return err;;
1463}
1464#endif
1465
1466
1467
1468
1469
1470static void depca_platform_release (struct device *device)
1471{
1472 struct platform_device *pldev;
1473
1474
1475 pldev = to_platform_device (device);
1476 kfree (pldev);
1477}
1478
1479static void __init depca_platform_probe (void)
1480{
1481 int i;
1482 struct platform_device *pldev;
1483
1484 for (i = 0; depca_io_ports[i].iobase; i++) {
1485 depca_io_ports[i].device = NULL;
1486
1487
1488
1489 if (io && io != depca_io_ports[i].iobase)
1490 continue;
1491
1492 if (!(pldev = kmalloc (sizeof (*pldev), GFP_KERNEL)))
1493 continue;
1494
1495 memset (pldev, 0, sizeof (*pldev));
1496 pldev->name = depca_string;
1497 pldev->id = i;
1498 pldev->dev.platform_data = (void *) depca_io_ports[i].iobase;
1499 pldev->dev.release = depca_platform_release;
1500 depca_io_ports[i].device = pldev;
1501
1502 if (platform_device_register (pldev)) {
1503 kfree (pldev);
1504 depca_io_ports[i].device = NULL;
1505 continue;
1506 }
1507
1508 if (!pldev->dev.driver) {
1509
1510
1511
1512
1513
1514 depca_io_ports[i].device = NULL;
1515 platform_device_unregister (pldev);
1516 }
1517 }
1518}
1519
1520static enum depca_type __init depca_shmem_probe (ulong *mem_start)
1521{
1522 u_long mem_base[] = DEPCA_RAM_BASE_ADDRESSES;
1523 enum depca_type adapter = unknown;
1524 int i;
1525
1526 for (i = 0; mem_base[i]; i++) {
1527 *mem_start = mem ? mem : mem_base[i];
1528 adapter = DepcaSignature (adapter_name, *mem_start);
1529 if (adapter != unknown)
1530 break;
1531 }
1532
1533 return adapter;
1534}
1535
1536static int __init depca_isa_probe (struct device *device)
1537{
1538 struct net_device *dev;
1539 struct depca_private *lp;
1540 u_long ioaddr, mem_start = 0;
1541 enum depca_type adapter = unknown;
1542 int status = 0;
1543
1544 ioaddr = (u_long) device->platform_data;
1545
1546 if ((status = depca_common_init (ioaddr, &dev)))
1547 goto out;
1548
1549 adapter = depca_shmem_probe (&mem_start);
1550
1551 if (adapter == unknown) {
1552 status = -ENODEV;
1553 goto out_free;
1554 }
1555
1556 dev->base_addr = ioaddr;
1557 dev->irq = irq;
1558
1559 lp = dev->priv;
1560 lp->depca_bus = DEPCA_BUS_ISA;
1561 lp->adapter = adapter;
1562 lp->mem_start = mem_start;
1563
1564 if ((status = depca_hw_init(dev, device)))
1565 goto out_free;
1566
1567 return 0;
1568
1569 out_free:
1570 free_netdev (dev);
1571 release_region (ioaddr, DEPCA_TOTAL_SIZE);
1572 out:
1573 return status;
1574}
1575
1576
1577
1578
1579
1580#ifdef CONFIG_EISA
1581static int __init depca_eisa_probe (struct device *device)
1582{
1583 struct eisa_device *edev;
1584 struct net_device *dev;
1585 struct depca_private *lp;
1586 u_long ioaddr, mem_start;
1587 int status = 0;
1588
1589 edev = to_eisa_device (device);
1590 ioaddr = edev->base_addr + DEPCA_EISA_IO_PORTS;
1591
1592 if ((status = depca_common_init (ioaddr, &dev)))
1593 goto out;
1594
1595
1596
1597
1598
1599
1600
1601 depca_shmem_probe (&mem_start);
1602
1603 dev->base_addr = ioaddr;
1604 dev->irq = irq;
1605 lp = dev->priv;
1606 lp->depca_bus = DEPCA_BUS_EISA;
1607 lp->adapter = edev->id.driver_data;
1608 lp->mem_start = mem_start;
1609
1610 if ((status = depca_hw_init(dev, device)))
1611 goto out_free;
1612
1613 return 0;
1614
1615 out_free:
1616 free_netdev (dev);
1617 release_region (ioaddr, DEPCA_TOTAL_SIZE);
1618 out:
1619 return status;
1620}
1621#endif
1622
1623static int __devexit depca_device_remove (struct device *device)
1624{
1625 struct net_device *dev;
1626 struct depca_private *lp;
1627 int bus;
1628
1629 dev = device->driver_data;
1630 lp = dev->priv;
1631
1632 unregister_netdev (dev);
1633 iounmap (lp->sh_mem);
1634 release_mem_region (lp->mem_start, lp->mem_len);
1635 release_region (dev->base_addr, DEPCA_TOTAL_SIZE);
1636 bus = lp->depca_bus;
1637 free_netdev (dev);
1638
1639 return 0;
1640}
1641
1642
1643
1644
1645
1646
1647static int __init DepcaSignature(char *name, u_long base_addr)
1648{
1649 u_int i, j, k;
1650 void *ptr;
1651 char tmpstr[16];
1652 u_long prom_addr = base_addr + 0xc000;
1653 u_long mem_addr = base_addr + 0x8000;
1654
1655
1656
1657
1658
1659
1660 if (!request_mem_region (mem_addr, 16, depca_string))
1661 return unknown;
1662
1663
1664
1665 ptr = ioremap(prom_addr, 16);
1666 if (ptr == NULL) {
1667 printk(KERN_ERR "depca: I/O remap failed at %lx\n", prom_addr);
1668 return unknown;
1669 }
1670 for (i = 0; i < 16; i++) {
1671 tmpstr[i] = readb(ptr + i);
1672 }
1673 iounmap(ptr);
1674
1675 release_mem_region (mem_addr, 16);
1676
1677
1678 for (i = 0; *depca_signature[i] != '\0'; i++) {
1679 for (j = 0, k = 0; j < 16 && k < strlen(depca_signature[i]); j++) {
1680 if (depca_signature[i][k] == tmpstr[j]) {
1681 k++;
1682 } else {
1683 k = 0;
1684 }
1685 }
1686 if (k == strlen(depca_signature[i]))
1687 break;
1688 }
1689
1690
1691 if (name && *name && (i == unknown)) {
1692 for (i = 0; *depca_signature[i] != '\0'; i++) {
1693 if (strcmp(name, depca_signature[i]) == 0)
1694 break;
1695 }
1696 }
1697
1698 return i;
1699}
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716static int __init DevicePresent(u_long ioaddr)
1717{
1718 union {
1719 struct {
1720 u32 a;
1721 u32 b;
1722 } llsig;
1723 char Sig[sizeof(u32) << 1];
1724 }
1725 dev;
1726 short sigLength = 0;
1727 s8 data;
1728 s16 nicsr;
1729 int i, j, status = 0;
1730
1731 data = inb(DEPCA_PROM);
1732 data = inb(DEPCA_PROM);
1733
1734 if (data == 0x08) {
1735 nicsr = inb(DEPCA_NICSR);
1736 nicsr |= AAC;
1737 outb(nicsr, DEPCA_NICSR);
1738 }
1739
1740 dev.llsig.a = ETH_PROM_SIG;
1741 dev.llsig.b = ETH_PROM_SIG;
1742 sigLength = sizeof(u32) << 1;
1743
1744 for (i = 0, j = 0; j < sigLength && i < PROBE_LENGTH + sigLength - 1; i++) {
1745 data = inb(DEPCA_PROM);
1746 if (dev.Sig[j] == data) {
1747 j++;
1748 } else {
1749 if (data == dev.Sig[0]) {
1750 j = 1;
1751 } else {
1752 j = 0;
1753 }
1754 }
1755 }
1756
1757 if (j != sigLength) {
1758 status = -ENODEV;
1759 }
1760
1761 return status;
1762}
1763
1764
1765
1766
1767
1768
1769static int __init get_hw_addr(struct net_device *dev)
1770{
1771 u_long ioaddr = dev->base_addr;
1772 struct depca_private *lp = dev->priv;
1773 int i, k, tmp, status = 0;
1774 u_short j, x, chksum;
1775
1776 x = (((lp->adapter == de100) || (lp->adapter == de101)) ? 1 : 0);
1777
1778 for (i = 0, k = 0, j = 0; j < 3; j++) {
1779 k <<= 1;
1780 if (k > 0xffff)
1781 k -= 0xffff;
1782
1783 k += (u_char) (tmp = inb(DEPCA_PROM + x));
1784 dev->dev_addr[i++] = (u_char) tmp;
1785 k += (u_short) ((tmp = inb(DEPCA_PROM + x)) << 8);
1786 dev->dev_addr[i++] = (u_char) tmp;
1787
1788 if (k > 0xffff)
1789 k -= 0xffff;
1790 }
1791 if (k == 0xffff)
1792 k = 0;
1793
1794 chksum = (u_char) inb(DEPCA_PROM + x);
1795 chksum |= (u_short) (inb(DEPCA_PROM + x) << 8);
1796 if (k != chksum)
1797 status = -1;
1798
1799 return status;
1800}
1801
1802
1803
1804
1805static int load_packet(struct net_device *dev, struct sk_buff *skb)
1806{
1807 struct depca_private *lp = (struct depca_private *) dev->priv;
1808 int i, entry, end, len, status = 0;
1809
1810 entry = lp->tx_new;
1811 end = (entry + (skb->len - 1) / TX_BUFF_SZ) & lp->txRingMask;
1812 if (!(readl(&lp->tx_ring[end].base) & T_OWN)) {
1813
1814
1815
1816
1817 if (end < entry) {
1818 len = (lp->txRingMask - entry + 1) * TX_BUFF_SZ;
1819 memcpy_toio(lp->tx_buff[entry], skb->data, len);
1820 memcpy_toio(lp->tx_buff[0], skb->data + len, skb->len - len);
1821 } else {
1822 memcpy_toio(lp->tx_buff[entry], skb->data, skb->len);
1823 }
1824
1825
1826 len = (skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len;
1827 for (i = entry; i != end; i = (++i) & lp->txRingMask) {
1828
1829 writel(readl(&lp->tx_ring[i].base) & ~T_FLAGS, &lp->tx_ring[i].base);
1830 writew(0x0000, &lp->tx_ring[i].misc);
1831 writew(-TX_BUFF_SZ, &lp->tx_ring[i].length);
1832 len -= TX_BUFF_SZ;
1833 }
1834
1835 writel(readl(&lp->tx_ring[end].base) & ~T_FLAGS, &lp->tx_ring[end].base);
1836 writew(0x0000, &lp->tx_ring[end].misc);
1837 writew(-len, &lp->tx_ring[end].length);
1838
1839
1840 writel(readl(&lp->tx_ring[entry].base) | T_STP, &lp->tx_ring[entry].base);
1841
1842 writel(readl(&lp->tx_ring[end].base) | T_ENP, &lp->tx_ring[end].base);
1843
1844 for (i = end; i != entry; --i) {
1845
1846 writel(readl(&lp->tx_ring[i].base) | T_OWN, &lp->tx_ring[i].base);
1847 if (i == 0)
1848 i = lp->txRingMask + 1;
1849 }
1850 writel(readl(&lp->tx_ring[entry].base) | T_OWN, &lp->tx_ring[entry].base);
1851
1852 lp->tx_new = (++end) & lp->txRingMask;
1853 } else {
1854 status = -1;
1855 }
1856
1857 return status;
1858}
1859
1860static void depca_dbg_open(struct net_device *dev)
1861{
1862 struct depca_private *lp = (struct depca_private *) dev->priv;
1863 u_long ioaddr = dev->base_addr;
1864 struct depca_init *p = &lp->init_block;
1865 int i;
1866
1867 if (depca_debug > 1) {
1868
1869
1870
1871 printk("%s: depca open with irq %d\n", dev->name, dev->irq);
1872 printk("Descriptor head addresses (CPU):\n");
1873 printk(" 0x%lx 0x%lx\n", (u_long) lp->rx_ring, (u_long) lp->tx_ring);
1874 printk("Descriptor addresses (CPU):\nRX: ");
1875 for (i = 0; i < lp->rxRingMask; i++) {
1876 if (i < 3) {
1877 printk("0x%8.8lx ", (long) &lp->rx_ring[i].base);
1878 }
1879 }
1880 printk("...0x%8.8lx\n", (long) &lp->rx_ring[i].base);
1881 printk("TX: ");
1882 for (i = 0; i < lp->txRingMask; i++) {
1883 if (i < 3) {
1884 printk("0x%8.8lx ", (long) &lp->tx_ring[i].base);
1885 }
1886 }
1887 printk("...0x%8.8lx\n", (long) &lp->tx_ring[i].base);
1888 printk("\nDescriptor buffers (Device):\nRX: ");
1889 for (i = 0; i < lp->rxRingMask; i++) {
1890 if (i < 3) {
1891 printk("0x%8.8x ", readl(&lp->rx_ring[i].base));
1892 }
1893 }
1894 printk("...0x%8.8x\n", readl(&lp->rx_ring[i].base));
1895 printk("TX: ");
1896 for (i = 0; i < lp->txRingMask; i++) {
1897 if (i < 3) {
1898 printk("0x%8.8x ", readl(&lp->tx_ring[i].base));
1899 }
1900 }
1901 printk("...0x%8.8x\n", readl(&lp->tx_ring[i].base));
1902 printk("Initialisation block at 0x%8.8lx(Phys)\n", virt_to_phys(lp->sh_mem));
1903 printk(" mode: 0x%4.4x\n", p->mode);
1904 printk(" physical address: ");
1905 for (i = 0; i < ETH_ALEN - 1; i++) {
1906 printk("%2.2x:", p->phys_addr[i]);
1907 }
1908 printk("%2.2x\n", p->phys_addr[i]);
1909 printk(" multicast hash table: ");
1910 for (i = 0; i < (HASH_TABLE_LEN >> 3) - 1; i++) {
1911 printk("%2.2x:", p->mcast_table[i]);
1912 }
1913 printk("%2.2x\n", p->mcast_table[i]);
1914 printk(" rx_ring at: 0x%8.8x\n", p->rx_ring);
1915 printk(" tx_ring at: 0x%8.8x\n", p->tx_ring);
1916 printk("buffers (Phys): 0x%8.8lx\n", virt_to_phys(lp->sh_mem) + lp->buffs_offset);
1917 printk("Ring size:\nRX: %d Log2(rxRingMask): 0x%8.8x\n", (int) lp->rxRingMask + 1, lp->rx_rlen);
1918 printk("TX: %d Log2(txRingMask): 0x%8.8x\n", (int) lp->txRingMask + 1, lp->tx_rlen);
1919 outw(CSR2, DEPCA_ADDR);
1920 printk("CSR2&1: 0x%4.4x", inw(DEPCA_DATA));
1921 outw(CSR1, DEPCA_ADDR);
1922 printk("%4.4x\n", inw(DEPCA_DATA));
1923 outw(CSR3, DEPCA_ADDR);
1924 printk("CSR3: 0x%4.4x\n", inw(DEPCA_DATA));
1925 }
1926
1927 return;
1928}
1929
1930
1931
1932
1933
1934
1935static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1936{
1937 struct depca_private *lp = (struct depca_private *) dev->priv;
1938 struct depca_ioctl *ioc = (struct depca_ioctl *) &rq->ifr_data;
1939 int i, status = 0;
1940 u_long ioaddr = dev->base_addr;
1941 union {
1942 u8 addr[(HASH_TABLE_LEN * ETH_ALEN)];
1943 u16 sval[(HASH_TABLE_LEN * ETH_ALEN) >> 1];
1944 u32 lval[(HASH_TABLE_LEN * ETH_ALEN) >> 2];
1945 } tmp;
1946 unsigned long flags;
1947 void *buf;
1948
1949 switch (ioc->cmd) {
1950 case DEPCA_GET_HWADDR:
1951 for (i = 0; i < ETH_ALEN; i++) {
1952 tmp.addr[i] = dev->dev_addr[i];
1953 }
1954 ioc->len = ETH_ALEN;
1955 if (copy_to_user(ioc->data, tmp.addr, ioc->len))
1956 return -EFAULT;
1957 break;
1958
1959 case DEPCA_SET_HWADDR:
1960 if (!capable(CAP_NET_ADMIN))
1961 return -EPERM;
1962 if (copy_from_user(tmp.addr, ioc->data, ETH_ALEN))
1963 return -EFAULT;
1964 for (i = 0; i < ETH_ALEN; i++) {
1965 dev->dev_addr[i] = tmp.addr[i];
1966 }
1967 netif_stop_queue(dev);
1968 while (lp->tx_old != lp->tx_new)
1969 cpu_relax();
1970
1971 STOP_DEPCA;
1972 depca_init_ring(dev);
1973 LoadCSRs(dev);
1974 InitRestartDepca(dev);
1975 netif_start_queue(dev);
1976 break;
1977
1978 case DEPCA_SET_PROM:
1979 if (!capable(CAP_NET_ADMIN))
1980 return -EPERM;
1981 netif_stop_queue(dev);
1982 while (lp->tx_old != lp->tx_new)
1983 cpu_relax();
1984
1985 STOP_DEPCA;
1986 depca_init_ring(dev);
1987 lp->init_block.mode |= PROM;
1988
1989 LoadCSRs(dev);
1990 InitRestartDepca(dev);
1991 netif_start_queue(dev);
1992 break;
1993
1994 case DEPCA_CLR_PROM:
1995 if (!capable(CAP_NET_ADMIN))
1996 return -EPERM;
1997 netif_stop_queue(dev);
1998 while (lp->tx_old != lp->tx_new)
1999 cpu_relax();
2000
2001 STOP_DEPCA;
2002 depca_init_ring(dev);
2003 lp->init_block.mode &= ~PROM;
2004
2005 LoadCSRs(dev);
2006 InitRestartDepca(dev);
2007 netif_start_queue(dev);
2008 break;
2009
2010 case DEPCA_SAY_BOO:
2011 if(!capable(CAP_NET_ADMIN))
2012 return -EPERM;
2013 printk("%s: Boo!\n", dev->name);
2014 break;
2015
2016 case DEPCA_GET_MCA:
2017 ioc->len = (HASH_TABLE_LEN >> 3);
2018 if (copy_to_user(ioc->data, lp->init_block.mcast_table, ioc->len))
2019 return -EFAULT;
2020 break;
2021
2022 case DEPCA_SET_MCA:
2023 if (!capable(CAP_NET_ADMIN))
2024 return -EPERM;
2025 if (ioc->len >= HASH_TABLE_LEN)
2026 return -EINVAL;
2027 if (copy_from_user(tmp.addr, ioc->data, ETH_ALEN * ioc->len))
2028 return -EFAULT;
2029 set_multicast_list(dev);
2030 break;
2031
2032 case DEPCA_CLR_MCA:
2033 if (!capable(CAP_NET_ADMIN))
2034 return -EPERM;
2035 set_multicast_list(dev);
2036 break;
2037
2038 case DEPCA_MCA_EN:
2039 if (!capable(CAP_NET_ADMIN))
2040 return -EPERM;
2041 set_multicast_list(dev);
2042 break;
2043
2044 case DEPCA_GET_STATS:
2045 ioc->len = sizeof(lp->pktStats);
2046 buf = kmalloc(ioc->len, GFP_KERNEL);
2047 if(!buf)
2048 return -ENOMEM;
2049 spin_lock_irqsave(&lp->lock, flags);
2050 memcpy(buf, &lp->pktStats, ioc->len);
2051 spin_unlock_irqrestore(&lp->lock, flags);
2052 if (copy_to_user(ioc->data, buf, ioc->len))
2053 status = -EFAULT;
2054 kfree(buf);
2055 break;
2056
2057 case DEPCA_CLR_STATS:
2058 if (!capable(CAP_NET_ADMIN))
2059 return -EPERM;
2060 spin_lock_irqsave(&lp->lock, flags);
2061 memset(&lp->pktStats, 0, sizeof(lp->pktStats));
2062 spin_unlock_irqrestore(&lp->lock, flags);
2063 break;
2064
2065 case DEPCA_GET_REG:
2066 i = 0;
2067 tmp.sval[i++] = inw(DEPCA_NICSR);
2068 outw(CSR0, DEPCA_ADDR);
2069 tmp.sval[i++] = inw(DEPCA_DATA);
2070 memcpy(&tmp.sval[i], &lp->init_block, sizeof(struct depca_init));
2071 ioc->len = i + sizeof(struct depca_init);
2072 if (copy_to_user(ioc->data, tmp.addr, ioc->len))
2073 return -EFAULT;
2074 break;
2075
2076 default:
2077 return -EOPNOTSUPP;
2078 }
2079
2080 return status;
2081}
2082
2083static int __init depca_module_init (void)
2084{
2085 int err = 0;
2086
2087#if CONFIG_MCA
2088 err = mca_register_driver (&depca_mca_driver);
2089#endif
2090#ifdef CONFIG_EISA
2091 err |= eisa_driver_register (&depca_eisa_driver);
2092#endif
2093 err |= driver_register (&depca_isa_driver);
2094 depca_platform_probe ();
2095
2096 return err;
2097}
2098
2099static void __exit depca_module_exit (void)
2100{
2101 int i;
2102#if CONFIG_MCA
2103 mca_unregister_driver (&depca_mca_driver);
2104#endif
2105#ifdef CONFIG_EISA
2106 eisa_driver_unregister (&depca_eisa_driver);
2107#endif
2108 driver_unregister (&depca_isa_driver);
2109
2110 for (i = 0; depca_io_ports[i].iobase; i++) {
2111 if (depca_io_ports[i].device) {
2112 platform_device_unregister (depca_io_ports[i].device);
2113 depca_io_ports[i].device = NULL;
2114 }
2115 }
2116}
2117
2118module_init (depca_module_init);
2119module_exit (depca_module_exit);
2120