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/eisa.h>
88#include <linux/kernel.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[] = {
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 irqreturn_t 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 return IRQ_HANDLED;
977}
978
979
980
981
982static int __init
983dgrs_download(struct net_device *dev0)
984{
985 DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv;
986 int is;
987 unsigned long i;
988
989 static int iv2is[16] = {
990 0, 0, 0, ES4H_IS_INT3,
991 0, ES4H_IS_INT5, 0, ES4H_IS_INT7,
992 0, 0, ES4H_IS_INT10, ES4H_IS_INT11,
993 ES4H_IS_INT12, 0, 0, ES4H_IS_INT15 };
994
995
996
997
998 priv0->vmem = ioremap(dev0->mem_start, 2048*1024);
999 if (!priv0->vmem)
1000 {
1001 printk("%s: cannot map in board memory\n", dev0->name);
1002 return -ENXIO;
1003 }
1004
1005
1006
1007
1008 if (priv0->plxreg)
1009 {
1010 proc_reset(dev0, 1);
1011 }
1012 else
1013 {
1014 is = iv2is[dev0->irq & 0x0f];
1015 if (!is)
1016 {
1017 printk("%s: Illegal IRQ %d\n", dev0->name, dev0->irq);
1018 return -ENXIO;
1019 }
1020 OUTB(dev0->base_addr + ES4H_AS_31_24,
1021 (uchar) (dev0->mem_start >> 24) );
1022 OUTB(dev0->base_addr + ES4H_AS_23_16,
1023 (uchar) (dev0->mem_start >> 16) );
1024 priv0->is_reg = ES4H_IS_LINEAR | is |
1025 ((uchar) (dev0->mem_start >> 8) & ES4H_IS_AS15);
1026 OUTB(dev0->base_addr + ES4H_IS, priv0->is_reg);
1027 OUTB(dev0->base_addr + ES4H_EC, ES4H_EC_ENABLE);
1028 OUTB(dev0->base_addr + ES4H_PC, ES4H_PC_RESET);
1029 OUTB(dev0->base_addr + ES4H_MW, ES4H_MW_ENABLE | 0x00);
1030 }
1031
1032
1033
1034
1035 priv0->use_dma = check_board_dma(dev0);
1036 if (priv0->use_dma)
1037 printk("%s: Bus Master DMA is enabled.\n", dev0->name);
1038
1039
1040
1041
1042 memcpy(priv0->vmem, dgrs_code, dgrs_ncode);
1043 if (memcmp(priv0->vmem, dgrs_code, dgrs_ncode))
1044 {
1045 iounmap(priv0->vmem);
1046 priv0->vmem = NULL;
1047 printk("%s: download compare failed\n", dev0->name);
1048 return -ENXIO;
1049 }
1050
1051
1052
1053
1054 priv0->bcomm = (struct bios_comm *) (priv0->vmem + 0x0100);
1055 priv0->bcomm->bc_nowait = 1;
1056 priv0->bcomm->bc_squelch = 0;
1057 priv0->bcomm->bc_150ohm = 0;
1058
1059 priv0->bcomm->bc_spew = 0;
1060 priv0->bcomm->bc_maxrfd = 0;
1061 priv0->bcomm->bc_maxrbd = 0;
1062
1063
1064
1065
1066
1067 priv0->bcomm->bc_host = dgrs_nicmode ? BC_MULTINIC : BC_SWITCH;
1068
1069
1070
1071
1072 if (priv0->use_dma)
1073 priv0->bcomm->bc_hostarea_len = (2048/64) * 16;
1074
1075
1076
1077
1078 priv0->bcomm->bc_spantree = dgrs_spantree;
1079 priv0->bcomm->bc_hashexpire = dgrs_hashexpire;
1080 memcpy(priv0->bcomm->bc_ipaddr, dgrs_ipaddr, 4);
1081 memcpy(priv0->bcomm->bc_iptrap, dgrs_iptrap, 4);
1082 memcpy(priv0->bcomm->bc_ipxnet, &dgrs_ipxnet, 4);
1083
1084
1085
1086
1087 proc_reset(dev0, 0);
1088
1089 for (i = jiffies + 8 * HZ; time_after(i, jiffies); )
1090 {
1091 barrier();
1092 if (priv0->bcomm->bc_status >= BC_RUN)
1093 break;
1094 }
1095
1096 if (priv0->bcomm->bc_status < BC_RUN)
1097 {
1098 printk("%s: board not operating\n", dev0->name);
1099 return -ENXIO;
1100 }
1101
1102 priv0->port = (PORT *) S2H(priv0->bcomm->bc_port);
1103 priv0->scbp = (I596_SCB *) S2H(priv0->port->scbp);
1104 priv0->rfdp = (I596_RFD *) S2H(priv0->scbp->rfdp);
1105 priv0->rbdp = (I596_RBD *) S2H(priv0->rfdp->rbdp);
1106
1107 priv0->scbp->status = I596_SCB_CNA;
1108
1109
1110
1111
1112
1113
1114
1115
1116 priv0->dmadesc_s = (DMACHAIN *) S2DMA(priv0->bcomm->bc_hostarea);
1117 if (priv0->dmadesc_s)
1118 priv0->dmadesc_h = (DMACHAIN *) S2H(priv0->dmadesc_s);
1119 else
1120 priv0->dmadesc_h = NULL;
1121
1122
1123
1124
1125 if (priv0->plxreg)
1126 {
1127 OUTL(dev0->base_addr + PLX_INT_CSR,
1128 inl(dev0->base_addr + PLX_INT_CSR)
1129 | PLX_PCI_DOORBELL_IE);
1130 OUTL(dev0->base_addr + PLX_LCL2PCI_DOORBELL, 1);
1131 }
1132 else
1133 {
1134 }
1135
1136 return (0);
1137}
1138
1139
1140
1141
1142int __init
1143dgrs_probe1(struct net_device *dev)
1144{
1145 DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
1146 unsigned long i;
1147 int rc;
1148
1149 printk("%s: Digi RightSwitch io=%lx mem=%lx irq=%d plx=%lx dma=%lx\n",
1150 dev->name, dev->base_addr, dev->mem_start, dev->irq,
1151 priv->plxreg, priv->plxdma);
1152
1153
1154
1155
1156 rc = dgrs_download(dev);
1157 if (rc)
1158 goto err_out;
1159
1160
1161
1162
1163 printk("%s: Ethernet address", dev->name);
1164 memcpy(dev->dev_addr, priv->port->ethaddr, 6);
1165 for (i = 0; i < 6; ++i)
1166 printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
1167 printk("\n");
1168
1169 if (dev->dev_addr[0] & 1)
1170 {
1171 printk("%s: Illegal Ethernet Address\n", dev->name);
1172 rc = -ENXIO;
1173 goto err_out;
1174 }
1175
1176
1177
1178
1179
1180 if (priv->plxreg)
1181 OUTL(dev->base_addr + PLX_LCL2PCI_DOORBELL, 1);
1182
1183 rc = request_irq(dev->irq, &dgrs_intr, SA_SHIRQ, "RightSwitch", dev);
1184 if (rc)
1185 goto err_out;
1186
1187 priv->intrcnt = 0;
1188 for (i = jiffies + 2*HZ + HZ/2; time_after(i, jiffies); )
1189 {
1190 barrier();
1191 if (priv->intrcnt >= 2)
1192 break;
1193 }
1194 if (priv->intrcnt < 2)
1195 {
1196 printk(KERN_ERR "%s: Not interrupting on IRQ %d (%d)\n",
1197 dev->name, dev->irq, priv->intrcnt);
1198 rc = -ENXIO;
1199 goto err_free_irq;
1200 }
1201
1202
1203
1204
1205 if (!request_region(dev->base_addr, 256, "RightSwitch")) {
1206 printk(KERN_ERR "%s: io 0x%3lX, which is busy.\n", dev->name,
1207 dev->base_addr);
1208 rc = -EBUSY;
1209 goto err_free_irq;
1210 }
1211
1212
1213
1214
1215 dev->open = &dgrs_open;
1216 dev->stop = &dgrs_close;
1217 dev->get_stats = &dgrs_get_stats;
1218 dev->hard_start_xmit = &dgrs_start_xmit;
1219 dev->set_multicast_list = &dgrs_set_multicast_list;
1220 dev->do_ioctl = &dgrs_ioctl;
1221
1222 return rc;
1223
1224err_free_irq:
1225 free_irq(dev->irq, dev);
1226err_out:
1227 return rc;
1228}
1229
1230int __init
1231dgrs_initclone(struct net_device *dev)
1232{
1233 DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
1234 int i;
1235
1236 printk("%s: Digi RightSwitch port %d ",
1237 dev->name, priv->chan);
1238 for (i = 0; i < 6; ++i)
1239 printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
1240 printk("\n");
1241
1242 return (0);
1243}
1244
1245static int __init
1246dgrs_found_device(
1247 int io,
1248 ulong mem,
1249 int irq,
1250 ulong plxreg,
1251 ulong plxdma
1252)
1253{
1254 DGRS_PRIV *priv;
1255 struct net_device *dev, *aux;
1256 int i, ret;
1257
1258 dev = alloc_etherdev(sizeof(DGRS_PRIV));
1259 if (!dev)
1260 return -ENOMEM;
1261
1262 priv = (DGRS_PRIV *)dev->priv;
1263
1264 dev->base_addr = io;
1265 dev->mem_start = mem;
1266 dev->mem_end = mem + 2048 * 1024 - 1;
1267 dev->irq = irq;
1268 priv->plxreg = plxreg;
1269 priv->plxdma = plxdma;
1270 priv->vplxdma = NULL;
1271
1272 priv->chan = 1;
1273 priv->devtbl[0] = dev;
1274
1275 dev->init = dgrs_probe1;
1276 SET_MODULE_OWNER(dev);
1277
1278 if (register_netdev(dev) != 0) {
1279 free_netdev(dev);
1280 return -EIO;
1281 }
1282
1283 priv->next_dev = dgrs_root_dev;
1284 dgrs_root_dev = dev;
1285
1286 if ( !dgrs_nicmode )
1287 return (0);
1288
1289
1290
1291
1292
1293 priv->nports = priv->bcomm->bc_nports;
1294
1295 for (i = 1; i < priv->nports; ++i)
1296 {
1297 struct net_device *devN;
1298 DGRS_PRIV *privN;
1299
1300 devN = alloc_etherdev(sizeof(DGRS_PRIV));
1301 ret = -ENOMEM;
1302 if (!devN)
1303 goto fail;
1304
1305
1306 *devN = *dev;
1307
1308
1309 privN = (DGRS_PRIV *)devN->priv;
1310 *privN = *priv;
1311
1312
1313 privN->vmem = 0;
1314 privN->vplxdma = 0;
1315
1316 devN->irq = 0;
1317
1318 devN->dev_addr[5] += i;
1319
1320 strncpy(devN->name, "eth%d", IFNAMSIZ);
1321 devN->init = dgrs_initclone;
1322 SET_MODULE_OWNER(devN);
1323
1324 ret = -EIO;
1325 if (register_netdev(devN)) {
1326 free_netdev(devN);
1327 goto fail;
1328 }
1329 privN->chan = i+1;
1330 priv->devtbl[i] = devN;
1331 privN->next_dev = dgrs_root_dev;
1332 dgrs_root_dev = devN;
1333 }
1334 return 0;
1335fail: aux = priv->next_dev;
1336 while (dgrs_root_dev != aux) {
1337 struct net_device *d = dgrs_root_dev;
1338
1339 dgrs_root_dev = ((DGRS_PRIV *)d->priv)->next_dev;
1340 unregister_netdev(d);
1341 free_netdev(d);
1342 }
1343 return ret;
1344}
1345
1346
1347
1348
1349static int is2iv[8] __initdata = { 0, 3, 5, 7, 10, 11, 12, 15 };
1350
1351static int __init dgrs_scan(void)
1352{
1353 int cards_found = 0;
1354 uint io;
1355 uint mem;
1356 uint irq;
1357 uint plxreg;
1358 uint plxdma;
1359 struct pci_dev *pdev = NULL;
1360
1361
1362
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 if (EISA_bus)
1410 {
1411 for (io = 0x1000; io < 0x9000; io += 0x1000)
1412 {
1413 if (inb(io+ES4H_MANUFmsb) != 0x10
1414 || inb(io+ES4H_MANUFlsb) != 0x49
1415 || inb(io+ES4H_PRODUCT) != ES4H_PRODUCT_CODE)
1416 continue;
1417
1418 if ( ! (inb(io+ES4H_EC) & ES4H_EC_ENABLE) )
1419 continue;
1420
1421 mem = (inb(io+ES4H_AS_31_24) << 24)
1422 + (inb(io+ES4H_AS_23_16) << 16);
1423
1424 irq = is2iv[ inb(io+ES4H_IS) & ES4H_IS_INTMASK ];
1425
1426 dgrs_found_device(io, mem, irq, 0L, 0L);
1427
1428 ++cards_found;
1429 }
1430 }
1431
1432 return cards_found;
1433}
1434
1435
1436
1437
1438
1439static int debug = -1;
1440static int dma = -1;
1441static int hashexpire = -1;
1442static int spantree = -1;
1443static int ipaddr[4] = { -1 };
1444static int iptrap[4] = { -1 };
1445static __u32 ipxnet = -1;
1446static int nicmode = -1;
1447
1448MODULE_PARM(debug, "i");
1449MODULE_PARM(dma, "i");
1450MODULE_PARM(hashexpire, "i");
1451MODULE_PARM(spantree, "i");
1452MODULE_PARM(ipaddr, "1-4i");
1453MODULE_PARM(iptrap, "1-4i");
1454MODULE_PARM(ipxnet, "i");
1455MODULE_PARM(nicmode, "i");
1456MODULE_PARM_DESC(debug, "Digi RightSwitch enable debugging (0-1)");
1457MODULE_PARM_DESC(dma, "Digi RightSwitch enable BM DMA (0-1)");
1458MODULE_PARM_DESC(nicmode, "Digi RightSwitch operating mode (1: switch, 2: multi-NIC)");
1459
1460static int __init dgrs_init_module (void)
1461{
1462 int cards_found;
1463 int i;
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476 if (debug >= 0)
1477 dgrs_debug = debug;
1478 if (dma >= 0)
1479 dgrs_dma = dma;
1480 if (nicmode >= 0)
1481 dgrs_nicmode = nicmode;
1482 if (hashexpire >= 0)
1483 dgrs_hashexpire = hashexpire;
1484 if (spantree >= 0)
1485 dgrs_spantree = spantree;
1486 if (ipaddr[0] != -1)
1487 for (i = 0; i < 4; ++i)
1488 dgrs_ipaddr[i] = ipaddr[i];
1489 if (iptrap[0] != -1)
1490 for (i = 0; i < 4; ++i)
1491 dgrs_iptrap[i] = iptrap[i];
1492 if (ipxnet != -1)
1493 dgrs_ipxnet = htonl( ipxnet );
1494
1495 if (dgrs_debug)
1496 {
1497 printk(KERN_INFO "dgrs: SW=%s FW=Build %d %s\nFW Version=%s\n",
1498 version, dgrs_firmnum, dgrs_firmdate, dgrs_firmver);
1499 }
1500
1501
1502
1503
1504 dgrs_root_dev = NULL;
1505 cards_found = dgrs_scan();
1506
1507 return cards_found ? 0 : -ENODEV;
1508}
1509
1510static void __exit dgrs_cleanup_module (void)
1511{
1512 while (dgrs_root_dev)
1513 {
1514 struct net_device *next_dev;
1515 DGRS_PRIV *priv;
1516
1517 priv = (DGRS_PRIV *) dgrs_root_dev->priv;
1518 next_dev = priv->next_dev;
1519 unregister_netdev(dgrs_root_dev);
1520
1521 proc_reset(priv->devtbl[0], 1);
1522
1523 if (priv->vmem)
1524 iounmap(priv->vmem);
1525 if (priv->vplxdma)
1526 iounmap((uchar *) priv->vplxdma);
1527
1528 release_region(dgrs_root_dev->base_addr, 256);
1529
1530 if (dgrs_root_dev->irq)
1531 free_irq(dgrs_root_dev->irq, dgrs_root_dev);
1532
1533 free_netdev(dgrs_root_dev);
1534 dgrs_root_dev = next_dev;
1535 }
1536}
1537
1538module_init(dgrs_init_module);
1539module_exit(dgrs_cleanup_module);
1540