This source file includes following definitions.
- get_status
- set_hsf
- wait_hcre
- send_pcb
- receive_pcb
- adapter_hard_reset
- adapter_reset
- start_receive
- receive_packet
- elp_interrupt
- elp_open
- elp_close
- send_packet
- elp_start_xmit
- elp_get_stats
- elp_init
- elp_probe
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 #include <linux/config.h>
30 #include <linux/kernel.h>
31 #include <linux/sched.h>
32 #include <linux/string.h>
33 #include <linux/interrupt.h>
34 #include <linux/ptrace.h>
35 #include <linux/errno.h>
36 #include <linux/in.h>
37 #include <asm/io.h>
38 #ifndef port_read
39 #include "iow.h"
40 #endif
41
42 #include <linux/netdevice.h>
43 #include <linux/etherdevice.h>
44 #include <linux/skbuff.h>
45
46 #include "3c505.h"
47
48 #ifdef ELP_DEBUG
49 static int elp_debug = ELP_DEBUG;
50 #else
51 static int elp_debug = 0;
52 #endif
53
54
55
56
57
58
59
60
61 #define ELP_VERSION "0.1.0"
62
63 extern struct device *irq2dev_map[16];
64
65
66
67
68
69
70
71 #define INB(port) inb((unsigned short)port)
72 #define OUTB(val,port) outb((unsigned char)val,(unsigned short)port);
73
74 #ifndef TRUE
75 #define TRUE 1
76 #endif
77
78 #ifndef FALSE
79 #define FALSE 0
80 #endif
81
82
83
84
85
86
87
88
89 typedef struct {
90 unsigned char command;
91 unsigned char length;
92 unsigned char data[MAX_PCB_DATA];
93 } pcb_struct;
94
95
96
97
98
99
100
101
102 typedef struct {
103 int io_addr;
104 short got_configure;
105 pcb_struct tx_pcb;
106 pcb_struct rx_pcb;
107 pcb_struct itx_pcb;
108 pcb_struct irx_pcb;
109 struct enet_statistics stats;
110 } elp_device;
111
112
113
114
115
116
117
118
119
120
121
122
123
124 #define GET_ASF() (get_status(adapter)&ASF_PCB_MASK)
125 #define GET_STATUS() (get_status(adapter))
126
127 static int get_status (elp_device * adapter)
128
129 {
130 register int stat1;
131 do {
132 stat1 = INB(adapter->io_addr+PORT_STATUS);
133 } while (stat1 != INB(adapter->io_addr+PORT_STATUS));
134 return stat1;
135 }
136
137 #define SET_HSF(hsf) (set_hsf(adapter,hsf))
138
139 static void set_hsf (elp_device * adapter, int hsf)
140
141 {
142 cli();
143 OUTB((INB(adapter->io_addr+PORT_CONTROL)&(~HSF_PCB_MASK))|hsf, adapter->io_addr+PORT_CONTROL);
144 sti();
145 }
146
147 #define WAIT_HCRE(toval) (wait_hcre(adapter,toval))
148
149 static int wait_hcre(elp_device * adapter, int toval)
150
151 {
152 int timeout = jiffies + toval;
153 while(((INB(adapter->io_addr+PORT_STATUS)&STATUS_HCRE)==0) &&
154 (jiffies <= timeout))
155 ;
156 if (jiffies > timeout) {
157 printk("elp0: timeout waiting for HCRE\n");
158 return FALSE;
159 }
160 return TRUE;
161 }
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178 static int send_pcb(elp_device * adapter, pcb_struct * pcb)
179
180 {
181 int i;
182 int cont;
183 int retry = 0;
184 int timeout;
185
186 while (1) {
187
188 cont = 1;
189
190
191
192
193
194
195 SET_HSF(0);
196 OUTB(pcb->command, (adapter->io_addr)+PORT_COMMAND);
197 cont = WAIT_HCRE(5);
198
199
200 if (cont) {
201 OUTB(pcb->length, (adapter->io_addr)+PORT_COMMAND);
202 cont = WAIT_HCRE(2);
203 }
204
205 for (i = 0; cont && (i < pcb->length); i++) {
206 OUTB(pcb->data[i], (adapter->io_addr)+PORT_COMMAND);
207 cont = WAIT_HCRE(2);
208 }
209
210
211
212
213 if (cont) {
214 SET_HSF(HSF_PCB_END);
215 OUTB(2+pcb->length, adapter->io_addr+PORT_COMMAND);
216 timeout = jiffies + 6;
217 while (jiffies < timeout) {
218 i = GET_ASF();
219 if ((i == ASF_PCB_ACK) ||
220 (i == ASF_PCB_NAK))
221 break;
222 }
223 if (i == ASF_PCB_ACK) {
224 SET_HSF(0);
225 return TRUE;
226 } else if (i = ASF_PCB_NAK) {
227 SET_HSF(0);
228 printk("elp0: PCB send was NAKed\n");
229 {
230 int to = jiffies + 5;
231 while (jiffies < to)
232 ;
233 }
234 }
235 }
236
237 if (elp_debug >= 6)
238 printk("elp0: NAK/timeout on send PCB\n");
239 if ((retry++ & 7) == 0)
240 printk("elp0: retry #%i on send PCB\n", retry);
241 }
242 }
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257 static int receive_pcb(elp_device * adapter, pcb_struct * pcb)
258
259 {
260 int i;
261 int total_length;
262 int stat;
263
264
265 while (((stat = GET_STATUS())&STATUS_ACRF) == 0)
266 ;
267 SET_HSF(0);
268 pcb->command = INB(adapter->io_addr+PORT_COMMAND);
269 if ((stat & ASF_PCB_MASK) != ASF_PCB_END) {
270
271
272 while (((stat = GET_STATUS())&STATUS_ACRF) == 0)
273 ;
274 pcb->length = INB(adapter->io_addr+PORT_COMMAND);
275 if ((stat & ASF_PCB_MASK) != ASF_PCB_END) {
276
277
278 i = 0;
279 do {
280 while (((stat = GET_STATUS())&STATUS_ACRF) == 0)
281 ;
282 pcb->data[i++] = INB(adapter->io_addr+PORT_COMMAND);
283 } while ((stat & ASF_PCB_MASK) != ASF_PCB_END);
284
285
286 total_length = pcb->data[--i];
287
288
289 if (total_length != (pcb->length + 2)) {
290 if (elp_debug >= 6)
291 printk("elp0: mangled PCB received\n");
292 SET_HSF(HSF_PCB_NAK);
293 return FALSE;
294 }
295 SET_HSF(HSF_PCB_ACK);
296 return TRUE;
297 }
298 }
299
300 SET_HSF(HSF_PCB_NAK);
301 return FALSE;
302 }
303
304 static void adapter_hard_reset(elp_device * adapter)
305
306 {
307 int timeout;
308
309
310
311
312 OUTB(CONTROL_ATTN|CONTROL_FLSH, adapter->io_addr+PORT_CONTROL);
313
314
315
316
317 for (timeout = jiffies + 20; jiffies <= timeout; )
318 ;
319
320
321
322
323 OUTB(0, adapter->io_addr+PORT_CONTROL);
324
325
326
327
328 for (timeout = jiffies + 20; jiffies <= timeout; )
329 ;
330
331
332
333
334 for (timeout = jiffies + (100 * 15); jiffies <= timeout; )
335 if (GET_ASF() != ASF_PCB_END)
336 break;
337 }
338
339 static void adapter_reset(elp_device * adapter)
340
341 {
342 int timeout;
343
344 cli();
345 OUTB(CONTROL_ATTN|INB(adapter->io_addr+PORT_CONTROL), adapter->io_addr+PORT_CONTROL);
346 sti();
347
348
349
350
351 for (timeout = jiffies + 20; jiffies <= timeout; )
352 ;
353
354 cli();
355 OUTB(INB(adapter->io_addr+PORT_CONTROL)&~(CONTROL_ATTN), adapter->io_addr+PORT_CONTROL);
356 sti();
357 }
358
359
360
361
362
363
364
365
366 static int start_receive(elp_device * adapter, pcb_struct * tx_pcb)
367
368 {
369 if (elp_debug > 3)
370 printk("elp0: restarting receiver\n");
371 tx_pcb->command = CMD_RECEIVE_PACKET;
372 tx_pcb->length = 8;
373 tx_pcb->data[4] = 1600 & 0xff;
374 tx_pcb->data[5] = 1600 >> 8;
375 tx_pcb->data[6] = 0;
376 tx_pcb->data[7] = 0;
377 return send_pcb(adapter, tx_pcb);
378 }
379
380
381
382
383
384
385
386
387
388
389 static void receive_packet(struct device * dev,
390 elp_device * adapter,
391 int len)
392
393 {
394 register int i;
395 unsigned short * ptr;
396 short d;
397
398
399
400
401 struct sk_buff *skb;
402 skb = alloc_skb(len+3, GFP_ATOMIC);
403
404
405
406
407 OUTB(INB(adapter->io_addr+PORT_CONTROL)|CONTROL_DIR, adapter->io_addr+PORT_CONTROL);
408
409
410
411
412 if (skb == NULL) {
413 for (i = 0; i < (len/2); i++) {
414 while ((INB(adapter->io_addr+PORT_STATUS)&STATUS_HRDY) == 0)
415 ;
416 d = inw(adapter->io_addr+PORT_DATA);
417 }
418 adapter->stats.rx_dropped++;
419
420 } else {
421
422
423
424
425 ptr = (unsigned short *)(skb->data);
426 for (i = 0; i < (len/2); i++) {
427 while ((INB(adapter->io_addr+PORT_STATUS)&STATUS_HRDY) == 0) {
428 ;
429 }
430 *ptr = inw(adapter->io_addr+PORT_DATA);
431 ptr++;
432 }
433
434
435
436
437
438
439 if (dev_rint((unsigned char *)skb, len, IN_SKBUFF, dev) != 0) {
440 printk("%s: receive buffers full.\n", dev->name);
441 kfree_skb(skb, FREE_READ);
442 }
443 }
444
445 OUTB(INB(adapter->io_addr+PORT_CONTROL)&(~CONTROL_DIR), adapter->io_addr+PORT_CONTROL);
446 }
447
448
449
450
451
452
453
454
455 static void elp_interrupt(int reg_ptr)
456
457 {
458 int len;
459 int dlen;
460 int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
461 struct device *dev;
462 elp_device * adapter;
463
464 if (irq < 0 || irq > 15) {
465 printk ("elp0: illegal IRQ number found in interrupt routine (%i)\n", irq);
466 return;
467 }
468
469 if (irq != 0xc) {
470 printk ("elp0: warning - interrupt routine has incorrect IRQ of %i\n", irq);
471 return;
472 }
473
474 dev = irq2dev_map[irq];
475 adapter = (elp_device *) dev->priv;
476
477 if (dev == NULL) {
478 printk ("elp_interrupt(): irq %d for unknown device.\n", irq);
479 return;
480 }
481
482 if (dev->interrupt)
483 if (elp_debug >= 3)
484 printk("%s: Re-entering the interrupt handler.\n", dev->name);
485 dev->interrupt = 1;
486
487
488
489
490 sti();
491
492
493
494
495 while ((INB(adapter->io_addr+PORT_STATUS)&STATUS_ACRF) != 0) {
496
497 if (receive_pcb(adapter, &adapter->irx_pcb)) {
498
499 switch (adapter->irx_pcb.command) {
500
501
502
503
504 case CMD_CONFIGURE_82586_RESPONSE:
505 adapter->got_configure = 1;
506 if (elp_debug >= 3)
507 printk("%s: interrupt - configure response received\n", dev->name);
508 break;
509
510
511
512
513 case CMD_RECEIVE_PACKET_COMPLETE:
514 len = adapter->irx_pcb.data[6] + (adapter->irx_pcb.data[7] << 8);
515 dlen = adapter->irx_pcb.data[4] + (adapter->irx_pcb.data[5] << 8);
516 if (adapter->irx_pcb.data[8] != 0) {
517 printk("%s: interrupt - packet not received correctly\n", dev->name);
518 } else {
519 if (elp_debug >= 3)
520 printk("%s: interrupt - packet received of length %i (%i)\n", dev->name, len, dlen);
521 receive_packet(dev, adapter, dlen);
522 if (elp_debug >= 3)
523 printk("%s: packet received\n", dev->name);
524 adapter->stats.rx_packets++;
525 }
526 if (dev->start && !start_receive(adapter, &adapter->itx_pcb))
527 if (elp_debug >= 2)
528 printk("%s: interrupt - failed to send receive start PCB\n", dev->name);
529 if (elp_debug >= 3)
530 printk("%s: receive procedure complete\n", dev->name);
531
532 break;
533
534
535
536
537 case CMD_TRANSMIT_PACKET_COMPLETE:
538 if (elp_debug >= 3)
539 printk("%s: interrupt - packet sent\n", dev->name);
540 if (adapter->irx_pcb.data[4] != 0)
541 if (elp_debug >= 2)
542 printk("%s: interrupt - error sending packet %4.4x\n", dev->name,
543 adapter->irx_pcb.data[4] + (adapter->irx_pcb.data[5] << 8));
544 dev->tbusy = 0;
545 mark_bh(INET_BH);
546 adapter->stats.tx_packets++;
547 break;
548
549
550
551
552 default:
553 printk("%s: unknown PCB received - %2.2x\n", dev->name, adapter->irx_pcb.command);
554 break;
555 }
556 } else
557 printk("%s: failed to read PCB on interrupt\n", dev->name);
558 }
559
560
561
562
563 dev->interrupt = 0;
564 }
565
566
567
568
569
570
571
572
573 static int elp_open (struct device *dev)
574
575 {
576 elp_device * adapter = (elp_device *) dev->priv;
577
578 if (elp_debug >= 1)
579 printk("%s: request to open device\n", dev->name);
580
581
582
583
584 if (adapter == NULL) {
585 printk("%s: Opening a non-existent physical device\n", dev->name);
586 return -EAGAIN;
587 }
588
589
590
591
592 dev->interrupt = 0;
593
594
595
596
597 dev->tbusy = 0;
598
599
600
601
602 if (request_irq(dev->irq, &elp_interrupt))
603 return -EAGAIN;
604
605
606
607
608 irq2dev_map[dev->irq] = dev;
609
610
611
612
613 OUTB(CONTROL_CMDE, adapter->io_addr+PORT_CONTROL);
614
615
616
617
618 dev->start = 1;
619
620
621
622
623 if (elp_debug >= 2)
624 printk("%s: sending 82586 configure command\n", dev->name);
625 adapter->tx_pcb.command = CMD_CONFIGURE_82586;
626 adapter->tx_pcb.data[0] = 1;
627 adapter->tx_pcb.data[1] = 0;
628 adapter->tx_pcb.length = 2;
629 adapter->got_configure = 0;
630 if (!send_pcb(adapter, &adapter->tx_pcb))
631 printk("%s: couldn't send 82586 configure command\n", dev->name);
632 else
633 while (adapter->got_configure == 0)
634 ;
635
636
637
638
639 if (!start_receive(adapter, &adapter->tx_pcb))
640 printk("%s: start receive command failed \n", dev->name);
641 if (elp_debug >= 2)
642 printk("%s: start receive command sent\n", dev->name);
643
644 return 0;
645 }
646
647
648
649
650
651
652
653 static int elp_close (struct device *dev)
654
655 {
656 elp_device * adapter = (elp_device *) dev->priv;
657
658 if (elp_debug >= 1)
659 printk("%s: request to close device\n", dev->name);
660
661
662
663
664 OUTB(0x00, adapter->io_addr+PORT_CONTROL);
665
666
667
668
669 dev->tbusy = 1;
670
671
672
673
674 dev->start = 0;
675
676
677
678
679 free_irq(dev->irq);
680
681
682
683
684 irq2dev_map[dev->irq] = 0;
685
686 return 0;
687 }
688
689
690
691
692
693
694
695
696 static int send_packet (elp_device * adapter, unsigned char * ptr, int len)
697
698 {
699 int i;
700
701
702
703
704 unsigned int nlen = (((len < 60) ? 60 : len) + 1) & (~1);
705
706
707
708
709
710 adapter->tx_pcb.command = CMD_TRANSMIT_PACKET;
711 adapter->tx_pcb.length = 6;
712 adapter->tx_pcb.data[4] = nlen & 0xff;
713 adapter->tx_pcb.data[5] = nlen >> 8;
714 if (!send_pcb(adapter, &adapter->tx_pcb))
715 return FALSE;
716
717
718
719
720 cli();
721 OUTB(INB(adapter->io_addr+PORT_CONTROL)&(~CONTROL_DIR), adapter->io_addr+PORT_CONTROL);
722 sti();
723
724
725
726
727 for (i = 0; i < (nlen/2);i++) {
728 while ((INB(adapter->io_addr+PORT_STATUS)&STATUS_HRDY) == 0)
729 ;
730 outw(*(short *)ptr, adapter->io_addr+PORT_DATA);
731 ptr +=2;
732 }
733
734 return TRUE;
735 }
736
737
738
739
740
741
742
743
744 static int elp_start_xmit(struct sk_buff *skb, struct device *dev)
745
746 {
747 elp_device * adapter = (elp_device *) dev->priv;
748
749
750
751
752 if (skb == NULL) {
753 dev_tint(dev);
754 return 0;
755 }
756
757
758
759
760 if (skb->len <= 0)
761 return 0;
762
763 if (elp_debug >= 1)
764 printk("%s: request to send packet of length %i\n", dev->name, skb->len);
765
766
767
768
769 if (dev->tbusy) {
770 int tickssofar = jiffies - dev->trans_start;
771 if (tickssofar < 500)
772 return 1;
773 printk("%s: transmit timed out, resetting adapter\n", dev->name);
774 if ((INB(adapter->io_addr+PORT_STATUS)&STATUS_ACRF) != 0)
775 printk("%s: hmmm...seemed to have missed an interrupt!\n", dev->name);
776 adapter_reset(adapter);
777 dev->trans_start = jiffies;
778 dev->tbusy = 0;
779 }
780
781
782
783
784 if (!send_packet(adapter, (unsigned char *)(skb->data), skb->len)) {
785 printk("%s: send packet PCB failed\n", dev->name);
786 return 1;
787 }
788
789 if (elp_debug >= 2)
790 printk("%s: packet of length %i sent\n", dev->name, skb->len);
791
792
793
794
795
796 dev->trans_start = jiffies;
797
798
799
800
801 dev->tbusy = 1;
802
803
804
805
806 dev_kfree_skb(skb, FREE_WRITE);
807
808 return 0;
809 }
810
811
812
813
814
815
816
817 static struct enet_statistics * elp_get_stats(struct device *dev)
818
819 {
820 if (elp_debug >= 1)
821 printk("%s: request for stats\n", dev->name);
822
823 elp_device * adapter = (elp_device *) dev->priv;
824 return &adapter->stats;
825 }
826
827
828
829
830
831
832
833 static void elp_init(struct device *dev)
834
835 {
836 int i;
837 elp_device * adapter;
838
839
840
841
842 for (i = 0; i < DEV_NUMBUFFS; i++)
843 dev->buffs[i] = NULL;
844
845
846
847
848 dev->open = elp_open;
849 dev->stop = elp_close;
850 dev->get_stats = elp_get_stats;
851 dev->hard_start_xmit = elp_start_xmit;
852
853 dev->hard_header = eth_header;
854 dev->add_arp = eth_add_arp;
855 dev->rebuild_header = eth_rebuild_header;
856 dev->type_trans = eth_type_trans;
857
858 dev->queue_xmit = dev_queue_xmit;
859
860
861
862
863 adapter = (elp_device *)(dev->priv = kmalloc(sizeof(elp_device), GFP_KERNEL));
864 adapter->io_addr = dev->base_addr;
865 memset(&(adapter->stats), 0, sizeof(struct enet_statistics));
866
867
868
869
870
871 dev->type = ARPHRD_ETHER;
872 dev->hard_header_len = ETH_HLEN;
873 dev->mtu = 1500;
874 dev->addr_len = ETH_ALEN;
875 for (i = 0; i < dev->addr_len; i++)
876 dev->broadcast[i] = 0xff;
877
878
879
880
881 dev->flags = IFF_BROADCAST;
882 dev->family = AF_INET;
883 dev->pa_addr = 0;
884 dev->pa_brdaddr = 0;
885 dev->pa_mask = 0;
886 dev->pa_alen = sizeof(unsigned long);
887
888
889
890
891 dev->mem_start = dev->mem_end = dev->rmem_end = dev->mem_start = 0;
892 }
893
894
895
896
897
898
899
900
901
902 int elp_probe(struct device *dev)
903
904 {
905 elp_device adapter;
906 int i;
907
908
909
910
911 adapter.io_addr = dev->base_addr;
912
913 printk ("%s: probing for 3c505...", dev->name);
914
915
916
917
918 adapter_hard_reset(&adapter);
919
920
921
922
923 adapter.tx_pcb.command = CMD_STATION_ADDRESS;
924 adapter.tx_pcb.length = 0;
925 if (!send_pcb (&adapter, &adapter.tx_pcb) ||
926 !receive_pcb(&adapter, &adapter.rx_pcb) ||
927 (adapter.rx_pcb.command != CMD_ADDRESS_RESPONSE) ||
928 (adapter.rx_pcb.length != 6)) {
929 printk("not found\n");
930 return -ENODEV;
931 }
932
933 for (i = 0; i < 6; i++)
934 dev->dev_addr[i] = adapter.rx_pcb.data[i];
935
936 printk("found at port 0x%x, address = %s\n", dev->base_addr, eth_print(dev->dev_addr));
937
938 elp_init(dev);
939 return 0;
940 }
941