1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#define DRV_NAME "3c527"
21#define DRV_VERSION "0.7-SMP"
22#define DRV_RELDATE "2003/09/21"
23
24static const char *version =
25DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " Richard Procter <rnp@paradise.net.nz>\n";
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#include <linux/module.h>
86
87#include <linux/errno.h>
88#include <linux/netdevice.h>
89#include <linux/etherdevice.h>
90#include <linux/if_ether.h>
91#include <linux/init.h>
92#include <linux/kernel.h>
93#include <linux/types.h>
94#include <linux/fcntl.h>
95#include <linux/interrupt.h>
96#include <linux/mca-legacy.h>
97#include <linux/ioport.h>
98#include <linux/in.h>
99#include <linux/skbuff.h>
100#include <linux/slab.h>
101#include <linux/string.h>
102#include <linux/wait.h>
103#include <linux/ethtool.h>
104#include <linux/completion.h>
105#include <linux/bitops.h>
106#include <linux/semaphore.h>
107
108#include <asm/uaccess.h>
109#include <asm/system.h>
110#include <asm/io.h>
111#include <asm/dma.h>
112
113#include "3c527.h"
114
115MODULE_LICENSE("GPL");
116
117
118
119
120
121static const char* cardname = DRV_NAME;
122
123
124#ifndef NET_DEBUG
125#define NET_DEBUG 2
126#endif
127
128#undef DEBUG_IRQ
129
130static unsigned int mc32_debug = NET_DEBUG;
131
132
133#define MC32_IO_EXTENT 8
134
135
136#define TX_RING_LEN 32
137#define RX_RING_LEN 8
138
139
140
141#define RX_COPYBREAK 200
142
143
144
145
146static const int WORKAROUND_82586=1;
147
148
149struct mc32_ring_desc
150{
151 volatile struct skb_header *p;
152 struct sk_buff *skb;
153};
154
155
156struct mc32_local
157{
158 int slot;
159
160 u32 base;
161 volatile struct mc32_mailbox *rx_box;
162 volatile struct mc32_mailbox *tx_box;
163 volatile struct mc32_mailbox *exec_box;
164 volatile struct mc32_stats *stats;
165 u16 tx_chain;
166 u16 rx_chain;
167 u16 tx_len;
168 u16 rx_len;
169
170 u16 xceiver_desired_state;
171 u16 cmd_nonblocking;
172 u16 mc_reload_wait;
173 u32 mc_list_valid;
174
175 struct mc32_ring_desc tx_ring[TX_RING_LEN];
176 struct mc32_ring_desc rx_ring[RX_RING_LEN];
177
178 atomic_t tx_count;
179 atomic_t tx_ring_head;
180 u16 tx_ring_tail;
181
182 u16 rx_ring_tail;
183
184 struct semaphore cmd_mutex;
185 struct completion execution_cmd;
186 struct completion xceiver_cmd;
187};
188
189
190#define SA_ADDR0 0x02
191#define SA_ADDR1 0x60
192#define SA_ADDR2 0xAC
193
194struct mca_adapters_t {
195 unsigned int id;
196 char *name;
197};
198
199static const struct mca_adapters_t mc32_adapters[] = {
200 { 0x0041, "3COM EtherLink MC/32" },
201 { 0x8EF5, "IBM High Performance Lan Adapter" },
202 { 0x0000, NULL }
203};
204
205
206
207static inline u16 next_rx(u16 rx) { return (rx+1)&(RX_RING_LEN-1); };
208static inline u16 prev_rx(u16 rx) { return (rx-1)&(RX_RING_LEN-1); };
209
210static inline u16 next_tx(u16 tx) { return (tx+1)&(TX_RING_LEN-1); };
211
212
213
214static int mc32_probe1(struct net_device *dev, int ioaddr);
215static int mc32_command(struct net_device *dev, u16 cmd, void *data, int len);
216static int mc32_open(struct net_device *dev);
217static void mc32_timeout(struct net_device *dev);
218static int mc32_send_packet(struct sk_buff *skb, struct net_device *dev);
219static irqreturn_t mc32_interrupt(int irq, void *dev_id);
220static int mc32_close(struct net_device *dev);
221static struct net_device_stats *mc32_get_stats(struct net_device *dev);
222static void mc32_set_multicast_list(struct net_device *dev);
223static void mc32_reset_multicast_list(struct net_device *dev);
224static const struct ethtool_ops netdev_ethtool_ops;
225
226static void cleanup_card(struct net_device *dev)
227{
228 struct mc32_local *lp = netdev_priv(dev);
229 unsigned slot = lp->slot;
230 mca_mark_as_unused(slot);
231 mca_set_adapter_name(slot, NULL);
232 free_irq(dev->irq, dev);
233 release_region(dev->base_addr, MC32_IO_EXTENT);
234}
235
236
237
238
239
240
241
242
243
244
245
246struct net_device *__init mc32_probe(int unit)
247{
248 struct net_device *dev = alloc_etherdev(sizeof(struct mc32_local));
249 static int current_mca_slot = -1;
250 int i;
251 int err;
252
253 if (!dev)
254 return ERR_PTR(-ENOMEM);
255
256 if (unit >= 0)
257 sprintf(dev->name, "eth%d", unit);
258
259
260
261
262
263
264
265
266 for(i = 0; (mc32_adapters[i].name != NULL); i++) {
267 current_mca_slot =
268 mca_find_unused_adapter(mc32_adapters[i].id, 0);
269
270 if(current_mca_slot != MCA_NOTFOUND) {
271 if(!mc32_probe1(dev, current_mca_slot))
272 {
273 mca_set_adapter_name(current_mca_slot,
274 mc32_adapters[i].name);
275 mca_mark_as_used(current_mca_slot);
276 err = register_netdev(dev);
277 if (err) {
278 cleanup_card(dev);
279 free_netdev(dev);
280 dev = ERR_PTR(err);
281 }
282 return dev;
283 }
284
285 }
286 }
287 free_netdev(dev);
288 return ERR_PTR(-ENODEV);
289}
290
291
292
293
294
295
296
297
298
299
300
301
302static int __init mc32_probe1(struct net_device *dev, int slot)
303{
304 static unsigned version_printed;
305 int i, err;
306 u8 POS;
307 u32 base;
308 struct mc32_local *lp = netdev_priv(dev);
309 static u16 mca_io_bases[]={
310 0x7280,0x7290,
311 0x7680,0x7690,
312 0x7A80,0x7A90,
313 0x7E80,0x7E90
314 };
315 static u32 mca_mem_bases[]={
316 0x00C0000,
317 0x00C4000,
318 0x00C8000,
319 0x00CC000,
320 0x00D0000,
321 0x00D4000,
322 0x00D8000,
323 0x00DC000
324 };
325 static char *failures[]={
326 "Processor instruction",
327 "Processor data bus",
328 "Processor data bus",
329 "Processor data bus",
330 "Adapter bus",
331 "ROM checksum",
332 "Base RAM",
333 "Extended RAM",
334 "82586 internal loopback",
335 "82586 initialisation failure",
336 "Adapter list configuration error"
337 };
338
339
340
341 if (mc32_debug && version_printed++ == 0)
342 printk(KERN_DEBUG "%s", version);
343
344 printk(KERN_INFO "%s: %s found in slot %d:", dev->name, cardname, slot);
345
346 POS = mca_read_stored_pos(slot, 2);
347
348 if(!(POS&1))
349 {
350 printk(" disabled.\n");
351 return -ENODEV;
352 }
353
354
355 dev->base_addr = mca_io_bases[(POS>>1)&7];
356 dev->mem_start = mca_mem_bases[(POS>>4)&7];
357
358 POS = mca_read_stored_pos(slot, 4);
359 if(!(POS&1))
360 {
361 printk("memory window disabled.\n");
362 return -ENODEV;
363 }
364
365 POS = mca_read_stored_pos(slot, 5);
366
367 i=(POS>>4)&3;
368 if(i==3)
369 {
370 printk("invalid memory window.\n");
371 return -ENODEV;
372 }
373
374 i*=16384;
375 i+=16384;
376
377 dev->mem_end=dev->mem_start + i;
378
379 dev->irq = ((POS>>2)&3)+9;
380
381 if(!request_region(dev->base_addr, MC32_IO_EXTENT, cardname))
382 {
383 printk("io 0x%3lX, which is busy.\n", dev->base_addr);
384 return -EBUSY;
385 }
386
387 printk("io 0x%3lX irq %d mem 0x%lX (%dK)\n",
388 dev->base_addr, dev->irq, dev->mem_start, i/1024);
389
390
391
392
393
394
395
396
397
398
399 for (i = 0; i < 6; i++)
400 {
401 mca_write_pos(slot, 6, i+12);
402 mca_write_pos(slot, 7, 0);
403
404 dev->dev_addr[i] = mca_read_pos(slot,3);
405 }
406
407 printk("%s: Address %pM", dev->name, dev->dev_addr);
408
409 mca_write_pos(slot, 6, 0);
410 mca_write_pos(slot, 7, 0);
411
412 POS = mca_read_stored_pos(slot, 4);
413
414 if(POS&2)
415 printk(" : BNC port selected.\n");
416 else
417 printk(" : AUI port selected.\n");
418
419 POS=inb(dev->base_addr+HOST_CTRL);
420 POS|=HOST_CTRL_ATTN|HOST_CTRL_RESET;
421 POS&=~HOST_CTRL_INTE;
422 outb(POS, dev->base_addr+HOST_CTRL);
423
424 udelay(100);
425
426 POS&=~(HOST_CTRL_ATTN|HOST_CTRL_RESET);
427 outb(POS, dev->base_addr+HOST_CTRL);
428
429 udelay(300);
430
431
432
433
434
435 err = request_irq(dev->irq, &mc32_interrupt, IRQF_SHARED | IRQF_SAMPLE_RANDOM, DRV_NAME, dev);
436 if (err) {
437 release_region(dev->base_addr, MC32_IO_EXTENT);
438 printk(KERN_ERR "%s: unable to get IRQ %d.\n", DRV_NAME, dev->irq);
439 goto err_exit_ports;
440 }
441
442 memset(lp, 0, sizeof(struct mc32_local));
443 lp->slot = slot;
444
445 i=0;
446
447 base = inb(dev->base_addr);
448
449 while(base == 0xFF)
450 {
451 i++;
452 if(i == 1000)
453 {
454 printk(KERN_ERR "%s: failed to boot adapter.\n", dev->name);
455 err = -ENODEV;
456 goto err_exit_irq;
457 }
458 udelay(1000);
459 if(inb(dev->base_addr+2)&(1<<5))
460 base = inb(dev->base_addr);
461 }
462
463 if(base>0)
464 {
465 if(base < 0x0C)
466 printk(KERN_ERR "%s: %s%s.\n", dev->name, failures[base-1],
467 base<0x0A?" test failure":"");
468 else
469 printk(KERN_ERR "%s: unknown failure %d.\n", dev->name, base);
470 err = -ENODEV;
471 goto err_exit_irq;
472 }
473
474 base=0;
475 for(i=0;i<4;i++)
476 {
477 int n=0;
478
479 while(!(inb(dev->base_addr+2)&(1<<5)))
480 {
481 n++;
482 udelay(50);
483 if(n>100)
484 {
485 printk(KERN_ERR "%s: mailbox read fail (%d).\n", dev->name, i);
486 err = -ENODEV;
487 goto err_exit_irq;
488 }
489 }
490
491 base|=(inb(dev->base_addr)<<(8*i));
492 }
493
494 lp->exec_box=isa_bus_to_virt(dev->mem_start+base);
495
496 base=lp->exec_box->data[1]<<16|lp->exec_box->data[0];
497
498 lp->base = dev->mem_start+base;
499
500 lp->rx_box=isa_bus_to_virt(lp->base + lp->exec_box->data[2]);
501 lp->tx_box=isa_bus_to_virt(lp->base + lp->exec_box->data[3]);
502
503 lp->stats = isa_bus_to_virt(lp->base + lp->exec_box->data[5]);
504
505
506
507
508
509 lp->tx_chain = lp->exec_box->data[8];
510 lp->rx_chain = lp->exec_box->data[10];
511 lp->tx_len = lp->exec_box->data[9];
512 lp->rx_len = lp->exec_box->data[11];
513
514 init_MUTEX_LOCKED(&lp->cmd_mutex);
515 init_completion(&lp->execution_cmd);
516 init_completion(&lp->xceiver_cmd);
517
518 printk("%s: Firmware Rev %d. %d RX buffers, %d TX buffers. Base of 0x%08X.\n",
519 dev->name, lp->exec_box->data[12], lp->rx_len, lp->tx_len, lp->base);
520
521 dev->open = mc32_open;
522 dev->stop = mc32_close;
523 dev->hard_start_xmit = mc32_send_packet;
524 dev->get_stats = mc32_get_stats;
525 dev->set_multicast_list = mc32_set_multicast_list;
526 dev->tx_timeout = mc32_timeout;
527 dev->watchdog_timeo = HZ*5;
528 dev->ethtool_ops = &netdev_ethtool_ops;
529
530 return 0;
531
532err_exit_irq:
533 free_irq(dev->irq, dev);
534err_exit_ports:
535 release_region(dev->base_addr, MC32_IO_EXTENT);
536 return err;
537}
538
539
540
541
542
543
544
545
546
547
548
549static inline void mc32_ready_poll(struct net_device *dev)
550{
551 int ioaddr = dev->base_addr;
552 while(!(inb(ioaddr+HOST_STATUS)&HOST_STATUS_CRR));
553}
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572static int mc32_command_nowait(struct net_device *dev, u16 cmd, void *data, int len)
573{
574 struct mc32_local *lp = netdev_priv(dev);
575 int ioaddr = dev->base_addr;
576 int ret = -1;
577
578 if (down_trylock(&lp->cmd_mutex) == 0)
579 {
580 lp->cmd_nonblocking=1;
581 lp->exec_box->mbox=0;
582 lp->exec_box->mbox=cmd;
583 memcpy((void *)lp->exec_box->data, data, len);
584 barrier();
585
586
587 mc32_ready_poll(dev);
588 outb(1<<6, ioaddr+HOST_CMD);
589
590 ret = 0;
591
592
593 }
594
595 return ret;
596}
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618static int mc32_command(struct net_device *dev, u16 cmd, void *data, int len)
619{
620 struct mc32_local *lp = netdev_priv(dev);
621 int ioaddr = dev->base_addr;
622 int ret = 0;
623
624 down(&lp->cmd_mutex);
625
626
627
628
629
630 lp->cmd_nonblocking=0;
631 lp->exec_box->mbox=0;
632 lp->exec_box->mbox=cmd;
633 memcpy((void *)lp->exec_box->data, data, len);
634 barrier();
635
636 mc32_ready_poll(dev);
637 outb(1<<6, ioaddr+HOST_CMD);
638
639 wait_for_completion(&lp->execution_cmd);
640
641 if(lp->exec_box->mbox&(1<<13))
642 ret = -1;
643
644 up(&lp->cmd_mutex);
645
646
647
648
649
650 if(lp->mc_reload_wait)
651 {
652 mc32_reset_multicast_list(dev);
653 }
654
655 return ret;
656}
657
658
659
660
661
662
663
664
665
666
667
668
669
670static void mc32_start_transceiver(struct net_device *dev) {
671
672 struct mc32_local *lp = netdev_priv(dev);
673 int ioaddr = dev->base_addr;
674
675
676 if (lp->xceiver_desired_state==HALTED)
677 return;
678
679
680 mc32_ready_poll(dev);
681 lp->rx_box->mbox=0;
682 lp->rx_box->data[0]=lp->rx_ring[prev_rx(lp->rx_ring_tail)].p->next;
683 outb(HOST_CMD_START_RX, ioaddr+HOST_CMD);
684
685 mc32_ready_poll(dev);
686 lp->tx_box->mbox=0;
687 outb(HOST_CMD_RESTRT_TX, ioaddr+HOST_CMD);
688
689
690}
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705static void mc32_halt_transceiver(struct net_device *dev)
706{
707 struct mc32_local *lp = netdev_priv(dev);
708 int ioaddr = dev->base_addr;
709
710 mc32_ready_poll(dev);
711 lp->rx_box->mbox=0;
712 outb(HOST_CMD_SUSPND_RX, ioaddr+HOST_CMD);
713 wait_for_completion(&lp->xceiver_cmd);
714
715 mc32_ready_poll(dev);
716 lp->tx_box->mbox=0;
717 outb(HOST_CMD_SUSPND_TX, ioaddr+HOST_CMD);
718 wait_for_completion(&lp->xceiver_cmd);
719}
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742static int mc32_load_rx_ring(struct net_device *dev)
743{
744 struct mc32_local *lp = netdev_priv(dev);
745 int i;
746 u16 rx_base;
747 volatile struct skb_header *p;
748
749 rx_base=lp->rx_chain;
750
751 for(i=0; i<RX_RING_LEN; i++) {
752 lp->rx_ring[i].skb=alloc_skb(1532, GFP_KERNEL);
753 if (lp->rx_ring[i].skb==NULL) {
754 for (;i>=0;i--)
755 kfree_skb(lp->rx_ring[i].skb);
756 return -ENOBUFS;
757 }
758 skb_reserve(lp->rx_ring[i].skb, 18);
759
760 p=isa_bus_to_virt(lp->base+rx_base);
761
762 p->control=0;
763 p->data=isa_virt_to_bus(lp->rx_ring[i].skb->data);
764 p->status=0;
765 p->length=1532;
766
767 lp->rx_ring[i].p=p;
768 rx_base=p->next;
769 }
770
771 lp->rx_ring[i-1].p->control |= CONTROL_EOL;
772
773 lp->rx_ring_tail=0;
774
775 return 0;
776}
777
778
779
780
781
782
783
784
785
786
787
788static void mc32_flush_rx_ring(struct net_device *dev)
789{
790 struct mc32_local *lp = netdev_priv(dev);
791 int i;
792
793 for(i=0; i < RX_RING_LEN; i++)
794 {
795 if (lp->rx_ring[i].skb) {
796 dev_kfree_skb(lp->rx_ring[i].skb);
797 lp->rx_ring[i].skb = NULL;
798 }
799 lp->rx_ring[i].p=NULL;
800 }
801}
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820static void mc32_load_tx_ring(struct net_device *dev)
821{
822 struct mc32_local *lp = netdev_priv(dev);
823 volatile struct skb_header *p;
824 int i;
825 u16 tx_base;
826
827 tx_base=lp->tx_box->data[0];
828
829 for(i=0 ; i<TX_RING_LEN ; i++)
830 {
831 p=isa_bus_to_virt(lp->base+tx_base);
832 lp->tx_ring[i].p=p;
833 lp->tx_ring[i].skb=NULL;
834
835 tx_base=p->next;
836 }
837
838
839
840
841 atomic_set(&lp->tx_count, TX_RING_LEN-1);
842 atomic_set(&lp->tx_ring_head, 0);
843 lp->tx_ring_tail=0;
844}
845
846
847
848
849
850
851
852
853
854
855
856
857static void mc32_flush_tx_ring(struct net_device *dev)
858{
859 struct mc32_local *lp = netdev_priv(dev);
860 int i;
861
862 for (i=0; i < TX_RING_LEN; i++)
863 {
864 if (lp->tx_ring[i].skb)
865 {
866 dev_kfree_skb(lp->tx_ring[i].skb);
867 lp->tx_ring[i].skb = NULL;
868 }
869 }
870
871 atomic_set(&lp->tx_count, 0);
872 atomic_set(&lp->tx_ring_head, 0);
873 lp->tx_ring_tail=0;
874}
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894static int mc32_open(struct net_device *dev)
895{
896 int ioaddr = dev->base_addr;
897 struct mc32_local *lp = netdev_priv(dev);
898 u8 one=1;
899 u8 regs;
900 u16 descnumbuffs[2] = {TX_RING_LEN, RX_RING_LEN};
901
902
903
904
905
906 regs=inb(ioaddr+HOST_CTRL);
907 regs|=HOST_CTRL_INTE;
908 outb(regs, ioaddr+HOST_CTRL);
909
910
911
912
913
914 up(&lp->cmd_mutex);
915
916
917
918
919
920
921 mc32_command(dev, 4, &one, 2);
922
923
924
925
926
927 mc32_halt_transceiver(dev);
928 mc32_flush_tx_ring(dev);
929
930
931
932
933
934 if(mc32_command(dev, 8, descnumbuffs, 4)) {
935 printk("%s: %s rejected our buffer configuration!\n",
936 dev->name, cardname);
937 mc32_close(dev);
938 return -ENOBUFS;
939 }
940
941
942 mc32_command(dev, 6, NULL, 0);
943
944 lp->tx_chain = lp->exec_box->data[8];
945 lp->rx_chain = lp->exec_box->data[10];
946 lp->tx_len = lp->exec_box->data[9];
947 lp->rx_len = lp->exec_box->data[11];
948
949
950 mc32_command(dev, 1, dev->dev_addr, 6);
951
952
953 mc32_set_multicast_list(dev);
954
955 if (WORKAROUND_82586) {
956 u16 zero_word=0;
957 mc32_command(dev, 0x0D, &zero_word, 2);
958 }
959
960 mc32_load_tx_ring(dev);
961
962 if(mc32_load_rx_ring(dev))
963 {
964 mc32_close(dev);
965 return -ENOBUFS;
966 }
967
968 lp->xceiver_desired_state = RUNNING;
969
970
971 mc32_start_transceiver(dev);
972
973 netif_start_queue(dev);
974
975 return 0;
976}
977
978
979
980
981
982
983
984
985
986
987
988
989static void mc32_timeout(struct net_device *dev)
990{
991 printk(KERN_WARNING "%s: transmit timed out?\n", dev->name);
992
993 netif_wake_queue(dev);
994}
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018static int mc32_send_packet(struct sk_buff *skb, struct net_device *dev)
1019{
1020 struct mc32_local *lp = netdev_priv(dev);
1021 u32 head = atomic_read(&lp->tx_ring_head);
1022
1023 volatile struct skb_header *p, *np;
1024
1025 netif_stop_queue(dev);
1026
1027 if(atomic_read(&lp->tx_count)==0) {
1028 return 1;
1029 }
1030
1031 if (skb_padto(skb, ETH_ZLEN)) {
1032 netif_wake_queue(dev);
1033 return 0;
1034 }
1035
1036 atomic_dec(&lp->tx_count);
1037
1038
1039 p=lp->tx_ring[head].p;
1040
1041 head = next_tx(head);
1042
1043
1044 np=lp->tx_ring[head].p;
1045
1046
1047 lp->tx_ring[head].skb=skb;
1048
1049 np->length = unlikely(skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len;
1050 np->data = isa_virt_to_bus(skb->data);
1051 np->status = 0;
1052 np->control = CONTROL_EOP | CONTROL_EOL;
1053 wmb();
1054
1055
1056
1057
1058
1059
1060 atomic_set(&lp->tx_ring_head, head);
1061 p->control &= ~CONTROL_EOL;
1062
1063 netif_wake_queue(dev);
1064 return 0;
1065}
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087static void mc32_update_stats(struct net_device *dev)
1088{
1089 struct mc32_local *lp = netdev_priv(dev);
1090 volatile struct mc32_stats *st = lp->stats;
1091
1092 u32 rx_errors=0;
1093
1094 rx_errors+=dev->stats.rx_crc_errors +=st->rx_crc_errors;
1095 st->rx_crc_errors=0;
1096 rx_errors+=dev->stats.rx_fifo_errors +=st->rx_overrun_errors;
1097 st->rx_overrun_errors=0;
1098 rx_errors+=dev->stats.rx_frame_errors +=st->rx_alignment_errors;
1099 st->rx_alignment_errors=0;
1100 rx_errors+=dev->stats.rx_length_errors+=st->rx_tooshort_errors;
1101 st->rx_tooshort_errors=0;
1102 rx_errors+=dev->stats.rx_missed_errors+=st->rx_outofresource_errors;
1103 st->rx_outofresource_errors=0;
1104 dev->stats.rx_errors=rx_errors;
1105
1106
1107 dev->stats.collisions+=st->dataC[10];
1108 st->dataC[10]=0;
1109
1110
1111 dev->stats.collisions+=st->dataC[11];
1112 st->dataC[11]=0;
1113}
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138static void mc32_rx_ring(struct net_device *dev)
1139{
1140 struct mc32_local *lp = netdev_priv(dev);
1141 volatile struct skb_header *p;
1142 u16 rx_ring_tail;
1143 u16 rx_old_tail;
1144 int x=0;
1145
1146 rx_old_tail = rx_ring_tail = lp->rx_ring_tail;
1147
1148 do
1149 {
1150 p=lp->rx_ring[rx_ring_tail].p;
1151
1152 if(!(p->status & (1<<7))) {
1153 break;
1154 }
1155 if(p->status & (1<<6))
1156 {
1157
1158 u16 length=p->length;
1159 struct sk_buff *skb;
1160 struct sk_buff *newskb;
1161
1162
1163
1164 if ((length > RX_COPYBREAK)
1165 && ((newskb=dev_alloc_skb(1532)) != NULL))
1166 {
1167 skb=lp->rx_ring[rx_ring_tail].skb;
1168 skb_put(skb, length);
1169
1170 skb_reserve(newskb,18);
1171 lp->rx_ring[rx_ring_tail].skb=newskb;
1172 p->data=isa_virt_to_bus(newskb->data);
1173 }
1174 else
1175 {
1176 skb=dev_alloc_skb(length+2);
1177
1178 if(skb==NULL) {
1179 dev->stats.rx_dropped++;
1180 goto dropped;
1181 }
1182
1183 skb_reserve(skb,2);
1184 memcpy(skb_put(skb, length),
1185 lp->rx_ring[rx_ring_tail].skb->data, length);
1186 }
1187
1188 skb->protocol=eth_type_trans(skb,dev);
1189 dev->stats.rx_packets++;
1190 dev->stats.rx_bytes += length;
1191 netif_rx(skb);
1192 }
1193
1194 dropped:
1195 p->length = 1532;
1196 p->status = 0;
1197
1198 rx_ring_tail=next_rx(rx_ring_tail);
1199 }
1200 while(x++<48);
1201
1202
1203
1204
1205 if (rx_ring_tail != rx_old_tail)
1206 {
1207 lp->rx_ring[prev_rx(rx_ring_tail)].p->control |= CONTROL_EOL;
1208 lp->rx_ring[prev_rx(rx_old_tail)].p->control &= ~CONTROL_EOL;
1209
1210 lp->rx_ring_tail=rx_ring_tail;
1211 }
1212}
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229static void mc32_tx_ring(struct net_device *dev)
1230{
1231 struct mc32_local *lp = netdev_priv(dev);
1232 volatile struct skb_header *np;
1233
1234
1235
1236
1237
1238
1239
1240
1241 while (lp->tx_ring_tail != atomic_read(&lp->tx_ring_head))
1242 {
1243 u16 t;
1244
1245 t=next_tx(lp->tx_ring_tail);
1246 np=lp->tx_ring[t].p;
1247
1248 if(!(np->status & (1<<7)))
1249 {
1250
1251 break;
1252 }
1253 dev->stats.tx_packets++;
1254 if(!(np->status & (1<<6)))
1255 {
1256 dev->stats.tx_errors++;
1257
1258 switch(np->status&0x0F)
1259 {
1260 case 1:
1261 dev->stats.tx_aborted_errors++;
1262 break;
1263 case 2:
1264 dev->stats.tx_fifo_errors++;
1265 break;
1266 case 3:
1267 dev->stats.tx_carrier_errors++;
1268 break;
1269 case 4:
1270 dev->stats.tx_window_errors++;
1271 break;
1272 case 5:
1273 dev->stats.tx_aborted_errors++;
1274 break;
1275 }
1276 }
1277
1278
1279
1280 dev->stats.tx_bytes+=lp->tx_ring[t].skb->len;
1281 dev_kfree_skb_irq(lp->tx_ring[t].skb);
1282 lp->tx_ring[t].skb=NULL;
1283 atomic_inc(&lp->tx_count);
1284 netif_wake_queue(dev);
1285
1286 lp->tx_ring_tail=t;
1287 }
1288
1289}
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314static irqreturn_t mc32_interrupt(int irq, void *dev_id)
1315{
1316 struct net_device *dev = dev_id;
1317 struct mc32_local *lp;
1318 int ioaddr, status, boguscount = 0;
1319 int rx_event = 0;
1320 int tx_event = 0;
1321
1322 ioaddr = dev->base_addr;
1323 lp = netdev_priv(dev);
1324
1325
1326
1327 while((inb(ioaddr+HOST_STATUS)&HOST_STATUS_CWR) && boguscount++<2000)
1328 {
1329 status=inb(ioaddr+HOST_CMD);
1330
1331#ifdef DEBUG_IRQ
1332 printk("Status TX%d RX%d EX%d OV%d BC%d\n",
1333 (status&7), (status>>3)&7, (status>>6)&1,
1334 (status>>7)&1, boguscount);
1335#endif
1336
1337 switch(status&7)
1338 {
1339 case 0:
1340 break;
1341 case 6:
1342 case 2:
1343 tx_event = 1;
1344 break;
1345 case 3:
1346 case 4:
1347 complete(&lp->xceiver_cmd);
1348 break;
1349 default:
1350 printk("%s: strange tx ack %d\n", dev->name, status&7);
1351 }
1352 status>>=3;
1353 switch(status&7)
1354 {
1355 case 0:
1356 break;
1357 case 2:
1358 rx_event=1;
1359 break;
1360 case 3:
1361 case 4:
1362 complete(&lp->xceiver_cmd);
1363 break;
1364 case 6:
1365
1366
1367 dev->stats.rx_dropped++;
1368 mc32_rx_ring(dev);
1369 mc32_start_transceiver(dev);
1370 break;
1371 default:
1372 printk("%s: strange rx ack %d\n",
1373 dev->name, status&7);
1374 }
1375 status>>=3;
1376 if(status&1)
1377 {
1378
1379
1380
1381
1382
1383 if (lp->cmd_nonblocking) {
1384 up(&lp->cmd_mutex);
1385 if (lp->mc_reload_wait)
1386 mc32_reset_multicast_list(dev);
1387 }
1388 else complete(&lp->execution_cmd);
1389 }
1390 if(status&2)
1391 {
1392
1393
1394
1395
1396
1397 mc32_update_stats(dev);
1398 }
1399 }
1400
1401
1402
1403
1404
1405
1406 if(tx_event)
1407 mc32_tx_ring(dev);
1408
1409 if(rx_event)
1410 mc32_rx_ring(dev);
1411
1412 return IRQ_HANDLED;
1413}
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438static int mc32_close(struct net_device *dev)
1439{
1440 struct mc32_local *lp = netdev_priv(dev);
1441 int ioaddr = dev->base_addr;
1442
1443 u8 regs;
1444 u16 one=1;
1445
1446 lp->xceiver_desired_state = HALTED;
1447 netif_stop_queue(dev);
1448
1449
1450
1451
1452
1453 mc32_command(dev, 4, &one, 2);
1454
1455
1456
1457 mc32_halt_transceiver(dev);
1458
1459
1460
1461 down(&lp->cmd_mutex);
1462
1463
1464
1465 regs=inb(ioaddr+HOST_CTRL);
1466 regs&=~HOST_CTRL_INTE;
1467 outb(regs, ioaddr+HOST_CTRL);
1468
1469 mc32_flush_rx_ring(dev);
1470 mc32_flush_tx_ring(dev);
1471
1472 mc32_update_stats(dev);
1473
1474 return 0;
1475}
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487static struct net_device_stats *mc32_get_stats(struct net_device *dev)
1488{
1489 mc32_update_stats(dev);
1490 return &dev->stats;
1491}
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517static void do_mc32_set_multicast_list(struct net_device *dev, int retry)
1518{
1519 struct mc32_local *lp = netdev_priv(dev);
1520 u16 filt = (1<<2);
1521
1522 if ((dev->flags&IFF_PROMISC) ||
1523 (dev->flags&IFF_ALLMULTI) ||
1524 dev->mc_count > 10)
1525
1526 filt |= 1;
1527 else if(dev->mc_count)
1528 {
1529 unsigned char block[62];
1530 unsigned char *bp;
1531 struct dev_mc_list *dmc=dev->mc_list;
1532
1533 int i;
1534
1535 if(retry==0)
1536 lp->mc_list_valid = 0;
1537 if(!lp->mc_list_valid)
1538 {
1539 block[1]=0;
1540 block[0]=dev->mc_count;
1541 bp=block+2;
1542
1543 for(i=0;i<dev->mc_count;i++)
1544 {
1545 memcpy(bp, dmc->dmi_addr, 6);
1546 bp+=6;
1547 dmc=dmc->next;
1548 }
1549 if(mc32_command_nowait(dev, 2, block, 2+6*dev->mc_count)==-1)
1550 {
1551 lp->mc_reload_wait = 1;
1552 return;
1553 }
1554 lp->mc_list_valid=1;
1555 }
1556 }
1557
1558 if(mc32_command_nowait(dev, 0, &filt, 2)==-1)
1559 {
1560 lp->mc_reload_wait = 1;
1561 }
1562 else {
1563 lp->mc_reload_wait = 0;
1564 }
1565}
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577static void mc32_set_multicast_list(struct net_device *dev)
1578{
1579 do_mc32_set_multicast_list(dev,0);
1580}
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592static void mc32_reset_multicast_list(struct net_device *dev)
1593{
1594 do_mc32_set_multicast_list(dev,1);
1595}
1596
1597static void netdev_get_drvinfo(struct net_device *dev,
1598 struct ethtool_drvinfo *info)
1599{
1600 strcpy(info->driver, DRV_NAME);
1601 strcpy(info->version, DRV_VERSION);
1602 sprintf(info->bus_info, "MCA 0x%lx", dev->base_addr);
1603}
1604
1605static u32 netdev_get_msglevel(struct net_device *dev)
1606{
1607 return mc32_debug;
1608}
1609
1610static void netdev_set_msglevel(struct net_device *dev, u32 level)
1611{
1612 mc32_debug = level;
1613}
1614
1615static const struct ethtool_ops netdev_ethtool_ops = {
1616 .get_drvinfo = netdev_get_drvinfo,
1617 .get_msglevel = netdev_get_msglevel,
1618 .set_msglevel = netdev_set_msglevel,
1619};
1620
1621#ifdef MODULE
1622
1623static struct net_device *this_device;
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633int __init init_module(void)
1634{
1635 this_device = mc32_probe(-1);
1636 if (IS_ERR(this_device))
1637 return PTR_ERR(this_device);
1638 return 0;
1639}
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652void __exit cleanup_module(void)
1653{
1654 unregister_netdev(this_device);
1655 cleanup_card(this_device);
1656 free_netdev(this_device);
1657}
1658
1659#endif
1660