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#include <linux/module.h>
87#include <linux/kernel.h>
88#include <linux/sched.h>
89#include <linux/string.h>
90#include <linux/delay.h>
91#include <linux/errno.h>
92#include <linux/ioport.h>
93#include <linux/slab.h>
94#include <linux/interrupt.h>
95#include <linux/pci.h>
96#include <linux/init.h>
97#include <linux/netdevice.h>
98#include <linux/etherdevice.h>
99#include <linux/skbuff.h>
100
101#include <asm/bitops.h>
102#include <asm/io.h>
103#include <asm/byteorder.h>
104#include <asm/uaccess.h>
105
106static char version[] __initdata =
107 "$Id: dgrs.c,v 1.13 2000/06/06 04:07:00 rick Exp $";
108
109
110
111
112typedef unsigned char uchar;
113typedef unsigned int bool;
114#define vol volatile
115
116#include "dgrs.h"
117#include "dgrs_es4h.h"
118#include "dgrs_plx9060.h"
119#include "dgrs_i82596.h"
120#include "dgrs_ether.h"
121#include "dgrs_asstruct.h"
122#include "dgrs_bcomm.h"
123
124static struct pci_device_id dgrs_pci_tbl[] __initdata = {
125 { SE6_PCI_VENDOR_ID, SE6_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, },
126 { }
127};
128MODULE_DEVICE_TABLE(pci, dgrs_pci_tbl);
129MODULE_LICENSE("GPL");
130
131
132
133
134
135
136#ifndef NOFW
137 #include "dgrs_firmware.c"
138#else
139 extern int dgrs_firmnum;
140 extern char dgrs_firmver[];
141 extern char dgrs_firmdate[];
142 extern uchar dgrs_code[];
143 extern int dgrs_ncode;
144#endif
145
146
147
148
149#define OUTB(ADDR, VAL) outb(VAL, ADDR)
150#define OUTW(ADDR, VAL) outw(VAL, ADDR)
151#define OUTL(ADDR, VAL) outl(VAL, ADDR)
152
153
154
155
156
157#define S2H(A) ( ((unsigned long)(A)&0x00ffffff) + priv0->vmem )
158#define S2HN(A) ( ((unsigned long)(A)&0x00ffffff) + privN->vmem )
159#define H2S(A) ( ((char *) (A) - priv0->vmem) + 0xA3000000 )
160
161
162
163
164
165
166#define S2DMA(A) ( (unsigned long)(A) & 0x00ffffff)
167
168
169
170
171
172static int dgrs_debug = 1;
173static int dgrs_dma = 1;
174static int dgrs_spantree = -1;
175static int dgrs_hashexpire = -1;
176static uchar dgrs_ipaddr[4] = { 0xff, 0xff, 0xff, 0xff};
177static uchar dgrs_iptrap[4] = { 0xff, 0xff, 0xff, 0xff};
178static __u32 dgrs_ipxnet = -1;
179static int dgrs_nicmode;
180
181
182
183
184static struct net_device *dgrs_root_dev;
185
186
187
188
189typedef struct
190{
191
192
193
194 struct net_device *next_dev;
195 struct net_device_stats stats;
196
197
198
199
200 char *vmem;
201
202 struct bios_comm *bcomm;
203 PORT *port;
204 I596_SCB *scbp;
205 I596_RFD *rfdp;
206 I596_RBD *rbdp;
207
208 volatile int intrcnt;
209
210
211
212
213 uchar is_reg;
214
215
216
217
218
219
220
221
222 ulong plxreg;
223 char *vplxreg;
224 ulong plxdma;
225 ulong volatile *vplxdma;
226 int use_dma;
227 DMACHAIN *dmadesc_s;
228 DMACHAIN *dmadesc_h;
229
230
231
232
233
234
235
236
237 int nports;
238 int chan;
239 struct net_device *devtbl[6];
240
241} DGRS_PRIV;
242
243
244
245
246
247static void
248proc_reset(struct net_device *dev0, int reset)
249{
250 DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv;
251
252 if (priv0->plxreg)
253 {
254 ulong val;
255 val = inl(dev0->base_addr + PLX_MISC_CSR);
256 if (reset)
257 val |= SE6_RESET;
258 else
259 val &= ~SE6_RESET;
260 OUTL(dev0->base_addr + PLX_MISC_CSR, val);
261 }
262 else
263 {
264 OUTB(dev0->base_addr + ES4H_PC, reset ? ES4H_PC_RESET : 0);
265 }
266}
267
268
269
270
271static int
272check_board_dma(struct net_device *dev0)
273{
274 DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv;
275 ulong x;
276
277
278
279
280
281
282 if (!dgrs_dma || !priv0->plxreg || !priv0->plxdma)
283 return (0);
284
285
286
287
288
289
290 OUTL(dev0->base_addr + PLX_ROM_BASE_ADDR, 0x80000000);
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305 OUTL(dev0->base_addr + PLX_BUS_REGION, 0x49430343);
306
307
308
309
310 priv0->vplxdma = (ulong *) ioremap (priv0->plxdma, 256);
311 if (!priv0->vplxdma)
312 {
313 printk("%s: can't *remap() the DMA regs\n", dev0->name);
314 return (0);
315 }
316
317
318
319
320
321
322
323 priv0->vplxdma[PLX_DMA0_MODE/4] = 0xFFFFFFFF;
324 x = priv0->vplxdma[PLX_DMA0_MODE/4];
325 if (x != 0x00001FFF)
326 return (0);
327
328 return (1);
329}
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344static int
345do_plx_dma(
346 struct net_device *dev,
347 ulong pciaddr,
348 ulong lcladdr,
349 int len,
350 int to_host
351)
352{
353 int i;
354 ulong csr = 0;
355 DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
356
357 if (pciaddr)
358 {
359
360
361
362 priv->vplxdma[PLX_DMA0_PCI_ADDR/4] = pciaddr;
363 priv->vplxdma[PLX_DMA0_LCL_ADDR/4] = lcladdr;
364 priv->vplxdma[PLX_DMA0_SIZE/4] = len;
365 priv->vplxdma[PLX_DMA0_DESCRIPTOR/4] = to_host
366 ? PLX_DMA_DESC_TO_HOST
367 : PLX_DMA_DESC_TO_BOARD;
368 priv->vplxdma[PLX_DMA0_MODE/4] =
369 PLX_DMA_MODE_WIDTH32
370 | PLX_DMA_MODE_WAITSTATES(0)
371 | PLX_DMA_MODE_READY
372 | PLX_DMA_MODE_NOBTERM
373 | PLX_DMA_MODE_BURST
374 | PLX_DMA_MODE_NOCHAIN;
375 }
376 else
377 {
378
379
380
381 priv->vplxdma[PLX_DMA0_MODE/4] =
382 PLX_DMA_MODE_WIDTH32
383 | PLX_DMA_MODE_WAITSTATES(0)
384 | PLX_DMA_MODE_READY
385 | PLX_DMA_MODE_NOBTERM
386 | PLX_DMA_MODE_BURST
387 | PLX_DMA_MODE_CHAIN;
388 priv->vplxdma[PLX_DMA0_DESCRIPTOR/4] = lcladdr;
389 }
390
391 priv->vplxdma[PLX_DMA_CSR/4] =
392 PLX_DMA_CSR_0_ENABLE | PLX_DMA_CSR_0_START;
393
394
395
396
397 for (i = 0; i < 1000000; ++i)
398 {
399
400
401
402
403 udelay(1);
404
405 csr = (volatile unsigned long) priv->vplxdma[PLX_DMA_CSR/4];
406
407 if (csr & PLX_DMA_CSR_0_DONE)
408 break;
409 }
410
411 if ( ! (csr & PLX_DMA_CSR_0_DONE) )
412 {
413 printk("%s: DMA done never occurred. DMA disabled.\n",
414 dev->name);
415 priv->use_dma = 0;
416 return 1;
417 }
418 return 0;
419}
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450void
451dgrs_rcv_frame(
452 struct net_device *dev0,
453 DGRS_PRIV *priv0,
454 I596_CB *cbp
455)
456{
457 int len;
458 I596_TBD *tbdp;
459 struct sk_buff *skb;
460 uchar *putp;
461 uchar *p;
462 struct net_device *devN;
463 DGRS_PRIV *privN;
464
465
466
467
468 if (dgrs_nicmode)
469 {
470 int chan = ((I596_RBD *) S2H(cbp->xmit.tbdp))->chan;
471
472 devN = priv0->devtbl[chan-1];
473
474
475
476
477 if (devN == NULL)
478 goto out;
479 privN = (DGRS_PRIV *) devN->priv;
480 }
481 else
482 {
483 devN = dev0;
484 privN = priv0;
485 }
486
487 if (0) printk("%s: rcv len=%ld\n", devN->name, cbp->xmit.count);
488
489
490
491
492 len = cbp->xmit.count;
493 if ((skb = dev_alloc_skb(len+5)) == NULL)
494 {
495 printk("%s: dev_alloc_skb failed for rcv buffer\n", devN->name);
496 ++privN->stats.rx_dropped;
497
498 goto out;
499 }
500 skb->dev = devN;
501 skb_reserve(skb, 2);
502
503again:
504 putp = p = skb_put(skb, len);
505
506
507
508
509
510
511
512 if (priv0->use_dma && priv0->dmadesc_h && len > 64)
513 {
514
515
516
517
518 DMACHAIN *ddp_h;
519 DMACHAIN *ddp_s;
520 uchar *phys_p;
521
522
523
524
525
526
527 phys_p = (uchar *) virt_to_phys(putp);
528
529 ddp_h = priv0->dmadesc_h;
530 ddp_s = priv0->dmadesc_s;
531 tbdp = (I596_TBD *) S2H(cbp->xmit.tbdp);
532 for (;;)
533 {
534 int count;
535 int amt;
536
537 count = tbdp->count;
538 amt = count & 0x3fff;
539 if (amt == 0)
540 break;
541 if ( (p-putp) >= len)
542 {
543 printk("%s: cbp = %lx\n", devN->name, (long) H2S(cbp));
544 proc_reset(dev0, 1);
545 break;
546 }
547
548 ddp_h->pciaddr = (ulong) phys_p;
549 ddp_h->lcladdr = S2DMA(tbdp->buf);
550 ddp_h->len = amt;
551
552 phys_p += amt;
553 p += amt;
554
555 if (count & I596_TBD_EOF)
556 {
557 ddp_h->next = PLX_DMA_DESC_TO_HOST
558 | PLX_DMA_DESC_EOC;
559 ++ddp_h;
560 break;
561 }
562 else
563 {
564 ++ddp_s;
565 ddp_h->next = PLX_DMA_DESC_TO_HOST
566 | (ulong) ddp_s;
567 tbdp = (I596_TBD *) S2H(tbdp->next);
568 ++ddp_h;
569 }
570 }
571 if (ddp_h - priv0->dmadesc_h)
572 {
573 int rc;
574
575 rc = do_plx_dma(dev0,
576 0, (ulong) priv0->dmadesc_s, len, 0);
577 if (rc)
578 {
579 printk("%s: Chained DMA failure\n", devN->name);
580 goto again;
581 }
582 }
583 }
584 else if (priv0->use_dma)
585 {
586
587
588
589
590 uchar *phys_p;
591
592
593
594
595
596
597 phys_p = (uchar *) virt_to_phys(putp);
598
599 tbdp = (I596_TBD *) S2H(cbp->xmit.tbdp);
600 for (;;)
601 {
602 int count;
603 int amt;
604 int rc;
605
606 count = tbdp->count;
607 amt = count & 0x3fff;
608 if (amt == 0)
609 break;
610 if ( (p-putp) >= len)
611 {
612 printk("%s: cbp = %lx\n", devN->name, (long) H2S(cbp));
613 proc_reset(dev0, 1);
614 break;
615 }
616 rc = do_plx_dma(dev0, (ulong) phys_p,
617 S2DMA(tbdp->buf), amt, 1);
618 if (rc)
619 {
620 memcpy(p, S2H(tbdp->buf), amt);
621 printk("%s: Single DMA failed\n", devN->name);
622 }
623 phys_p += amt;
624 p += amt;
625 if (count & I596_TBD_EOF)
626 break;
627 tbdp = (I596_TBD *) S2H(tbdp->next);
628 }
629 }
630 else
631 {
632
633
634
635 tbdp = (I596_TBD *) S2H(cbp->xmit.tbdp);
636 for (;;)
637 {
638 int count;
639 int amt;
640
641 count = tbdp->count;
642 amt = count & 0x3fff;
643 if (amt == 0)
644 break;
645 if ( (p-putp) >= len)
646 {
647 printk("%s: cbp = %lx\n", devN->name, (long) H2S(cbp));
648 proc_reset(dev0, 1);
649 break;
650 }
651 memcpy(p, S2H(tbdp->buf), amt);
652 p += amt;
653 if (count & I596_TBD_EOF)
654 break;
655 tbdp = (I596_TBD *) S2H(tbdp->next);
656 }
657 }
658
659
660
661
662 skb->protocol = eth_type_trans(skb, devN);
663 netif_rx(skb);
664 devN->last_rx = jiffies;
665 ++privN->stats.rx_packets;
666 privN->stats.rx_bytes += len;
667
668out:
669 cbp->xmit.status = I596_CB_STATUS_C | I596_CB_STATUS_OK;
670}
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690static int dgrs_start_xmit(struct sk_buff *skb, struct net_device *devN)
691{
692 DGRS_PRIV *privN = (DGRS_PRIV *) devN->priv;
693 struct net_device *dev0;
694 DGRS_PRIV *priv0;
695 I596_RBD *rbdp;
696 int count;
697 int i, len, amt;
698
699
700
701
702 if (dgrs_nicmode)
703 {
704 dev0 = privN->devtbl[0];
705 priv0 = (DGRS_PRIV *) dev0->priv;
706 }
707 else
708 {
709 dev0 = devN;
710 priv0 = privN;
711 }
712
713 if (dgrs_debug > 1)
714 printk("%s: xmit len=%d\n", devN->name, (int) skb->len);
715
716 devN->trans_start = jiffies;
717 netif_start_queue(devN);
718
719 if (priv0->rfdp->cmd & I596_RFD_EL)
720 {
721 if (0) printk("%s: NO RFD's\n", devN->name);
722 goto no_resources;
723 }
724
725 rbdp = priv0->rbdp;
726 count = 0;
727 priv0->rfdp->rbdp = (I596_RBD *) H2S(rbdp);
728
729 i = 0; len = skb->len;
730 for (;;)
731 {
732 if (rbdp->size & I596_RBD_EL)
733 {
734 if (0) printk("%s: NO RBD's\n", devN->name);
735 goto no_resources;
736 }
737
738 amt = min_t(unsigned int, len, rbdp->size - count);
739 memcpy( (char *) S2H(rbdp->buf) + count, skb->data + i, amt);
740 i += amt;
741 count += amt;
742 len -= amt;
743 if (len == 0)
744 {
745 if (skb->len < 60)
746 rbdp->count = 60 | I596_RBD_EOF;
747 else
748 rbdp->count = count | I596_RBD_EOF;
749 rbdp = (I596_RBD *) S2H(rbdp->next);
750 goto frame_done;
751 }
752 else if (count < 32)
753 {
754
755
756
757 {}
758 }
759 else
760 {
761 rbdp->count = count;
762 rbdp = (I596_RBD *) S2H(rbdp->next);
763 count = 0;
764 }
765 }
766
767frame_done:
768 priv0->rbdp = rbdp;
769 if (dgrs_nicmode)
770 priv0->rfdp->dstchan = privN->chan;
771 priv0->rfdp->status = I596_RFD_C | I596_RFD_OK;
772 priv0->rfdp = (I596_RFD *) S2H(priv0->rfdp->next);
773
774 ++privN->stats.tx_packets;
775
776 dev_kfree_skb (skb);
777 return (0);
778
779no_resources:
780 priv0->scbp->status |= I596_SCB_RNR;
781 return (-EAGAIN);
782}
783
784
785
786
787static int
788dgrs_open( struct net_device *dev )
789{
790 netif_start_queue(dev);
791 return (0);
792}
793
794
795
796
797static int dgrs_close( struct net_device *dev )
798{
799 netif_stop_queue(dev);
800 return (0);
801}
802
803
804
805
806static struct net_device_stats *dgrs_get_stats( struct net_device *dev )
807{
808 DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
809
810 return (&priv->stats);
811}
812
813
814
815
816
817static void dgrs_set_multicast_list( struct net_device *dev)
818{
819 DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
820
821 priv->port->is_promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
822}
823
824
825
826
827static int dgrs_ioctl(struct net_device *devN, struct ifreq *ifr, int cmd)
828{
829 DGRS_PRIV *privN = (DGRS_PRIV *) devN->priv;
830 DGRS_IOCTL ioc;
831 int i;
832
833 if (cmd != DGRSIOCTL)
834 return -EINVAL;
835
836 if(copy_from_user(&ioc, ifr->ifr_data, sizeof(DGRS_IOCTL)))
837 return -EFAULT;
838
839 switch (ioc.cmd)
840 {
841 case DGRS_GETMEM:
842 if (ioc.len != sizeof(ulong))
843 return -EINVAL;
844 if(copy_to_user(ioc.data, &devN->mem_start, ioc.len))
845 return -EFAULT;
846 return (0);
847 case DGRS_SETFILTER:
848 if (!capable(CAP_NET_ADMIN))
849 return -EPERM;
850 if (ioc.port > privN->bcomm->bc_nports)
851 return -EINVAL;
852 if (ioc.filter >= NFILTERS)
853 return -EINVAL;
854 if (ioc.len > privN->bcomm->bc_filter_area_len)
855 return -EINVAL;
856
857
858 for (i = 0; i < 1000; ++i)
859 {
860 if ( (volatile long) privN->bcomm->bc_filter_cmd <= 0 )
861 break;
862 udelay(1);
863 }
864 if (i >= 1000)
865 return -EIO;
866
867 privN->bcomm->bc_filter_port = ioc.port;
868 privN->bcomm->bc_filter_num = ioc.filter;
869 privN->bcomm->bc_filter_len = ioc.len;
870
871 if (ioc.len)
872 {
873 if(copy_from_user(S2HN(privN->bcomm->bc_filter_area),
874 ioc.data, ioc.len))
875 return -EFAULT;
876 privN->bcomm->bc_filter_cmd = BC_FILTER_SET;
877 }
878 else
879 privN->bcomm->bc_filter_cmd = BC_FILTER_CLR;
880 return(0);
881 default:
882 return -EOPNOTSUPP;
883 }
884}
885
886
887
888
889
890
891
892static void dgrs_intr(int irq, void *dev_id, struct pt_regs *regs)
893{
894 struct net_device *dev0 = (struct net_device *) dev_id;
895 DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv;
896 I596_CB *cbp;
897 int cmd;
898 int i;
899
900 ++priv0->intrcnt;
901 if (1) ++priv0->bcomm->bc_cnt[4];
902 if (0)
903 {
904 static int cnt = 100;
905 if (--cnt > 0)
906 printk("%s: interrupt: irq %d\n", dev0->name, irq);
907 }
908
909
910
911
912 cmd = priv0->scbp->cmd;
913
914
915
916
917 if ( (cmd & I596_SCB_RUC) == I596_SCB_RUC_START)
918 {
919 if (0) printk("%s: RUC start\n", dev0->name);
920 priv0->rfdp = (I596_RFD *) S2H(priv0->scbp->rfdp);
921 priv0->rbdp = (I596_RBD *) S2H(priv0->rfdp->rbdp);
922 priv0->scbp->status &= ~(I596_SCB_RNR|I596_SCB_RUS);
923
924
925
926 if (dgrs_nicmode)
927 {
928 for (i = 0; i < priv0->nports; ++i)
929 netif_wake_queue (priv0->devtbl[i]);
930 }
931 else
932 netif_wake_queue (dev0);
933
934
935 }
936
937
938
939
940 if ( (cmd & I596_SCB_CUC) != I596_SCB_CUC_START)
941 {
942 priv0->scbp->cmd = 0;
943 goto ack_intr;
944 }
945 priv0->scbp->status &= ~(I596_SCB_CNA|I596_SCB_CUS);
946
947
948
949
950 cbp = (I596_CB *) S2H(priv0->scbp->cbp);
951 priv0->scbp->cmd = 0;
952 for (;;)
953 {
954 switch (cbp->nop.cmd & I596_CB_CMD)
955 {
956 case I596_CB_CMD_XMIT:
957 dgrs_rcv_frame(dev0, priv0, cbp);
958 break;
959 default:
960 cbp->nop.status = I596_CB_STATUS_C | I596_CB_STATUS_OK;
961 break;
962 }
963 if (cbp->nop.cmd & I596_CB_CMD_EL)
964 break;
965 cbp = (I596_CB *) S2H(cbp->nop.next);
966 }
967 priv0->scbp->status |= I596_SCB_CNA;
968
969
970
971
972ack_intr:
973 if (priv0->plxreg)
974 OUTL(dev0->base_addr + PLX_LCL2PCI_DOORBELL, 1);
975}
976
977
978
979
980static int __init
981dgrs_download(struct net_device *dev0)
982{
983 DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv;
984 int is;
985 int i;
986
987 static int iv2is[16] = {
988 0, 0, 0, ES4H_IS_INT3,
989 0, ES4H_IS_INT5, 0, ES4H_IS_INT7,
990 0, 0, ES4H_IS_INT10, ES4H_IS_INT11,
991 ES4H_IS_INT12, 0, 0, ES4H_IS_INT15 };
992
993
994
995
996 priv0->vmem = ioremap(dev0->mem_start, 2048*1024);
997 if (!priv0->vmem)
998 {
999 printk("%s: cannot map in board memory\n", dev0->name);
1000 return -ENXIO;
1001 }
1002
1003
1004
1005
1006 if (priv0->plxreg)
1007 {
1008 proc_reset(dev0, 1);
1009 }
1010 else
1011 {
1012 is = iv2is[dev0->irq & 0x0f];
1013 if (!is)
1014 {
1015 printk("%s: Illegal IRQ %d\n", dev0->name, dev0->irq);
1016 return -ENXIO;
1017 }
1018 OUTB(dev0->base_addr + ES4H_AS_31_24,
1019 (uchar) (dev0->mem_start >> 24) );
1020 OUTB(dev0->base_addr + ES4H_AS_23_16,
1021 (uchar) (dev0->mem_start >> 16) );
1022 priv0->is_reg = ES4H_IS_LINEAR | is |
1023 ((uchar) (dev0->mem_start >> 8) & ES4H_IS_AS15);
1024 OUTB(dev0->base_addr + ES4H_IS, priv0->is_reg);
1025 OUTB(dev0->base_addr + ES4H_EC, ES4H_EC_ENABLE);
1026 OUTB(dev0->base_addr + ES4H_PC, ES4H_PC_RESET);
1027 OUTB(dev0->base_addr + ES4H_MW, ES4H_MW_ENABLE | 0x00);
1028 }
1029
1030
1031
1032
1033 priv0->use_dma = check_board_dma(dev0);
1034 if (priv0->use_dma)
1035 printk("%s: Bus Master DMA is enabled.\n", dev0->name);
1036
1037
1038
1039
1040 memcpy(priv0->vmem, dgrs_code, dgrs_ncode);
1041 if (memcmp(priv0->vmem, dgrs_code, dgrs_ncode))
1042 {
1043 iounmap(priv0->vmem);
1044 priv0->vmem = NULL;
1045 printk("%s: download compare failed\n", dev0->name);
1046 return -ENXIO;
1047 }
1048
1049
1050
1051
1052 priv0->bcomm = (struct bios_comm *) (priv0->vmem + 0x0100);
1053 priv0->bcomm->bc_nowait = 1;
1054 priv0->bcomm->bc_squelch = 0;
1055 priv0->bcomm->bc_150ohm = 0;
1056
1057 priv0->bcomm->bc_spew = 0;
1058 priv0->bcomm->bc_maxrfd = 0;
1059 priv0->bcomm->bc_maxrbd = 0;
1060
1061
1062
1063
1064
1065 priv0->bcomm->bc_host = dgrs_nicmode ? BC_MULTINIC : BC_SWITCH;
1066
1067
1068
1069
1070 if (priv0->use_dma)
1071 priv0->bcomm->bc_hostarea_len = (2048/64) * 16;
1072
1073
1074
1075
1076 priv0->bcomm->bc_spantree = dgrs_spantree;
1077 priv0->bcomm->bc_hashexpire = dgrs_hashexpire;
1078 memcpy(priv0->bcomm->bc_ipaddr, dgrs_ipaddr, 4);
1079 memcpy(priv0->bcomm->bc_iptrap, dgrs_iptrap, 4);
1080 memcpy(priv0->bcomm->bc_ipxnet, &dgrs_ipxnet, 4);
1081
1082
1083
1084
1085 proc_reset(dev0, 0);
1086
1087 for (i = jiffies + 8 * HZ; time_after(i, jiffies); )
1088 {
1089 barrier();
1090 if (priv0->bcomm->bc_status >= BC_RUN)
1091 break;
1092 }
1093
1094 if (priv0->bcomm->bc_status < BC_RUN)
1095 {
1096 printk("%s: board not operating\n", dev0->name);
1097 return -ENXIO;
1098 }
1099
1100 priv0->port = (PORT *) S2H(priv0->bcomm->bc_port);
1101 priv0->scbp = (I596_SCB *) S2H(priv0->port->scbp);
1102 priv0->rfdp = (I596_RFD *) S2H(priv0->scbp->rfdp);
1103 priv0->rbdp = (I596_RBD *) S2H(priv0->rfdp->rbdp);
1104
1105 priv0->scbp->status = I596_SCB_CNA;
1106
1107
1108
1109
1110
1111
1112
1113
1114 priv0->dmadesc_s = (DMACHAIN *) S2DMA(priv0->bcomm->bc_hostarea);
1115 if (priv0->dmadesc_s)
1116 priv0->dmadesc_h = (DMACHAIN *) S2H(priv0->dmadesc_s);
1117 else
1118 priv0->dmadesc_h = NULL;
1119
1120
1121
1122
1123 if (priv0->plxreg)
1124 {
1125 OUTL(dev0->base_addr + PLX_INT_CSR,
1126 inl(dev0->base_addr + PLX_INT_CSR)
1127 | PLX_PCI_DOORBELL_IE);
1128 OUTL(dev0->base_addr + PLX_LCL2PCI_DOORBELL, 1);
1129 }
1130 else
1131 {
1132 }
1133
1134 return (0);
1135}
1136
1137
1138
1139
1140int __init
1141dgrs_probe1(struct net_device *dev)
1142{
1143 DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
1144 int i;
1145 int rc;
1146
1147 printk("%s: Digi RightSwitch io=%lx mem=%lx irq=%d plx=%lx dma=%lx\n",
1148 dev->name, dev->base_addr, dev->mem_start, dev->irq,
1149 priv->plxreg, priv->plxdma);
1150
1151
1152
1153
1154 rc = dgrs_download(dev);
1155 if (rc)
1156 goto err_out;
1157
1158
1159
1160
1161 printk("%s: Ethernet address", dev->name);
1162 memcpy(dev->dev_addr, priv->port->ethaddr, 6);
1163 for (i = 0; i < 6; ++i)
1164 printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
1165 printk("\n");
1166
1167 if (dev->dev_addr[0] & 1)
1168 {
1169 printk("%s: Illegal Ethernet Address\n", dev->name);
1170 rc = -ENXIO;
1171 goto err_out;
1172 }
1173
1174
1175
1176
1177
1178 if (priv->plxreg)
1179 OUTL(dev->base_addr + PLX_LCL2PCI_DOORBELL, 1);
1180
1181 rc = request_irq(dev->irq, &dgrs_intr, SA_SHIRQ, "RightSwitch", dev);
1182 if (rc)
1183 goto err_out;
1184
1185 priv->intrcnt = 0;
1186 for (i = jiffies + 2*HZ + HZ/2; time_after(i, jiffies); )
1187 {
1188 barrier();
1189 if (priv->intrcnt >= 2)
1190 break;
1191 }
1192 if (priv->intrcnt < 2)
1193 {
1194 printk(KERN_ERR "%s: Not interrupting on IRQ %d (%d)\n",
1195 dev->name, dev->irq, priv->intrcnt);
1196 rc = -ENXIO;
1197 goto err_free_irq;
1198 }
1199
1200
1201
1202
1203 if (!request_region(dev->base_addr, 256, "RightSwitch")) {
1204 printk(KERN_ERR "%s: io 0x%3lX, which is busy.\n", dev->name,
1205 dev->base_addr);
1206 rc = -EBUSY;
1207 goto err_free_irq;
1208 }
1209
1210
1211
1212
1213 dev->open = &dgrs_open;
1214 dev->stop = &dgrs_close;
1215 dev->get_stats = &dgrs_get_stats;
1216 dev->hard_start_xmit = &dgrs_start_xmit;
1217 dev->set_multicast_list = &dgrs_set_multicast_list;
1218 dev->do_ioctl = &dgrs_ioctl;
1219
1220 return rc;
1221
1222err_free_irq:
1223 free_irq(dev->irq, dev);
1224err_out:
1225 return rc;
1226}
1227
1228int __init
1229dgrs_initclone(struct net_device *dev)
1230{
1231 DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
1232 int i;
1233
1234 printk("%s: Digi RightSwitch port %d ",
1235 dev->name, priv->chan);
1236 for (i = 0; i < 6; ++i)
1237 printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
1238 printk("\n");
1239
1240 return (0);
1241}
1242
1243static int __init
1244dgrs_found_device(
1245 int io,
1246 ulong mem,
1247 int irq,
1248 ulong plxreg,
1249 ulong plxdma
1250)
1251{
1252 DGRS_PRIV *priv;
1253 struct net_device *dev, *aux;
1254
1255
1256 int dev_size = sizeof(struct net_device) + sizeof(DGRS_PRIV);
1257 int i, ret;
1258
1259 dev = (struct net_device *) kmalloc(dev_size, GFP_KERNEL);
1260
1261 if (!dev)
1262 return -ENOMEM;
1263
1264 memset(dev, 0, dev_size);
1265 dev->priv = ((void *)dev) + sizeof(struct net_device);
1266 priv = (DGRS_PRIV *)dev->priv;
1267
1268 dev->base_addr = io;
1269 dev->mem_start = mem;
1270 dev->mem_end = mem + 2048 * 1024 - 1;
1271 dev->irq = irq;
1272 priv->plxreg = plxreg;
1273 priv->plxdma = plxdma;
1274 priv->vplxdma = NULL;
1275
1276 priv->chan = 1;
1277 priv->devtbl[0] = dev;
1278
1279 dev->init = dgrs_probe1;
1280 SET_MODULE_OWNER(dev);
1281 ether_setup(dev);
1282 if (register_netdev(dev) != 0)
1283 return -EIO;
1284
1285 priv->next_dev = dgrs_root_dev;
1286 dgrs_root_dev = dev;
1287
1288 if ( !dgrs_nicmode )
1289 return (0);
1290
1291
1292
1293
1294
1295 priv->nports = priv->bcomm->bc_nports;
1296
1297 for (i = 1; i < priv->nports; ++i)
1298 {
1299 struct net_device *devN;
1300 DGRS_PRIV *privN;
1301
1302 devN = (struct net_device *) kmalloc(dev_size, GFP_KERNEL);
1303
1304 ret = -ENOMEM;
1305 if (!devN)
1306 goto fail;
1307 memcpy(devN, dev, dev_size);
1308 memset(devN->name, 0, sizeof(devN->name));
1309 devN->priv = ((void *)devN) + sizeof(struct net_device);
1310 privN = (DGRS_PRIV *)devN->priv;
1311
1312 privN->vmem = 0;
1313 privN->vplxdma = 0;
1314
1315 devN->irq = 0;
1316
1317 devN->dev_addr[5] += i;
1318 devN->init = dgrs_initclone;
1319 SET_MODULE_OWNER(devN);
1320 ether_setup(devN);
1321 ret = -EIO;
1322 if (register_netdev(devN)) {
1323 kfree(devN);
1324 goto fail;
1325 }
1326 privN->chan = i+1;
1327 priv->devtbl[i] = devN;
1328 privN->next_dev = dgrs_root_dev;
1329 dgrs_root_dev = devN;
1330 }
1331 return 0;
1332fail: aux = priv->next_dev;
1333 while (dgrs_root_dev != aux) {
1334 struct net_device *d = dgrs_root_dev;
1335
1336 dgrs_root_dev = ((DGRS_PRIV *)d->priv)->next_dev;
1337 unregister_netdev(d);
1338 kfree(d);
1339 }
1340 return ret;
1341}
1342
1343
1344
1345
1346static int is2iv[8] __initdata = { 0, 3, 5, 7, 10, 11, 12, 15 };
1347
1348static int __init dgrs_scan(void)
1349{
1350 int cards_found = 0;
1351 uint io;
1352 uint mem;
1353 uint irq;
1354 uint plxreg;
1355 uint plxdma;
1356
1357
1358
1359
1360 if (pci_present())
1361 {
1362 struct pci_dev *pdev = NULL;
1363
1364 while ((pdev = pci_find_device(SE6_PCI_VENDOR_ID, SE6_PCI_DEVICE_ID, pdev)) != NULL)
1365 {
1366
1367
1368
1369
1370
1371
1372
1373 if (pci_enable_device(pdev))
1374 continue;
1375 pci_set_master(pdev);
1376
1377 plxreg = pci_resource_start (pdev, 0);
1378 io = pci_resource_start (pdev, 1);
1379 mem = pci_resource_start (pdev, 2);
1380 pci_read_config_dword(pdev, 0x30, &plxdma);
1381 irq = pdev->irq;
1382 plxdma &= ~15;
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394 OUTL(io + PLX_SPACE0_RANGE, 0xFFE00000L);
1395 if (plxdma == 0)
1396 plxdma = mem + (2048L * 1024L);
1397 pci_write_config_dword(pdev, 0x30, plxdma + 1);
1398 pci_read_config_dword(pdev, 0x30, &plxdma);
1399 plxdma &= ~15;
1400
1401 dgrs_found_device(io, mem, irq, plxreg, plxdma);
1402
1403 cards_found++;
1404 }
1405 }
1406
1407
1408
1409
1410 if (EISA_bus)
1411 {
1412 for (io = 0x1000; io < 0x9000; io += 0x1000)
1413 {
1414 if (inb(io+ES4H_MANUFmsb) != 0x10
1415 || inb(io+ES4H_MANUFlsb) != 0x49
1416 || inb(io+ES4H_PRODUCT) != ES4H_PRODUCT_CODE)
1417 continue;
1418
1419 if ( ! (inb(io+ES4H_EC) & ES4H_EC_ENABLE) )
1420 continue;
1421
1422 mem = (inb(io+ES4H_AS_31_24) << 24)
1423 + (inb(io+ES4H_AS_23_16) << 16);
1424
1425 irq = is2iv[ inb(io+ES4H_IS) & ES4H_IS_INTMASK ];
1426
1427 dgrs_found_device(io, mem, irq, 0L, 0L);
1428
1429 ++cards_found;
1430 }
1431 }
1432
1433 return cards_found;
1434}
1435
1436
1437
1438
1439
1440static int debug = -1;
1441static int dma = -1;
1442static int hashexpire = -1;
1443static int spantree = -1;
1444static int ipaddr[4] = { -1 };
1445static int iptrap[4] = { -1 };
1446static __u32 ipxnet = -1;
1447static int nicmode = -1;
1448
1449MODULE_PARM(debug, "i");
1450MODULE_PARM(dma, "i");
1451MODULE_PARM(hashexpire, "i");
1452MODULE_PARM(spantree, "i");
1453MODULE_PARM(ipaddr, "1-4i");
1454MODULE_PARM(iptrap, "1-4i");
1455MODULE_PARM(ipxnet, "i");
1456MODULE_PARM(nicmode, "i");
1457MODULE_PARM_DESC(debug, "Digi RightSwitch enable debugging (0-1)");
1458MODULE_PARM_DESC(dma, "Digi RightSwitch enable BM DMA (0-1)");
1459MODULE_PARM_DESC(nicmode, "Digi RightSwitch operating mode (1: switch, 2: multi-NIC)");
1460
1461static int __init dgrs_init_module (void)
1462{
1463 int cards_found;
1464 int i;
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477 if (debug >= 0)
1478 dgrs_debug = debug;
1479 if (dma >= 0)
1480 dgrs_dma = dma;
1481 if (nicmode >= 0)
1482 dgrs_nicmode = nicmode;
1483 if (hashexpire >= 0)
1484 dgrs_hashexpire = hashexpire;
1485 if (spantree >= 0)
1486 dgrs_spantree = spantree;
1487 if (ipaddr[0] != -1)
1488 for (i = 0; i < 4; ++i)
1489 dgrs_ipaddr[i] = ipaddr[i];
1490 if (iptrap[0] != -1)
1491 for (i = 0; i < 4; ++i)
1492 dgrs_iptrap[i] = iptrap[i];
1493 if (ipxnet != -1)
1494 dgrs_ipxnet = htonl( ipxnet );
1495
1496 if (dgrs_debug)
1497 {
1498 printk(KERN_INFO "dgrs: SW=%s FW=Build %d %s\nFW Version=%s\n",
1499 version, dgrs_firmnum, dgrs_firmdate, dgrs_firmver);
1500 }
1501
1502
1503
1504
1505 dgrs_root_dev = NULL;
1506 cards_found = dgrs_scan();
1507
1508 return cards_found ? 0 : -ENODEV;
1509}
1510
1511static void __exit dgrs_cleanup_module (void)
1512{
1513 while (dgrs_root_dev)
1514 {
1515 struct net_device *next_dev;
1516 DGRS_PRIV *priv;
1517
1518 priv = (DGRS_PRIV *) dgrs_root_dev->priv;
1519 next_dev = priv->next_dev;
1520 unregister_netdev(dgrs_root_dev);
1521
1522 proc_reset(priv->devtbl[0], 1);
1523
1524 if (priv->vmem)
1525 iounmap(priv->vmem);
1526 if (priv->vplxdma)
1527 iounmap((uchar *) priv->vplxdma);
1528
1529 release_region(dgrs_root_dev->base_addr, 256);
1530
1531 if (dgrs_root_dev->irq)
1532 free_irq(dgrs_root_dev->irq, dgrs_root_dev);
1533
1534 kfree(dgrs_root_dev);
1535 dgrs_root_dev = next_dev;
1536 }
1537}
1538
1539module_init(dgrs_init_module);
1540module_exit(dgrs_cleanup_module);
1541