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