This source file includes following definitions.
- arcnet_probe
- arcnet_ioprobe
- arcnet_memprobe
- arcnet_reset
- arcnetE_init
- arcnet_open
- arcnet_close
- arcnetA_send_packet
- arcnetA_continue_tx
- arcnetA_prepare_tx
- arcnetA_go_tx
- arcnetE_send_packet
- arcnet_interrupt
- arcnet_inthandler
- arcnet_rx
- arcnetA_rx
- arcnetE_rx
- arcnet_get_stats
- set_multicast_list
- arcnetA_header
- arcnetA_rebuild_header
- arcnetA_type_trans
- init_module
- cleanup_module
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 static const char *version =
134 "arcnet.c:v1.93 ALPHA 95/08/10 Avery Pennarun <apenwarr@foxnet.net>\n";
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149 #define DETECT_RECONFIGS
150
151
152
153
154
155
156
157
158
159 #define VERIFY_ACK
160
161
162
163
164 #undef static
165
166
167
168
169 #include <linux/config.h>
170 #include <linux/version.h>
171
172 #ifdef MODULE
173 #include <linux/module.h>
174 #endif
175
176
177
178 #if LINUX_VERSION_CODE < 0x10300
179 #define LINUX12
180 #endif
181
182
183 #include <linux/kernel.h>
184 #include <linux/sched.h>
185 #include <linux/types.h>
186 #include <linux/fcntl.h>
187 #include <linux/interrupt.h>
188 #include <linux/ptrace.h>
189 #include <linux/ioport.h>
190 #include <linux/in.h>
191 #include <linux/malloc.h>
192 #include <linux/string.h>
193 #include <linux/timer.h>
194 #include <linux/errno.h>
195 #include <linux/delay.h>
196
197 #include <asm/system.h>
198 #include <asm/bitops.h>
199 #include <asm/io.h>
200 #include <asm/dma.h>
201
202 #include <linux/netdevice.h>
203 #include <linux/etherdevice.h>
204 #include <linux/skbuff.h>
205
206 #include <net/arp.h>
207
208
209
210
211
212
213
214
215
216
217 #define D_NORMAL 1
218 #define D_INIT 2
219 #define D_EXTRA 4
220
221 #define D_DURING 8
222 #define D_TX 16
223 #define D_RX 32
224 #define D_SKB 64
225
226 #ifndef NET_DEBUG
227 #define NET_DEBUG D_NORMAL|D_INIT|D_EXTRA
228 #endif
229 int arcnet_debug = NET_DEBUG;
230
231 #ifndef HAVE_AUTOIRQ
232
233 extern void autoirq_setup(int waittime);
234 extern int autoirq_report(int waittime);
235
236
237 extern struct device *irq2dev_map[16];
238 #endif
239
240 #ifndef HAVE_PORTRESERVE
241 #define check_region(ioaddr, size) 0
242 #define request_region(ioaddr, size) do ; while (0)
243 #endif
244
245
246 #define BUGLVL(x) if (arcnet_debug&(x))
247
248
249
250 #define TBUSY lp->adev->tbusy \
251 =lp->edev->tbusy
252 #define IF_TBUSY (lp->adev->tbusy \
253 || lp->edev->tbusy)
254 #define START lp->adev->start \
255 =lp->edev->start
256
257
258
259 #define ARCNET_TOTAL_SIZE 16
260
261
262
263
264 #define INTMASK (ioaddr+0)
265 #define STATUS (ioaddr+0)
266 #define COMMAND (ioaddr+1)
267 #define RESET (ioaddr+8)
268
269
270
271 #define RESETtime 40
272 #define XMITtime 10
273 #define ACKtime 10
274
275
276
277
278
279
280
281
282
283 #define MTU 253
284 #define MinTU 257
285 #define XMTU 508
286
287
288 #define TXFREEflag 0x01
289 #define TXACKflag 0x02
290 #define RECONflag 0x04
291 #define TESTflag 0x08
292 #define RESETflag 0x10
293 #define RES1flag 0x20
294 #define RES2flag 0x40
295 #define NORXflag 0x80
296
297 #ifdef DETECT_RECONFIGS
298 #define RECON_flag RECONflag
299 #else
300 #define RECON_flag 0
301 #endif
302
303
304
305
306
307
308 #define NOTXcmd 0x01
309 #define NORXcmd 0x02
310 #define TXcmd 0x03
311 #define RXcmd 0x04
312 #define CONFIGcmd 0x05
313 #define CFLAGScmd 0x06
314 #define TESTcmd 0x07
315
316
317 #define RESETclear 0x08
318 #define CONFIGclear 0x10
319
320
321 #define TESTload 0x08
322
323
324 #define TESTvalue 0321
325
326
327 #define RXbcasts 0x80
328
329
330 #define NORMALconf 0x00
331 #define EXTconf 0x08
332
333
334
335 #define EnableReceiver() outb(RXcmd|(recbuf<<3)|RXbcasts,COMMAND)
336
337
338 #define ARC_P_IP 212
339 #define ARC_P_ARP 213
340 #define ARC_P_RARP 214
341 #define ARC_P_IPX 250
342
343
344 #define ARC_P_MS_TCPIP 0xE8
345
346
347 #define ARC_P_LANSOFT 251
348 #define ARC_P_ATALK 0xDD
349
350
351 #define NORMAL 0
352 #define EXTENDED 1
353 #define EXCEPTION 2
354
355
356 struct HardHeader
357 {
358 u_char source,
359 destination,
360 offset1,
361 offset2;
362 };
363
364
365 union ArcPacket
366 {
367 struct HardHeader hardheader;
368 u_char raw[512];
369 };
370
371
372
373
374
375 struct ClientData
376 {
377
378
379
380 u_char saddr,
381 daddr;
382
383
384 u_char protocol_id,
385 split_flag;
386 u_short sequence;
387 };
388 #define EXTRA_CLIENTDATA (sizeof(struct ClientData)-4)
389
390
391
392
393
394 struct Incoming
395 {
396 struct sk_buff *skb;
397 unsigned char lastpacket,
398 numpackets;
399 u_short sequence;
400 };
401
402 struct Outgoing
403 {
404 struct sk_buff *skb;
405 struct ClientData *hdr;
406 u_char *data;
407 short length,
408 dataleft,
409 segnum,
410 numsegs,
411 seglen;
412 #ifdef VERIFY_ACK
413 short lastload_dest,
414 lasttrans_dest;
415 #endif
416
417 };
418
419
420
421 struct arcnet_local {
422 struct enet_statistics stats;
423 u_char arcnum;
424 u_short sequence;
425 u_char recbuf,
426 txbuf,
427 txready;
428 short intx,
429 in_txhandler,
430 sending;
431 short tx_left;
432
433 struct timer_list timer;
434 struct Incoming incoming[256];
435 struct Outgoing outgoing;
436
437 struct device *adev;
438 struct device *edev;
439 };
440
441
442
443 extern int arcnet_probe(struct device *dev);
444 #ifndef MODULE
445 static int arcnet_memprobe(struct device *dev,u_char *addr);
446 static int arcnet_ioprobe(struct device *dev, short ioaddr);
447 #endif
448 static int arcnetE_init(struct device *dev);
449
450 static int arcnet_open(struct device *dev);
451 static int arcnet_close(struct device *dev);
452 static int arcnet_reset(struct device *dev);
453
454 static int arcnetA_send_packet(struct sk_buff *skb, struct device *dev);
455 static void arcnetA_continue_tx(struct device *dev);
456 static void arcnetA_prepare_tx(struct device *dev,struct ClientData *hdr,
457 short length,char *data);
458 static void arcnetA_go_tx(struct device *dev);
459
460 static int arcnetE_send_packet(struct sk_buff *skb, struct device *dev);
461
462 static void arcnet_interrupt(int irq,struct pt_regs *regs);
463 static void arcnet_inthandler(struct device *dev);
464
465 static void arcnet_rx(struct device *dev,int recbuf);
466 static void arcnetA_rx(struct device *dev,struct ClientData *arcsoft,
467 int length,u_char saddr, u_char daddr);
468 static void arcnetE_rx(struct device *dev,u_char *arcsoft,
469 int length,u_char saddr, u_char daddr);
470
471 static struct enet_statistics *arcnet_get_stats(struct device *dev);
472 static void set_multicast_list(struct device *dev, int num_addrs, void *addrs);
473
474
475 #ifdef LINUX12
476 int arcnetA_header(unsigned char *buff,struct device *dev,
477 unsigned short type,void *daddr,void *saddr,unsigned len,
478 struct sk_buff *skb);
479 #else
480 int arcnetA_header(struct sk_buff *skb,struct device *dev,
481 unsigned short type,void *daddr,void *saddr,unsigned len);
482 #endif
483 int arcnetA_rebuild_header(void *eth,struct device *dev,unsigned long raddr,
484 struct sk_buff *skb);
485 unsigned short arcnetA_type_trans(struct sk_buff *skb,struct device *dev);
486
487 #ifdef MODULE
488 int init_module(void);
489 void cleanup_module(void);
490 #endif
491
492 #define tx_done(dev) 1
493
494 #define JIFFER(time) for (delayval=0; delayval<(time*10); delayval++) \
495 udelay(1000);
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511 int
512 arcnet_probe(struct device *dev)
513 {
514 #ifndef MODULE
515
516
517
518 int *port, ports[] = {
519 0x300,0x2E0,0x2F0,0x2D0,
520
521 0x200,0x210,0x220,0x230,0x240,0x250,0x260,0x270,
522 0x280,0x290,0x2a0,0x2b0,0x2c0,
523 0x310,0x320,0x330,0x340,0x350,0x360,0x370,
524 0x380,0x390,0x3a0,0x3e0,0x3f0,
525
526 0};
527
528
529 unsigned long *addr, addrs[] = {0xD0000,0xE0000,0xA0000,0xB0000,
530 0xC0000,0xF0000,
531
532 0xE1000,
533 0xDD000,0xDC000,
534 0xD9000,0xD8000,0xD5000,0xD4000,0xD1000,
535 0xCD000,0xCC000,
536 0xC9000,0xC8000,0xC5000,0xC4000,
537
538 0};
539 int base_addr=dev->base_addr, status=0;
540 #endif
541 int delayval;
542 struct arcnet_local *lp;
543
544 BUGLVL(D_NORMAL)
545 {
546 printk(version);
547 printk("arcnet: ***\n");
548 printk("arcnet: * Read linux/drivers/net/README.arcnet for important release notes!\n");
549 printk("arcnet: *\n");
550 printk("arcnet: * This is an ALPHA version! (Last stable release: v1.02) E-mail me if\n");
551 printk("arcnet: * you have any questions, comments, or bug reports.\n");
552 printk("arcnet: ***\n");
553 }
554
555 BUGLVL(D_INIT)
556 printk("arcnet: given: base %lXh, IRQ %Xh, shmem %lXh\n",
557 dev->base_addr,dev->irq,dev->mem_start);
558
559 #ifndef MODULE
560 if (base_addr > 0x1ff)
561 status=arcnet_ioprobe(dev, base_addr);
562 else if (base_addr > 0)
563 return ENXIO;
564 else for (port = &ports[0]; *port; port++)
565 {
566 int ioaddr = *port;
567 if (check_region(ioaddr, ARCNET_TOTAL_SIZE))
568 {
569 BUGLVL(D_INIT)
570 printk("arcnet: Skipping %Xh because of check_region...\n",
571 ioaddr);
572 continue;
573 }
574
575 status=arcnet_ioprobe(dev, ioaddr);
576 if (!status) break;
577 }
578
579 if (status) return status;
580
581
582
583
584 BUGLVL(D_INIT)
585 printk("arcnet: ioprobe okay! Waiting for reset...\n");
586 JIFFER(100);
587
588
589 BUGLVL(D_INIT)
590 printk("arcnet: starting memory probe, given %lXh\n",
591 dev->mem_start);
592 if (dev->mem_start)
593 {
594 status=arcnet_memprobe(dev,(u_char *)dev->mem_start);
595 if (status) return status;
596 }
597 else
598 {
599 for (addr = &addrs[0]; *addr; addr++) {
600 status=arcnet_memprobe(dev,(u_char *)(*addr));
601 if (!status) break;
602 }
603
604 if (status) return status;
605 }
606 #else
607 if (!dev->base_addr || !dev->irq || !dev->mem_start
608 || !dev->rmem_start)
609 {
610 printk("arcnet: loadable modules can't autoprobe!\n");
611 printk("arcnet: try using io=, irqnum=, and shmem= on the insmod line.\n");
612 printk("arcnet: you may also need num= to change the device name. (ie. num=1 for arc1)\n");
613 return ENODEV;
614 }
615 #endif
616
617 {
618 int irqval = request_irq(dev->irq, &arcnet_interrupt, 0,
619 "arcnet");
620 if (irqval) {
621 printk("%s: unable to get IRQ %d (irqval=%d).\n",
622 dev->name,dev->irq, irqval);
623 return EAGAIN;
624 }
625 }
626
627
628 request_region(dev->base_addr, ARCNET_TOTAL_SIZE,"arcnet");
629
630 printk("%s: ARCnet card found at %03lXh, IRQ %d, ShMem at %lXh.\n",
631 dev->name, dev->base_addr, dev->irq, dev->mem_start);
632
633
634 dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL);
635 memset(dev->priv, 0, sizeof(struct arcnet_local));
636 lp=(struct arcnet_local *)(dev->priv);
637
638 dev->open=arcnet_open;
639 dev->stop=arcnet_close;
640 dev->hard_start_xmit=arcnetA_send_packet;
641 dev->get_stats=arcnet_get_stats;
642 #ifdef HAVE_MULTICAST
643 dev->set_multicast_list = &set_multicast_list;
644 #endif
645
646
647
648
649 ether_setup(dev);
650
651
652 dev->type=ARPHRD_ARCNET;
653 dev->hard_header_len=sizeof(struct ClientData);
654 BUGLVL(D_DURING)
655 printk("arcnet: ClientData header size is %d.\narcnet: HardHeader size is %d.\n",
656 sizeof(struct ClientData),sizeof(struct HardHeader));
657
658
659
660
661 dev->addr_len=1;
662 dev->broadcast[0]=0x00;
663
664 BUGLVL(D_INIT) printk("arcnet: arcnet_probe: resetting card.\n");
665 arcnet_reset(dev);
666 JIFFER(50);
667 BUGLVL(D_NORMAL)
668 printk("arcnet: We appear to be station %d (%02Xh)\n",
669 lp->arcnum,lp->arcnum);
670 if (lp->arcnum==0)
671 printk("arcnet: WARNING! Station address 0 is reserved for broadcasts!\n");
672 if (lp->arcnum==255)
673 printk("arcnet: WARNING! Station address 255 may confuse DOS networking programs!\n");
674 dev->dev_addr[0]=lp->arcnum;
675 lp->sequence=1;
676 lp->recbuf=0;
677
678 dev->hard_header=arcnetA_header;
679 dev->rebuild_header=arcnetA_rebuild_header;
680
681 #ifdef LINUX12
682 dev->type_trans=arcnetA_type_trans;
683 #endif
684
685 return 0;
686 }
687
688 #ifndef MODULE
689
690 int arcnet_ioprobe(struct device *dev, short ioaddr)
691 {
692 int delayval,airq;
693
694 BUGLVL(D_INIT)
695 {
696 printk("arcnet: probing address %Xh\n",ioaddr);
697 printk("arcnet: status1=%Xh\n",inb(STATUS));
698 }
699
700
701
702
703
704
705
706
707 inb(RESET);
708 JIFFER(RESETtime);
709
710
711 if (inb(STATUS)==0xFF)
712 {
713 BUGLVL(D_INIT)
714 printk("arcnet: probe failed. Status port empty.\n");
715 return ENODEV;
716 }
717
718 #if 0
719
720
721
722
723
724 {
725 int initval,curval;
726
727 curval=initval=inb(COMMAND);
728 delayval=jiffies+5;
729 while (delayval>=jiffies && curval==initval)
730 curval=inb(COMMAND);
731
732 if (curval==initval)
733 {
734 printk("arcnet: probe failed. never-changing command port (%02Xh).\n",
735 initval);
736 return ENODEV;
737 }
738 }
739 #endif
740
741 BUGLVL(D_INIT)
742 printk("arcnet: status2=%Xh\n",inb(STATUS));
743
744
745 outb(CFLAGScmd|RESETclear|CONFIGclear,COMMAND);
746 if (inb(STATUS) & RESETflag)
747 {
748 BUGLVL(D_INIT)
749 printk("arcnet: probe failed. eternal reset flag1...(status=%Xh)\n",
750 inb(STATUS));
751 return ENODEV;
752 }
753
754
755 autoirq_setup(0);
756
757
758
759
760
761
762
763
764
765 outb(NORXflag,INTMASK);
766 JIFFER(RESETtime);
767 outb(0,INTMASK);
768
769
770 outb(CFLAGScmd|RESETclear|CONFIGclear,COMMAND);
771
772 airq = autoirq_report(0);
773 BUGLVL(D_INIT) if (airq)
774 printk("arcnet: autoirq is %d\n", airq);
775
776
777
778
779 if (!airq && !(dev->base_addr && dev->irq))
780 {
781 BUGLVL(D_INIT)
782 printk("arcnet: probe failed. no autoirq...\n");
783 return ENODEV;
784 }
785
786
787
788 if (inb(STATUS) & RESETflag)
789 {
790
791 outb(CFLAGScmd|RESETclear|CONFIGclear,COMMAND);
792 }
793
794 if (inb(STATUS) & RESETflag)
795 {
796 BUGLVL(D_INIT)
797 printk("arcnet: probe failed. eternal reset flag...(status=%Xh)\n",
798 inb(STATUS));
799 return ENODEV;
800 }
801
802
803 if (!dev->base_addr) dev->base_addr=ioaddr;
804
805 if (dev->irq < 2)
806 {
807
808 dev->irq=airq;
809 }
810 else if (dev->irq == 2)
811 {
812 BUGLVL(D_NORMAL)
813 printk("arcnet: IRQ2 == IRQ9, don't worry.\n");
814 dev->irq = 9;
815 }
816
817 BUGLVL(D_INIT)
818 printk("arcnet: irq and base address seem okay. (%lXh, IRQ %d)\n",
819 dev->base_addr,dev->irq);
820 return 0;
821 }
822
823
824
825
826
827
828 int arcnet_memprobe(struct device *dev,u_char *addr)
829 {
830 BUGLVL(D_INIT)
831 printk("arcnet: probing memory at %lXh\n",(u_long)addr);
832
833 dev->mem_start=0;
834
835
836 if (addr[0]!=TESTvalue)
837 {
838 BUGLVL(D_INIT)
839 printk("arcnet: probe failed. addr=%lXh, addr[0]=%Xh (not %Xh)\n",
840 (unsigned long)addr,addr[0],TESTvalue);
841 return ENODEV;
842 }
843
844
845 addr[0]=0x42;
846 if (addr[0]!=0x42)
847 {
848 BUGLVL(D_INIT)
849 printk("arcnet: probe failed. addr=%lXh, addr[0]=%Xh (not 42h)\n",
850 (unsigned long)addr,addr[0]);
851 return ENODEV;
852 }
853
854
855 dev->mem_start=(unsigned long)addr;
856 dev->mem_end=dev->mem_start+512*4-1;
857 dev->rmem_start=dev->mem_start+512*0;
858 dev->rmem_end=dev->mem_start+512*2-1;
859
860 return 0;
861 }
862
863 #endif
864
865
866 int arcnet_reset(struct device *dev)
867 {
868 struct arcnet_local *lp=(struct arcnet_local *)dev->priv;
869 short ioaddr=dev->base_addr;
870 int delayval,recbuf=lp->recbuf;
871 u_char *cardmem;
872
873 outb(0,INTMASK);
874
875 BUGLVL(D_INIT)
876 printk("arcnet: Resetting %s (status=%Xh)\n",
877 dev->name,inb(STATUS));
878
879 inb(RESET);
880 JIFFER(RESETtime);
881
882 outb(CFLAGScmd|RESETclear, COMMAND);
883 outb(CFLAGScmd|CONFIGclear,COMMAND);
884
885
886
887
888 cardmem = (u_char *) dev->mem_start;
889 if (cardmem[0] != TESTvalue)
890 {
891 BUGLVL(D_INIT)
892 printk("arcnet: reset failed: TESTvalue not present.\n");
893 return 1;
894 }
895 lp->arcnum=cardmem[1];
896
897
898 recbuf=lp->recbuf=0;
899 lp->txbuf=2;
900
901
902 outb(CONFIGcmd|EXTconf,COMMAND);
903
904
905 BUGLVL(D_DURING)
906 memset((void *)dev->mem_start,0x42,2048);
907
908
909 EnableReceiver();
910
911
912 outb(NORXflag|RECON_flag,INTMASK);
913
914
915 return 0;
916 }
917
918 static int arcnetE_init(struct device *dev)
919 {
920 struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
921
922 ether_setup(lp->edev);
923 dev->dev_addr[0]=0;
924 dev->dev_addr[5]=lp->arcnum;
925 dev->mtu=493;
926 lp->edev->open=NULL;
927 lp->edev->stop=NULL;
928 lp->edev->hard_start_xmit=arcnetE_send_packet;
929
930 BUGLVL(D_EXTRA)
931 printk("%s: ARCnet \"Ethernet-Encap\" protocol initialized.\n",
932 lp->edev->name);
933
934 return 0;
935 }
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952 static int
953 arcnet_open(struct device *dev)
954 {
955 struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
956
957 if (dev->metric>=1000)
958 {
959 arcnet_debug=dev->metric-1000;
960 printk("arcnet: debug level set to %d\n",arcnet_debug);
961 dev->metric=1;
962 }
963
964 BUGLVL(D_NORMAL) printk(version);
965
966 irq2dev_map[dev->irq] = dev;
967
968 BUGLVL(D_EXTRA) printk("arcnet: arcnet_open: resetting card.\n");
969
970
971 if (arcnet_reset(dev) && arcnet_reset(dev))
972 return -ENODEV;
973
974 dev->tbusy=0;
975 dev->interrupt=0;
976 lp->intx=0;
977 lp->in_txhandler=0;
978
979
980 lp->adev=dev;
981 BUGLVL(D_EXTRA)
982 printk("%s: ARCnet RFC1201 protocol initialized.\n",
983 lp->adev->name);
984
985
986 lp->edev=(struct device *)kmalloc(sizeof(struct device),GFP_KERNEL);
987 memcpy(lp->edev,dev,sizeof(struct device));
988 lp->edev->name=(char *)kmalloc(10,GFP_KERNEL);
989 sprintf(lp->edev->name,"%se",dev->name);
990 lp->edev->init=arcnetE_init;
991 register_netdev(lp->edev);
992
993
994 START=1;
995
996 #ifdef MODULE
997 MOD_INC_USE_COUNT;
998 #endif
999
1000 return 0;
1001 }
1002
1003
1004
1005
1006 static int
1007 arcnet_close(struct device *dev)
1008 {
1009 int ioaddr = dev->base_addr;
1010 struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
1011
1012 TBUSY=1;
1013 START=0;
1014
1015
1016
1017 outb(0,INTMASK);
1018 outb(NOTXcmd,COMMAND);
1019 outb(NORXcmd,COMMAND);
1020
1021
1022 lp->adev=NULL;
1023
1024
1025 lp->edev->start=0;
1026 lp->edev->priv=NULL;
1027 unregister_netdev(lp->edev);
1028 kfree(lp->edev->name);
1029 kfree(lp->edev);
1030 lp->edev=NULL;
1031
1032
1033
1034 #ifdef MODULE
1035 MOD_DEC_USE_COUNT;
1036 #endif
1037
1038 return 0;
1039 }
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052 static int
1053 arcnetA_send_packet(struct sk_buff *skb, struct device *dev)
1054 {
1055 struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
1056 int ioaddr=dev->base_addr;
1057
1058 lp->intx++;
1059
1060 BUGLVL(D_DURING)
1061 printk("arcnet: transmit requested (status=%Xh, inTX=%d)\n",
1062 inb(STATUS),lp->intx);
1063
1064 if (lp->in_txhandler)
1065 {
1066 printk("arcnet: send_packet called while in txhandler!\n");
1067 lp->intx--;
1068 return 1;
1069 }
1070
1071 if (IF_TBUSY)
1072 {
1073
1074
1075 int tickssofar = jiffies - dev->trans_start;
1076 int recbuf=lp->recbuf;
1077 int status=inb(STATUS);
1078
1079 if (tickssofar < 5)
1080 {
1081 BUGLVL(D_DURING)
1082 printk("arcnet: premature kickme! (status=%Xh ticks=%d o.skb=%ph numsegs=%d segnum=%d\n",
1083 status,tickssofar,lp->outgoing.skb,
1084 lp->outgoing.numsegs,
1085 lp->outgoing.segnum);
1086 lp->intx--;
1087 return 1;
1088 }
1089
1090 BUGLVL(D_EXTRA)
1091 printk("arcnet: transmit timed out (status=%Xh, inTX=%d, inTXh=%d, tickssofar=%d)\n",
1092 status,lp->intx,lp->in_txhandler,tickssofar);
1093
1094 lp->stats.tx_errors++;
1095
1096
1097
1098
1099 outb(0,INTMASK);
1100 if (status&NORXflag) EnableReceiver();
1101 if (!(status&TXFREEflag)) outb(NOTXcmd,COMMAND);
1102 dev->trans_start = jiffies;
1103
1104 if (lp->outgoing.skb)
1105 {
1106 dev_kfree_skb(lp->outgoing.skb,FREE_WRITE);
1107 lp->stats.tx_dropped++;
1108 }
1109 lp->outgoing.skb=NULL;
1110
1111 TBUSY=0;
1112 lp->intx--;
1113
1114
1115 lp->txready=0;
1116 lp->sending=0;
1117 mark_bh(NET_BH);
1118
1119 outb(NORXflag|RECON_flag,INTMASK);
1120
1121 return 1;
1122 }
1123
1124
1125
1126
1127 if (skb == NULL) {
1128 BUGLVL(D_NORMAL)
1129 printk("arcnet: tx passed null skb (status=%Xh, inTX=%d, tickssofar=%ld)\n",
1130 inb(STATUS),lp->intx,jiffies-dev->trans_start);
1131 dev_tint(dev);
1132 lp->intx--;
1133 return 0;
1134 }
1135
1136 if (lp->txready)
1137 {
1138 printk("arcnet: trying to start new packet while busy! (status=%Xh)\n",
1139 inb(STATUS));
1140
1141 outb(0,INTMASK);
1142 outb(NOTXcmd,COMMAND);
1143 arcnet_inthandler(dev);
1144 lp->stats.tx_errors++;
1145 lp->intx--;
1146 lp->txready=0;
1147
1148 return 1;
1149 }
1150
1151
1152
1153 if (set_bit(0, (void*)&dev->tbusy) != 0)
1154 {
1155 printk("arcnet: transmitter called with busy bit set! (status=%Xh, inTX=%d, tickssofar=%ld)\n",
1156 inb(STATUS),lp->intx,jiffies-dev->trans_start);
1157 lp->intx--;
1158 return -EBUSY;
1159 }
1160 else {
1161 struct Outgoing *out=&(lp->outgoing);
1162
1163 TBUSY=1;
1164
1165 out->length = 1 < skb->len ? skb->len : 1;
1166 out->hdr=(struct ClientData*)skb->data;
1167 out->skb=skb;
1168
1169 BUGLVL(D_SKB)
1170 {
1171 short i;
1172 for( i=0; i< skb->len; i++)
1173 {
1174 if( i%16 == 0 ) printk("\n[%04hX] ",i);
1175 printk("%02hX ",((unsigned char*)skb->data)[i]);
1176 }
1177 printk("\n");
1178 }
1179
1180 out->hdr->sequence=(lp->sequence++);
1181
1182 if (lp->txready && inb(STATUS)&TXFREEflag)
1183 arcnetA_go_tx(dev);
1184
1185
1186 if (out->length-EXTRA_CLIENTDATA<=XMTU)
1187 {
1188 BUGLVL(D_DURING)
1189 printk("arcnet: not splitting %d-byte packet. (split_flag=%d)\n",
1190 out->length,out->hdr->split_flag);
1191 BUGLVL(D_EXTRA) if (out->hdr->split_flag)
1192 printk("arcnet: short packet has split_flag set?! (split_flag=%d)\n",
1193 out->hdr->split_flag);
1194 out->numsegs=1;
1195 out->segnum=1;
1196 arcnetA_prepare_tx(dev,out->hdr,
1197 out->length-sizeof(struct ClientData),
1198 ((char *)skb->data)+sizeof(struct ClientData));
1199
1200
1201 dev_kfree_skb(out->skb,FREE_WRITE);
1202 out->skb=NULL;
1203
1204 if (!lp->sending)
1205 {
1206 arcnetA_go_tx(dev);
1207
1208
1209 TBUSY=0;
1210 mark_bh(NET_BH);
1211 }
1212 }
1213 else
1214 {
1215 int maxsegsize=XMTU-4;
1216
1217 out->data=(u_char *)skb->data
1218 + sizeof(struct ClientData);
1219 out->dataleft=out->length-sizeof(struct ClientData);
1220 out->numsegs=(out->dataleft+maxsegsize-1)/maxsegsize;
1221
1222 out->segnum=0;
1223
1224 BUGLVL(D_TX) printk("arcnet: packet (%d bytes) split into %d fragments:\n",
1225 out->length,out->numsegs);
1226
1227
1228 if (lp->txready && inb(STATUS)&TXFREEflag)
1229 arcnetA_go_tx(dev);
1230
1231 if (!lp->txready)
1232 {
1233
1234
1235
1236 arcnetA_continue_tx(dev);
1237 if (!lp->sending)
1238 {
1239 arcnetA_go_tx(dev);
1240 arcnetA_continue_tx(dev);
1241 if (!lp->sending)
1242 arcnetA_go_tx(dev);
1243 }
1244 }
1245
1246
1247
1248
1249 if (out->segnum==out->numsegs)
1250 {
1251
1252 out->segnum++;
1253 if (out->skb)
1254 dev_kfree_skb(out->skb,FREE_WRITE);
1255 out->skb=NULL;
1256 }
1257 }
1258 }
1259
1260 lp->intx--;
1261 lp->stats.tx_packets++;
1262 dev->trans_start=jiffies;
1263 return 0;
1264 }
1265
1266
1267
1268
1269
1270
1271 static void arcnetA_continue_tx(struct device *dev)
1272 {
1273 struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
1274 int maxsegsize=XMTU-4;
1275 struct Outgoing *out=&(lp->outgoing);
1276
1277 if (lp->txready)
1278 {
1279 printk("arcnet: continue_tx: called with packet in buffer!\n");
1280 return;
1281 }
1282
1283 if (out->segnum>=out->numsegs)
1284 {
1285 printk("arcnet: continue_tx: building segment %d of %d!\n",
1286 out->segnum+1,out->numsegs);
1287 }
1288
1289 if (!out->segnum)
1290 out->hdr->split_flag=((out->numsegs-2)<<1)+1;
1291 else
1292 out->hdr->split_flag=out->segnum<<1;
1293
1294 out->seglen=maxsegsize;
1295 if (out->seglen>out->dataleft) out->seglen=out->dataleft;
1296
1297 BUGLVL(D_TX) printk("arcnet: building packet #%d (%d bytes) of %d (%d total), splitflag=%d\n",
1298 out->segnum+1,out->seglen,out->numsegs,
1299 out->length,out->hdr->split_flag);
1300
1301 arcnetA_prepare_tx(dev,out->hdr,out->seglen,out->data);
1302
1303 out->dataleft-=out->seglen;
1304 out->data+=out->seglen;
1305 out->segnum++;
1306 }
1307
1308
1309
1310
1311
1312 static void
1313 arcnetA_prepare_tx(struct device *dev,struct ClientData *hdr,short length,
1314 char *data)
1315 {
1316 struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
1317 struct ClientData *arcsoft;
1318 union ArcPacket *arcpacket =
1319 (union ArcPacket *)(dev->mem_start+512*(lp->txbuf^1));
1320 u_char pkttype;
1321 int offset;
1322 short daddr;
1323
1324 lp->txbuf=lp->txbuf^1;
1325
1326 length+=4;
1327
1328 BUGLVL(D_TX)
1329 printk("arcnet: arcnetA_prep_tx: hdr:%ph, length:%d, data:%ph\n",
1330 hdr,length,data);
1331
1332
1333 BUGLVL(D_DURING)
1334 memset((void *)dev->mem_start+lp->txbuf*512,0x42,512);
1335
1336 daddr=arcpacket->hardheader.destination=hdr->daddr;
1337
1338
1339 if (length<=MTU)
1340 {
1341 pkttype=NORMAL;
1342
1343 arcpacket->hardheader.offset1=offset=256-length;
1344 arcsoft=(struct ClientData *)
1345 (&arcpacket->raw[offset-EXTRA_CLIENTDATA]);
1346 }
1347 else if (length>=MinTU)
1348 {
1349 pkttype=EXTENDED;
1350
1351 arcpacket->hardheader.offset1=0;
1352 arcpacket->hardheader.offset2=offset=512-length;
1353 arcsoft=(struct ClientData *)
1354 (&arcpacket->raw[offset-EXTRA_CLIENTDATA]);
1355 }
1356 else
1357 {
1358 pkttype=EXCEPTION;
1359
1360 arcpacket->hardheader.offset1=0;
1361 arcpacket->hardheader.offset2=offset=512-length-4;
1362 arcsoft=(struct ClientData *)
1363 (&arcpacket->raw[offset+4-EXTRA_CLIENTDATA]);
1364
1365
1366
1367
1368
1369 arcpacket->raw[offset+0]=hdr->protocol_id;
1370 arcpacket->raw[offset+1]=0xFF;
1371 arcpacket->raw[offset+2]=0xFF;
1372 arcpacket->raw[offset+3]=0xFF;
1373 }
1374
1375
1376
1377
1378
1379 memcpy((u_char*)arcsoft+EXTRA_CLIENTDATA,
1380 (u_char*)hdr+EXTRA_CLIENTDATA,4);
1381 memcpy((u_char*)arcsoft+sizeof(struct ClientData),
1382 data,length-4);
1383
1384 BUGLVL(D_DURING) printk("arcnet: transmitting packet to station %02Xh (%d bytes, type=%d)\n",
1385 daddr,length,pkttype);
1386
1387 BUGLVL(D_TX)
1388 {
1389 int countx,county;
1390
1391 printk("arcnet: packet dump [tx] follows:");
1392
1393 for (county=0; county<16+(pkttype!=NORMAL)*16; county++)
1394 {
1395 printk("\n[%04X] ",county*16);
1396 for (countx=0; countx<16; countx++)
1397 printk("%02X ",
1398 arcpacket->raw[county*16+countx]);
1399 }
1400
1401 printk("\n");
1402 }
1403
1404 #ifdef VERIFY_ACK
1405 lp->outgoing.lastload_dest=hdr->daddr;
1406 #endif
1407 lp->txready=lp->txbuf;
1408 }
1409
1410
1411
1412
1413 static void
1414 arcnetA_go_tx(struct device *dev)
1415 {
1416 struct arcnet_local *lp=(struct arcnet_local *)dev->priv;
1417 int ioaddr=dev->base_addr;
1418
1419 BUGLVL(D_DURING)
1420 printk("arcnet: go_tx: status=%Xh\n",
1421 inb(STATUS));
1422
1423 if (!(inb(STATUS)&TXFREEflag) || !lp->txready) return;
1424
1425
1426 outb(TXcmd|(lp->txready<<3),COMMAND);
1427
1428 outb(TXFREEflag|NORXflag|RECON_flag,INTMASK);
1429
1430 dev->trans_start = jiffies;
1431 lp->txready=0;
1432 lp->sending++;
1433 #ifdef VERIFY_ACK
1434 lp->outgoing.lasttrans_dest=lp->outgoing.lastload_dest;
1435 lp->outgoing.lastload_dest=0;
1436 #endif
1437 }
1438
1439
1440
1441
1442 static int
1443 arcnetE_send_packet(struct sk_buff *skb, struct device *dev)
1444 {
1445 struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
1446
1447 BUGLVL(D_DURING)
1448 printk("%s: in arcnetE_send_packet (skb=%p)\n",dev->name,skb);
1449
1450 if (IF_TBUSY)
1451 {
1452
1453
1454 int tickssofar = jiffies - dev->trans_start;
1455 if (tickssofar < 10)
1456 return 1;
1457 printk("%s: transmit timed out\n",dev->name);
1458
1459
1460 TBUSY=0;
1461 dev->trans_start = jiffies;
1462 return 0;
1463 }
1464
1465
1466
1467
1468 if (skb == NULL)
1469 {
1470 dev_tint(dev);
1471 return 0;
1472 }
1473
1474
1475
1476 if (set_bit(0, (void*)&dev->tbusy) != 0)
1477 printk("%s: Transmitter access conflict.\n", dev->name);
1478 else
1479 {
1480 union ArcPacket *arcpacket =
1481 (union ArcPacket *)(dev->mem_start+512*(lp->txbuf^1));
1482 u_char *arcsoft,daddr;
1483 short offset,length=skb->len+1;
1484
1485 TBUSY=1;
1486
1487 if (length>XMTU)
1488 {
1489 printk("arcnet: MTU for %s and %s must be <= 493 for ethernet encap.\n",
1490 lp->adev->name,lp->edev->name);
1491 printk("arcnet: transmit aborted.\n");
1492
1493 dev_kfree_skb(skb,FREE_WRITE);
1494 return 0;
1495 }
1496
1497 BUGLVL(D_DURING)
1498 printk("arcnet: starting tx sequence...\n");
1499
1500 lp->txbuf=lp->txbuf^1;
1501
1502
1503 BUGLVL(D_DURING)
1504 memset((void *)dev->mem_start+lp->txbuf*512,0x42,512);
1505
1506
1507 if (((struct ethhdr*)(skb->data))->h_dest[0] == 0xFF)
1508 daddr=arcpacket->hardheader.destination=0;
1509 else
1510 daddr=arcpacket->hardheader.destination=
1511 ((struct ethhdr*)(skb->data))->h_dest[5];
1512
1513
1514 offset=512-length;
1515 if (length>MTU)
1516 {
1517 if (length<MinTU) offset-=3;
1518 arcpacket->hardheader.offset1=0;
1519 arcpacket->hardheader.offset2=offset;
1520 }
1521 else
1522 {
1523 arcpacket->hardheader.offset1=(offset-=256);
1524 }
1525
1526 BUGLVL(D_DURING)
1527 printk("arcnet: length=%Xh, offset=%Xh, offset1=%Xh, offset2=%Xh\n",
1528 length,offset,arcpacket->hardheader.offset1,
1529 arcpacket->hardheader.offset2);
1530
1531 arcsoft=&arcpacket->raw[offset];
1532 arcsoft[0]=ARC_P_MS_TCPIP;
1533 arcsoft++;
1534
1535
1536
1537
1538 BUGLVL(D_DURING) printk("arcnet: ready to memcpy\n");
1539
1540 memcpy(arcsoft,skb->data,skb->len);
1541
1542 BUGLVL(D_DURING)
1543 printk("arcnet: transmitting packet to station %02Xh (%d bytes)\n",
1544 daddr,length);
1545
1546 BUGLVL(D_TX)
1547 {
1548 int countx,county;
1549
1550 printk("arcnet: packet dump [tx] follows:");
1551
1552 for (county=0; county<16+(length>=240)*16; county++)
1553 {
1554 printk("\n[%04X] ",county*16);
1555 for (countx=0; countx<16; countx++)
1556 printk("%02X ",
1557 arcpacket->raw[county*16+countx]);
1558 }
1559
1560 printk("\n");
1561 }
1562
1563 #ifdef VERIFY_ACK
1564 lp->outgoing.lastload_dest=daddr;
1565 #endif
1566 lp->txready=lp->txbuf;
1567
1568 arcnetA_go_tx(dev);
1569 dev->trans_start = jiffies;
1570 }
1571
1572 dev_kfree_skb(skb,FREE_WRITE);
1573
1574 return 0;
1575 }
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590 static void
1591 arcnet_interrupt(int irq,struct pt_regs *regs)
1592 {
1593 struct device *dev = (struct device *)(irq2dev_map[irq]);
1594
1595 if (dev==NULL || !dev->start)
1596 {
1597 BUGLVL(D_EXTRA)
1598 printk("arcnet: irq %d for unknown device.\n", irq);
1599 return;
1600 }
1601
1602 arcnet_inthandler(dev);
1603 }
1604
1605
1606
1607
1608
1609 static void
1610 arcnet_inthandler(struct device *dev)
1611 {
1612 struct arcnet_local *lp;
1613 int ioaddr, status, boguscount = 3, didsomething;
1614
1615 if (dev->interrupt)
1616 printk("arcnet: DRIVER PROBLEM! Nested arcnet interrupts!\n");
1617
1618 dev->interrupt = 1;
1619
1620 ioaddr = dev->base_addr;
1621 lp = (struct arcnet_local *)dev->priv;
1622
1623 outb(0,INTMASK);
1624 sti();
1625
1626 BUGLVL(D_DURING)
1627 printk("arcnet: in net_interrupt (status=%Xh)\n",inb(STATUS));
1628
1629 do
1630 {
1631 status = inb(STATUS);
1632 didsomething=0;
1633
1634 if (!dev->start)
1635 {
1636 BUGLVL(D_DURING)
1637 printk("arcnet: ARCnet not yet initialized. irq ignored. (status=%Xh)\n",
1638 status);
1639 if (!(status&NORXflag))
1640 outb(NORXflag|RECON_flag,INTMASK);
1641
1642 dev->interrupt=0;
1643 return;
1644 }
1645
1646
1647
1648
1649 if (status & RESETflag)
1650 {
1651 outb(CFLAGScmd|RESETclear,COMMAND);
1652 BUGLVL(D_INIT)
1653 printk("arcnet: reset irq (status=%Xh)\n",
1654 status);
1655 }
1656 #ifdef DETECT_RECONFIGS
1657 if (status & RECONflag)
1658 {
1659 outb(CFLAGScmd|CONFIGclear,COMMAND);
1660 BUGLVL(D_EXTRA)
1661 printk("arcnet: Network reconfiguration detected (status=%Xh)\n",
1662 status);
1663 lp->stats.tx_carrier_errors++;
1664 }
1665 #endif
1666
1667
1668 if (status & NORXflag)
1669 {
1670 int recbuf=lp->recbuf=!lp->recbuf;
1671
1672 BUGLVL(D_DURING)
1673 printk("arcnet: receive irq (status=%Xh)\n",
1674 status);
1675
1676
1677 EnableReceiver();
1678
1679
1680 arcnet_rx(dev,!recbuf);
1681
1682 didsomething++;
1683 }
1684
1685
1686 if (status&TXFREEflag && !lp->in_txhandler && lp->sending)
1687 {
1688 struct Outgoing *out=&(lp->outgoing);
1689
1690 lp->in_txhandler++;
1691 lp->sending--;
1692
1693 BUGLVL(D_DURING)
1694 printk("arcnet: TX IRQ (stat=%Xh, numsegs=%d, segnum=%d, skb=%ph)\n",
1695 status,out->numsegs,out->segnum,out->skb);
1696
1697 #ifdef VERIFY_ACK
1698 if (!(status&TXACKflag))
1699 {
1700 if (lp->outgoing.lasttrans_dest != 0)
1701 {
1702 BUGLVL(D_NORMAL)
1703 printk("arcnet: transmit was not acknowledged! (status=%Xh, dest=%d)\n",
1704 status,
1705 lp->outgoing.lasttrans_dest);
1706 lp->stats.tx_errors++;
1707 }
1708 else
1709 {
1710 BUGLVL(D_DURING)
1711 printk("arcnet: broadcast was not acknowledged; that's normal (status=%Xh, dest=%d)\n",
1712 status,
1713 lp->outgoing.lasttrans_dest);
1714 }
1715 }
1716 #endif
1717
1718
1719 if (lp->txready)
1720 {
1721 arcnetA_go_tx(dev);
1722 didsomething++;
1723 }
1724
1725 if (lp->intx)
1726 {
1727 lp->in_txhandler--;
1728 continue;
1729 }
1730
1731 if (!lp->outgoing.skb)
1732 {
1733 BUGLVL(D_DURING)
1734 printk("arcnet: TX IRQ done: no split to continue.\n");
1735
1736
1737 if (!lp->txready && IF_TBUSY)
1738 {
1739 TBUSY=0;
1740 mark_bh(NET_BH);
1741 }
1742
1743 lp->in_txhandler--;
1744 continue;
1745 }
1746
1747
1748
1749
1750
1751
1752 if (out->segnum<out->numsegs)
1753 arcnetA_continue_tx(dev);
1754 if (lp->txready && !lp->sending)
1755 arcnetA_go_tx(dev);
1756
1757
1758
1759
1760 if (out->segnum>=out->numsegs)
1761 {
1762
1763 out->segnum++;
1764 if (out->skb)
1765 dev_kfree_skb(out->skb,FREE_WRITE);
1766 out->skb=NULL;
1767
1768
1769 if (!lp->txready && IF_TBUSY)
1770 {
1771 TBUSY=0;
1772 mark_bh(NET_BH);
1773 }
1774 }
1775 didsomething++;
1776
1777 lp->in_txhandler--;
1778 }
1779
1780 } while (--boguscount && didsomething);
1781
1782 BUGLVL(D_DURING)
1783 printk("arcnet: net_interrupt complete (status=%Xh)\n\n",
1784 inb(STATUS));
1785
1786 if (dev->start && lp->sending )
1787 outb(NORXflag|TXFREEflag|RECON_flag,INTMASK);
1788 else
1789 outb(NORXflag|RECON_flag,INTMASK);
1790
1791 dev->interrupt=0;
1792 }
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806 static void
1807 arcnet_rx(struct device *dev,int recbuf)
1808 {
1809 struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
1810 int ioaddr = dev->base_addr;
1811 union ArcPacket *arcpacket=
1812 (union ArcPacket *)(dev->mem_start+recbuf*512);
1813 u_char *arcsoft;
1814 short length,offset;
1815 u_char daddr,saddr;
1816
1817 saddr=arcpacket->hardheader.source;
1818 daddr=arcpacket->hardheader.destination;
1819
1820
1821 if (saddr==0)
1822 {
1823 printk("arcnet: discarding old packet. (status=%Xh)\n",
1824 inb(STATUS));
1825 lp->stats.rx_errors++;
1826 return;
1827 }
1828 arcpacket->hardheader.source=0;
1829
1830 if (arcpacket->hardheader.offset1)
1831 {
1832 offset=arcpacket->hardheader.offset1;
1833 arcsoft=&arcpacket->raw[offset];
1834 length=256-offset;
1835 }
1836 else
1837 {
1838 offset=arcpacket->hardheader.offset2;
1839 arcsoft=&arcpacket->raw[offset];
1840
1841 length=512-offset;
1842 }
1843
1844 BUGLVL(D_DURING)
1845 printk("arcnet: received packet from %02Xh to %02Xh (%d bytes)\n",
1846 saddr,daddr,length);
1847
1848
1849 switch (arcsoft[0])
1850 {
1851 case ARC_P_IP:
1852 case ARC_P_ARP:
1853 case ARC_P_RARP:
1854 case ARC_P_IPX:
1855 arcnetA_rx(dev,(struct ClientData*)arcsoft,
1856 length,saddr,daddr);
1857 break;
1858 case ARC_P_MS_TCPIP:
1859 arcnetE_rx(dev,arcsoft,length,saddr,daddr);
1860 break;
1861 default:
1862 printk("arcnet: received unknown protocol %d (%Xh)\n",
1863 arcsoft[0],arcsoft[0]);
1864 break;
1865 }
1866
1867 BUGLVL(D_RX)
1868 {
1869 int countx,county;
1870
1871 printk("arcnet: rx packet dump follows:");
1872
1873 for (county=0; county<16+(length>240)*16; county++)
1874 {
1875 printk("\n[%04X] ",county*16);
1876 for (countx=0; countx<16; countx++)
1877 printk("%02X ",
1878 arcpacket->raw[county*16+countx]);
1879 }
1880
1881 printk("\n");
1882 }
1883
1884
1885
1886 BUGLVL(D_DURING)
1887 memset((void *)arcpacket->raw,0x42,512);
1888
1889
1890
1891
1892
1893
1894 }
1895
1896
1897
1898
1899 static void
1900 arcnetA_rx(struct device *dev,struct ClientData *arcsoft,
1901 int length,u_char saddr, u_char daddr)
1902 {
1903 struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
1904 struct sk_buff *skb;
1905 struct ClientData *soft;
1906
1907 BUGLVL(D_DURING)
1908 printk("arcnet: it's an RFC1201 packet (length=%d)\n",
1909 length);
1910
1911 arcsoft=(struct ClientData *)((u_char *)arcsoft-EXTRA_CLIENTDATA);
1912 length+=EXTRA_CLIENTDATA;
1913
1914 if (arcsoft->split_flag==0xFF)
1915 {
1916 BUGLVL(D_DURING)
1917 printk("arcnet: compensating for exception packet\n");
1918
1919
1920 arcsoft=(struct ClientData *)
1921 ((u_char *)arcsoft + 4);
1922 length-=4;
1923 }
1924
1925 if (!arcsoft->split_flag)
1926 {
1927 struct Incoming *in=&lp->incoming[saddr];
1928
1929 BUGLVL(D_RX) printk("arcnet: incoming is not split (splitflag=%d)\n",
1930 arcsoft->split_flag);
1931
1932 if (in->skb)
1933 {
1934 BUGLVL(D_EXTRA) printk("arcnet: aborting assembly (seq=%d) for unsplit packet (splitflag=%d, seq=%d)\n",
1935 in->sequence,arcsoft->split_flag,
1936 arcsoft->sequence);
1937 kfree_skb(in->skb,FREE_WRITE);
1938 lp->stats.tx_dropped++;
1939 lp->stats.rx_errors++;
1940 in->skb=NULL;
1941 }
1942
1943 in->sequence=arcsoft->sequence;
1944
1945 skb = alloc_skb(length, GFP_ATOMIC);
1946 if (skb == NULL) {
1947 printk("arcnet: Memory squeeze, dropping packet.\n");
1948 lp->stats.rx_dropped++;
1949 return;
1950 }
1951 soft=(struct ClientData *)skb->data;
1952
1953 skb->len = length;
1954 skb->dev = dev;
1955
1956 memcpy((u_char *)soft+EXTRA_CLIENTDATA,
1957 (u_char *)arcsoft+EXTRA_CLIENTDATA,
1958 length-EXTRA_CLIENTDATA);
1959 soft->daddr=daddr;
1960 soft->saddr=saddr;
1961
1962
1963
1964
1965
1966
1967 if (soft->protocol_id == ARC_P_ARP)
1968 {
1969 struct arphdr *arp=(struct arphdr *)
1970 ((char *)soft+sizeof(struct ClientData));
1971
1972
1973 if (arp->ar_hln==1 && arp->ar_pln==4)
1974 {
1975 char *cptr=(char *)(arp)+sizeof(struct arphdr);
1976
1977 if (!*cptr)
1978 {
1979 BUGLVL(D_EXTRA)
1980 printk("arcnet: ARP source address was 00h, set to %02Xh.\n",
1981 saddr);
1982 *cptr=saddr;
1983 }
1984 else BUGLVL(D_DURING)
1985 {
1986 printk("arcnet: ARP source address (%Xh) is fine.\n",
1987 *cptr);
1988 }
1989 }
1990 else
1991 {
1992 printk("arcnet: funny-shaped ARP packet. (%Xh, %Xh)\n",
1993 arp->ar_hln,arp->ar_pln);
1994 lp->stats.rx_frame_errors++;
1995 }
1996 }
1997
1998 BUGLVL(D_SKB)
1999 {
2000 short i;
2001 for( i=0; i< skb->len; i++)
2002 {
2003 if( i%16 == 0 ) printk("\n[%04hX] ",i);
2004 printk("%02hX ",((unsigned char*)skb->data)[i]);
2005 }
2006 printk("\n");
2007 }
2008
2009 #ifndef LINUX12
2010 skb->protocol=arcnetA_type_trans(skb,dev);
2011 #endif
2012
2013 netif_rx(skb);
2014 lp->stats.rx_packets++;
2015 }
2016 else
2017 {
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035 struct Incoming *in=&lp->incoming[saddr];
2036
2037 BUGLVL(D_RX) printk("arcnet: packet is split (splitflag=%d, seq=%d)\n",
2038 arcsoft->split_flag,in->sequence);
2039
2040 if (in->skb && in->sequence!=arcsoft->sequence)
2041 {
2042 BUGLVL(D_EXTRA) printk("arcnet: wrong seq number, aborting assembly (expected=%d, seq=%d, splitflag=%d)\n",
2043 in->sequence,arcsoft->sequence,
2044 arcsoft->split_flag);
2045 kfree_skb(in->skb,FREE_WRITE);
2046 in->skb=NULL;
2047 lp->stats.tx_dropped++;
2048 lp->stats.rx_fifo_errors++;
2049 in->lastpacket=in->numpackets=0;
2050 }
2051
2052 if (arcsoft->split_flag & 1)
2053 {
2054 BUGLVL(D_RX) printk("arcnet: brand new splitpacket (splitflag=%d)\n",
2055 arcsoft->split_flag);
2056 if (in->skb)
2057 {
2058 BUGLVL(D_EXTRA) printk("arcnet: aborting previous (seq=%d) assembly (splitflag=%d, seq=%d)\n",
2059 in->sequence,arcsoft->split_flag,
2060 arcsoft->sequence);
2061 lp->stats.tx_dropped++;
2062 lp->stats.rx_over_errors++;
2063 kfree_skb(in->skb,FREE_WRITE);
2064 }
2065
2066 in->sequence=arcsoft->sequence;
2067 in->numpackets=((unsigned)arcsoft->split_flag>>1)+2;
2068 in->lastpacket=1;
2069
2070 if (in->numpackets>16)
2071 {
2072 BUGLVL(D_EXTRA) printk("arcnet: incoming packet more than 16 segments; dropping. (splitflag=%d)\n",
2073 arcsoft->split_flag);
2074 lp->stats.rx_dropped++;
2075 return;
2076 }
2077
2078 in->skb=skb=alloc_skb(508*in->numpackets
2079 + sizeof(struct ClientData),
2080 GFP_ATOMIC);
2081 if (skb == NULL) {
2082 printk("%s: (split) memory squeeze, dropping packet.\n",
2083 dev->name);
2084 lp->stats.rx_dropped++;
2085 return;
2086 }
2087
2088
2089
2090
2091 skb->free=1;
2092
2093 soft=(struct ClientData *)skb->data;
2094
2095 skb->len=sizeof(struct ClientData);
2096 skb->dev=dev;
2097
2098 memcpy((u_char *)soft+EXTRA_CLIENTDATA,
2099 (u_char *)arcsoft+EXTRA_CLIENTDATA,
2100 sizeof(struct ClientData)-EXTRA_CLIENTDATA);
2101 soft->split_flag=0;
2102 }
2103 else
2104 {
2105 int packetnum=((unsigned)arcsoft->split_flag>>1) + 1;
2106
2107
2108
2109
2110 if (!in->skb)
2111 {
2112 BUGLVL(D_EXTRA) printk("arcnet: can't continue split without starting first! (splitflag=%d, seq=%d)\n",
2113 arcsoft->split_flag,arcsoft->sequence);
2114 lp->stats.rx_errors++;
2115 return;
2116 }
2117
2118 in->lastpacket++;
2119 if (packetnum!=in->lastpacket)
2120 {
2121
2122 if (packetnum<=in->lastpacket-1)
2123 {
2124 BUGLVL(D_EXTRA) printk("arcnet: duplicate splitpacket ignored! (splitflag=%d)\n",
2125 arcsoft->split_flag);
2126 return;
2127 }
2128
2129
2130 BUGLVL(D_EXTRA) printk("arcnet: out-of-order splitpacket, reassembly (seq=%d) aborted (splitflag=%d, seq=%d)\n",
2131 in->sequence,arcsoft->split_flag,
2132 arcsoft->sequence);
2133 kfree_skb(in->skb,FREE_WRITE);
2134 in->skb=NULL;
2135 lp->stats.tx_dropped++;
2136 lp->stats.rx_fifo_errors++;
2137 in->lastpacket=in->numpackets=0;
2138 return;
2139 }
2140
2141 soft=(struct ClientData *)in->skb->data;
2142 }
2143
2144 skb=in->skb;
2145
2146 memcpy(skb->data+skb->len,
2147 (u_char *)arcsoft+sizeof(struct ClientData),
2148 length-sizeof(struct ClientData));
2149
2150 skb->len+=length-sizeof(struct ClientData);
2151
2152 soft->daddr=daddr;
2153 soft->saddr=saddr;
2154
2155
2156 if (in->lastpacket == in->numpackets)
2157 {
2158 if (!skb || !in->skb)
2159 printk("arcnet: ?!? done reassembling packet, no skb? (skb=%ph, in->skb=%ph)\n",
2160 skb,in->skb);
2161 in->skb=NULL;
2162 in->lastpacket=in->numpackets=0;
2163
2164 BUGLVL(D_SKB)
2165 {
2166 short i;
2167 for( i=0; i< skb->len; i++)
2168 {
2169 if( i%16 == 0 ) printk("\n[%04hX] ",i);
2170 printk("%02hX ",((unsigned char*)skb->data)[i]);
2171 }
2172 printk("\n");
2173 }
2174
2175
2176 #ifndef LINUX12
2177 skb->protocol=arcnetA_type_trans(skb,dev);
2178 #endif
2179
2180 netif_rx(skb);
2181 lp->stats.rx_packets++;
2182 }
2183 }
2184 }
2185
2186
2187
2188
2189 static void
2190 arcnetE_rx(struct device *dev,u_char *arcsoft,
2191 int length,u_char saddr, u_char daddr)
2192 {
2193 struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
2194 struct sk_buff *skb;
2195
2196 BUGLVL(D_DURING)
2197 printk("arcnet: it's an ethernet-encap packet (length=%d)\n",
2198 length);
2199
2200 skb = alloc_skb(length, GFP_ATOMIC);
2201 if (skb == NULL) {
2202 printk("arcnet: Memory squeeze, dropping packet.\n");
2203 lp->stats.rx_dropped++;
2204 return;
2205 }
2206
2207 skb->len = length;
2208 skb->dev = lp->edev;
2209
2210 memcpy(skb->data,(u_char *)arcsoft+1,length-1);
2211
2212 BUGLVL(D_SKB)
2213 {
2214 short i;
2215 printk("arcnet: rx skb dump follows:\n");
2216 for(i=0; i<skb->len; i++)
2217 {
2218 if (i%16==0)
2219 printk("\n[%04hX] ",i);
2220 else
2221 printk("%02hX ",((u_char *)skb->data)[i]);
2222 }
2223 printk("\n");
2224 }
2225
2226 #ifndef LINUX12
2227 skb->protocol=eth_type_trans(skb,dev);
2228 #endif
2229
2230 netif_rx(skb);
2231 lp->stats.rx_packets++;
2232 }
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246 static struct enet_statistics *
2247 arcnet_get_stats(struct device *dev)
2248 {
2249 struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
2250
2251 return &lp->stats;
2252 }
2253
2254
2255
2256
2257
2258
2259
2260 static void
2261 set_multicast_list(struct device *dev, int num_addrs, void *addrs)
2262 {
2263 #if 0
2264 struct arcnet_local *lp=(struct arcnet_local *)(dev->priv);
2265
2266 short ioaddr = dev->base_addr;
2267 if (num_addrs) {
2268 outw(69, ioaddr);
2269 } else
2270 outw(99, ioaddr);
2271 #endif
2272 }
2273
2274
2275
2276
2277
2278
2279 #ifdef LINUX12
2280 int arcnetA_header(unsigned char *buff,struct device *dev,
2281 unsigned short type,void *daddr,void *saddr,unsigned len,
2282 struct sk_buff *skb)
2283 #else
2284 int arcnetA_header(struct sk_buff *skb,struct device *dev,
2285 unsigned short type,void *daddr,void *saddr,unsigned len)
2286 #endif
2287 {
2288 struct ClientData *head = (struct ClientData *)
2289 #ifdef LINUX12
2290 buff;
2291 #else
2292 skb_push(skb,dev->hard_header_len);
2293 #endif
2294
2295
2296
2297 switch(type)
2298 {
2299 case ETH_P_IP:
2300 head->protocol_id=ARC_P_IP;
2301 break;
2302 case ETH_P_ARP:
2303 head->protocol_id=ARC_P_ARP;
2304 break;
2305 case ETH_P_RARP:
2306 head->protocol_id=ARC_P_RARP;
2307 break;
2308 case ETH_P_IPX:
2309 head->protocol_id=ARC_P_IPX;
2310 break;
2311 case ETH_P_ATALK:
2312 head->protocol_id=ARC_P_ATALK;
2313 break;
2314 default:
2315 printk("arcnet: I don't understand protocol %d (%Xh)\n",
2316 type,type);
2317 return 0;
2318 }
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328 if(saddr)
2329 head->saddr=((u_char*)saddr)[0];
2330 else
2331 head->saddr=((u_char*)(dev->dev_addr))[0];
2332
2333 #if 0
2334
2335
2336
2337
2338
2339
2340 if (dev->flags & IFF_LOOPBACK)
2341 {
2342 head->daddr=0;
2343 return(dev->hard_header_len);
2344 }
2345 #endif
2346
2347 head->split_flag=0;
2348 head->sequence=0;
2349
2350
2351 if(daddr)
2352 {
2353 head->daddr=((u_char*)daddr)[0];
2354 return dev->hard_header_len;
2355 }
2356 else
2357 head->daddr=0;
2358
2359 return -dev->hard_header_len;
2360 }
2361
2362
2363
2364
2365
2366
2367 int arcnetA_rebuild_header(void *buff,struct device *dev,unsigned long dst,
2368 struct sk_buff *skb)
2369 {
2370 struct ClientData *head = (struct ClientData *)buff;
2371
2372
2373
2374
2375
2376 if(head->protocol_id != ARC_P_IP)
2377 {
2378 printk("arcnet: I don't understand resolve type %d (%Xh) addresses!\n",
2379 head->protocol_id,head->protocol_id);
2380 head->daddr=0;
2381
2382 return 0;
2383 }
2384
2385
2386
2387
2388 #ifdef CONFIG_INET
2389 return arp_find(&(head->daddr), dst, dev, dev->pa_addr, skb)? 1 : 0;
2390 #else
2391 return 0;
2392 #endif
2393 }
2394
2395
2396
2397
2398
2399 unsigned short arcnetA_type_trans(struct sk_buff *skb,struct device *dev)
2400 {
2401 struct ClientData *head = (struct ClientData *) skb->data;
2402 struct arcnet_local *lp=(struct arcnet_local *) (dev->priv);
2403
2404 #ifndef LINUX12
2405
2406 skb->mac.raw=skb->data;
2407 skb_pull(skb,dev->hard_header_len);
2408 #endif
2409
2410 if (head->daddr==0)
2411 skb->pkt_type=PACKET_BROADCAST;
2412 else if (dev->flags&IFF_PROMISC)
2413 {
2414
2415 if (head->daddr != dev->dev_addr[0])
2416 skb->pkt_type=PACKET_OTHERHOST;
2417 }
2418
2419
2420 switch (head->protocol_id)
2421 {
2422 case ARC_P_IP: return htons(ETH_P_IP);
2423 case ARC_P_ARP: return htons(ETH_P_ARP);
2424 case ARC_P_RARP: return htons(ETH_P_RARP);
2425 case ARC_P_IPX: return htons(ETH_P_IPX);
2426 case ARC_P_ATALK: return htons(ETH_P_ATALK);
2427 case ARC_P_LANSOFT:
2428 default:
2429 BUGLVL(D_EXTRA)
2430 printk("arcnet: received packet of unknown protocol id %d (%Xh)\n",
2431 head->protocol_id,head->protocol_id);
2432 lp->stats.rx_frame_errors++;
2433 return 0;
2434 }
2435
2436 return htons(ETH_P_IP);
2437 }
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448 #ifdef MODULE
2449 char kernel_version[] = UTS_RELEASE;
2450 static struct device thiscard = {
2451 " ",
2452 0, 0, 0, 0,
2453 0, 0,
2454 0, 0, 0, NULL, arcnet_probe };
2455
2456
2457 int io=0x0;
2458 int irqnum=0;
2459 int shmem=0;
2460 int num=0;
2461
2462 int
2463 init_module(void)
2464 {
2465 if (io == 0)
2466 printk("arcnet: You should not use auto-probing with insmod!\n");
2467
2468 sprintf(thiscard.name,"arc%d",num);
2469
2470 thiscard.base_addr=io;
2471
2472 thiscard.irq=irqnum;
2473 if (thiscard.irq==2) thiscard.irq=9;
2474
2475 if (shmem)
2476 {
2477 thiscard.mem_start=shmem;
2478 thiscard.mem_end=thiscard.mem_start+512*4-1;
2479 thiscard.rmem_start=thiscard.mem_start+512*0;
2480 thiscard.rmem_end=thiscard.mem_start+512*2-1;
2481 }
2482
2483 if (register_netdev(&thiscard) != 0)
2484 return -EIO;
2485 return 0;
2486 }
2487
2488 void
2489 cleanup_module(void)
2490 {
2491 if (MOD_IN_USE)
2492 {
2493 printk("%s: device busy, remove delayed\n",thiscard.name);
2494 }
2495 else
2496 {
2497 if (thiscard.start) arcnet_close(&thiscard);
2498 if (thiscard.irq) free_irq(thiscard.irq);
2499 if (thiscard.base_addr) release_region(thiscard.base_addr,
2500 ARCNET_TOTAL_SIZE);
2501 unregister_netdev(&thiscard);
2502 }
2503 }
2504
2505 #endif
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517