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
57static const char version[] =
58 "smc9194.c:v0.14 12/15/00 by Erik Stahlman (erik@vt.edu)";
59
60#include <linux/module.h>
61#include <linux/kernel.h>
62#include <linux/types.h>
63#include <linux/fcntl.h>
64#include <linux/interrupt.h>
65#include <linux/ioport.h>
66#include <linux/in.h>
67#include <linux/string.h>
68#include <linux/init.h>
69#include <linux/crc32.h>
70#include <linux/errno.h>
71#include <linux/netdevice.h>
72#include <linux/etherdevice.h>
73#include <linux/skbuff.h>
74#include <linux/bitops.h>
75
76#include <asm/io.h>
77
78#include "smc9194.h"
79
80#define DRV_NAME "smc9194"
81
82
83
84
85
86
87
88
89
90
91
92#ifdef __sh__
93#undef USE_32_BIT
94#else
95#define USE_32_BIT 1
96#endif
97
98
99
100
101
102
103
104struct devlist {
105 unsigned int port;
106 unsigned int irq;
107};
108
109static struct devlist smc_devlist[] __initdata = {
110 {.port = 0x200, .irq = 0},
111 {.port = 0x220, .irq = 0},
112 {.port = 0x240, .irq = 0},
113 {.port = 0x260, .irq = 0},
114 {.port = 0x280, .irq = 0},
115 {.port = 0x2A0, .irq = 0},
116 {.port = 0x2C0, .irq = 0},
117 {.port = 0x2E0, .irq = 0},
118 {.port = 0x300, .irq = 0},
119 {.port = 0x320, .irq = 0},
120 {.port = 0x340, .irq = 0},
121 {.port = 0x360, .irq = 0},
122 {.port = 0x380, .irq = 0},
123 {.port = 0x3A0, .irq = 0},
124 {.port = 0x3C0, .irq = 0},
125 {.port = 0x3E0, .irq = 0},
126 {.port = 0, .irq = 0},
127};
128
129
130
131
132
133#define MEMORY_WAIT_TIME 16
134
135
136
137
138
139
140
141
142
143
144#define SMC_DEBUG 0
145
146#if (SMC_DEBUG > 2 )
147#define PRINTK3(x) printk x
148#else
149#define PRINTK3(x)
150#endif
151
152#if SMC_DEBUG > 1
153#define PRINTK2(x) printk x
154#else
155#define PRINTK2(x)
156#endif
157
158#ifdef SMC_DEBUG
159#define PRINTK(x) printk x
160#else
161#define PRINTK(x)
162#endif
163
164
165
166
167
168
169
170
171
172#define CARDNAME "SMC9194"
173
174
175
176struct smc_local {
177
178
179
180
181
182 struct sk_buff * saved_skb;
183
184
185
186
187
188
189 int packets_waiting;
190};
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208struct net_device *smc_init(int unit);
209
210
211
212
213
214static int smc_open(struct net_device *dev);
215
216
217
218
219static void smc_timeout(struct net_device *dev);
220
221
222
223
224
225
226static int smc_close(struct net_device *dev);
227
228
229
230
231
232static void smc_set_multicast_list(struct net_device *dev);
233
234
235
236
237
238
239
240
241
242
243
244static irqreturn_t smc_interrupt(int irq, void *);
245
246
247
248
249static inline void smc_rcv( struct net_device *dev );
250
251
252
253
254static inline void smc_tx( struct net_device * dev );
255
256
257
258
259
260
261
262
263
264
265
266
267
268static int smc_probe(struct net_device *dev, int ioaddr);
269
270
271
272
273#if SMC_DEBUG > 2
274static void print_packet( byte *, int );
275#endif
276
277#define tx_done(dev) 1
278
279
280static void smc_hardware_send_packet( struct net_device * dev );
281
282
283
284
285
286static netdev_tx_t smc_wait_to_send_packet( struct sk_buff * skb,
287 struct net_device *dev );
288
289
290static void smc_reset( int ioaddr );
291
292
293static void smc_enable( int ioaddr );
294
295
296static void smc_shutdown( int ioaddr );
297
298
299
300static int smc_findirq( int ioaddr );
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319static void smc_reset( int ioaddr )
320{
321
322
323 SMC_SELECT_BANK( 0 );
324 outw( RCR_SOFTRESET, ioaddr + RCR );
325
326
327 SMC_DELAY( );
328
329
330
331 outw( RCR_CLEAR, ioaddr + RCR );
332 outw( TCR_CLEAR, ioaddr + TCR );
333
334
335
336
337 SMC_SELECT_BANK( 1 );
338 outw( inw( ioaddr + CONTROL ) | CTL_AUTO_RELEASE , ioaddr + CONTROL );
339
340
341 SMC_SELECT_BANK( 2 );
342 outw( MC_RESET, ioaddr + MMU_CMD );
343
344
345
346
347
348 outb( 0, ioaddr + INT_MASK );
349}
350
351
352
353
354
355
356
357
358
359static void smc_enable( int ioaddr )
360{
361 SMC_SELECT_BANK( 0 );
362
363 outw( TCR_NORMAL, ioaddr + TCR );
364 outw( RCR_NORMAL, ioaddr + RCR );
365
366
367 SMC_SELECT_BANK( 2 );
368 outb( SMC_INTERRUPT_MASK, ioaddr + INT_MASK );
369}
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385static void smc_shutdown( int ioaddr )
386{
387
388 SMC_SELECT_BANK( 2 );
389 outb( 0, ioaddr + INT_MASK );
390
391
392 SMC_SELECT_BANK( 0 );
393 outb( RCR_CLEAR, ioaddr + RCR );
394 outb( TCR_CLEAR, ioaddr + TCR );
395#if 0
396
397 SMC_SELECT_BANK( 1 );
398 outw( inw( ioaddr + CONTROL ), CTL_POWERDOWN, ioaddr + CONTROL );
399#endif
400}
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421static void smc_setmulticast(int ioaddr, struct net_device *dev)
422{
423 int i;
424 unsigned char multicast_table[ 8 ];
425 struct netdev_hw_addr *ha;
426
427 unsigned char invert3[] = { 0, 4, 2, 6, 1, 5, 3, 7 };
428
429
430 memset( multicast_table, 0, sizeof( multicast_table ) );
431
432 netdev_for_each_mc_addr(ha, dev) {
433 int position;
434
435
436 position = ether_crc_le(6, ha->addr) & 0x3f;
437
438
439 multicast_table[invert3[position&7]] |=
440 (1<<invert3[(position>>3)&7]);
441
442 }
443
444 SMC_SELECT_BANK( 3 );
445
446 for ( i = 0; i < 8 ; i++ ) {
447 outb( multicast_table[i], ioaddr + MULTICAST1 + i );
448 }
449}
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467static netdev_tx_t smc_wait_to_send_packet(struct sk_buff *skb,
468 struct net_device *dev)
469{
470 struct smc_local *lp = netdev_priv(dev);
471 unsigned int ioaddr = dev->base_addr;
472 word length;
473 unsigned short numPages;
474 word time_out;
475
476 netif_stop_queue(dev);
477
478
479
480 if ( lp->saved_skb) {
481
482 dev->stats.tx_aborted_errors++;
483 printk(CARDNAME": Bad Craziness - sent packet while busy.\n" );
484 return NETDEV_TX_BUSY;
485 }
486 lp->saved_skb = skb;
487
488 length = skb->len;
489
490 if (length < ETH_ZLEN) {
491 if (skb_padto(skb, ETH_ZLEN)) {
492 netif_wake_queue(dev);
493 return NETDEV_TX_OK;
494 }
495 length = ETH_ZLEN;
496 }
497
498
499
500
501
502
503
504
505 numPages = ((length & 0xfffe) + 6) / 256;
506
507 if (numPages > 7 ) {
508 printk(CARDNAME": Far too big packet error.\n");
509
510
511 dev_kfree_skb (skb);
512 lp->saved_skb = NULL;
513
514 netif_wake_queue(dev);
515 return NETDEV_TX_OK;
516 }
517
518 lp->packets_waiting++;
519
520
521 SMC_SELECT_BANK( 2 );
522 outw( MC_ALLOC | numPages, ioaddr + MMU_CMD );
523
524
525
526
527
528
529
530
531
532
533
534
535 time_out = MEMORY_WAIT_TIME;
536 do {
537 word status;
538
539 status = inb( ioaddr + INTERRUPT );
540 if ( status & IM_ALLOC_INT ) {
541
542 outb( IM_ALLOC_INT, ioaddr + INTERRUPT );
543 break;
544 }
545 } while ( -- time_out );
546
547 if ( !time_out ) {
548
549 SMC_ENABLE_INT( IM_ALLOC_INT );
550 PRINTK2((CARDNAME": memory allocation deferred.\n"));
551
552 return NETDEV_TX_OK;
553 }
554
555 smc_hardware_send_packet(dev);
556 netif_wake_queue(dev);
557 return NETDEV_TX_OK;
558}
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578static void smc_hardware_send_packet( struct net_device * dev )
579{
580 struct smc_local *lp = netdev_priv(dev);
581 byte packet_no;
582 struct sk_buff * skb = lp->saved_skb;
583 word length;
584 unsigned int ioaddr;
585 byte * buf;
586
587 ioaddr = dev->base_addr;
588
589 if ( !skb ) {
590 PRINTK((CARDNAME": In XMIT with no packet to send\n"));
591 return;
592 }
593 length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
594 buf = skb->data;
595
596
597 packet_no = inb( ioaddr + PNR_ARR + 1 );
598 if ( packet_no & 0x80 ) {
599
600 netdev_dbg(dev, CARDNAME": Memory allocation failed.\n");
601 dev_kfree_skb_any(skb);
602 lp->saved_skb = NULL;
603 netif_wake_queue(dev);
604 return;
605 }
606
607
608 outb( packet_no, ioaddr + PNR_ARR );
609
610
611 outw( PTR_AUTOINC , ioaddr + POINTER );
612
613 PRINTK3((CARDNAME": Trying to xmit packet of length %x\n", length));
614#if SMC_DEBUG > 2
615 print_packet( buf, length );
616#endif
617
618
619
620#ifdef USE_32_BIT
621 outl( (length +6 ) << 16 , ioaddr + DATA_1 );
622#else
623 outw( 0, ioaddr + DATA_1 );
624
625 outb( (length+6) & 0xFF,ioaddr + DATA_1 );
626 outb( (length+6) >> 8 , ioaddr + DATA_1 );
627#endif
628
629
630
631
632
633
634
635
636#ifdef USE_32_BIT
637 if ( length & 0x2 ) {
638 outsl(ioaddr + DATA_1, buf, length >> 2 );
639 outw( *((word *)(buf + (length & 0xFFFFFFFC))),ioaddr +DATA_1);
640 }
641 else
642 outsl(ioaddr + DATA_1, buf, length >> 2 );
643#else
644 outsw(ioaddr + DATA_1 , buf, (length ) >> 1);
645#endif
646
647
648 if ( (length & 1) == 0 ) {
649 outw( 0, ioaddr + DATA_1 );
650 } else {
651 outb( buf[length -1 ], ioaddr + DATA_1 );
652 outb( 0x20, ioaddr + DATA_1);
653 }
654
655
656 SMC_ENABLE_INT( (IM_TX_INT | IM_TX_EMPTY_INT) );
657
658
659 outw( MC_ENQUEUE , ioaddr + MMU_CMD );
660
661 PRINTK2((CARDNAME": Sent packet of length %d\n", length));
662
663 lp->saved_skb = NULL;
664 dev_kfree_skb_any (skb);
665
666 netif_trans_update(dev);
667
668
669 netif_wake_queue(dev);
670}
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686static int io;
687static int irq;
688static int ifport;
689
690struct net_device * __init smc_init(int unit)
691{
692 struct net_device *dev = alloc_etherdev(sizeof(struct smc_local));
693 struct devlist *smcdev = smc_devlist;
694 int err = 0;
695
696 if (!dev)
697 return ERR_PTR(-ENODEV);
698
699 if (unit >= 0) {
700 sprintf(dev->name, "eth%d", unit);
701 netdev_boot_setup_check(dev);
702 io = dev->base_addr;
703 irq = dev->irq;
704 }
705
706 if (io > 0x1ff) {
707 err = smc_probe(dev, io);
708 } else if (io != 0) {
709 err = -ENXIO;
710 } else {
711 for (;smcdev->port; smcdev++) {
712 if (smc_probe(dev, smcdev->port) == 0)
713 break;
714 }
715 if (!smcdev->port)
716 err = -ENODEV;
717 }
718 if (err)
719 goto out;
720 err = register_netdev(dev);
721 if (err)
722 goto out1;
723 return dev;
724out1:
725 free_irq(dev->irq, dev);
726 release_region(dev->base_addr, SMC_IO_EXTENT);
727out:
728 free_netdev(dev);
729 return ERR_PTR(err);
730}
731
732
733
734
735
736
737
738
739static int __init smc_findirq(int ioaddr)
740{
741#ifndef NO_AUTOPROBE
742 int timeout = 20;
743 unsigned long cookie;
744
745
746 cookie = probe_irq_on();
747
748
749
750
751
752
753
754
755 SMC_SELECT_BANK(2);
756
757 outb( IM_ALLOC_INT, ioaddr + INT_MASK );
758
759
760
761
762
763 outw( MC_ALLOC | 1, ioaddr + MMU_CMD );
764
765
766
767
768 while ( timeout ) {
769 byte int_status;
770
771 int_status = inb( ioaddr + INTERRUPT );
772
773 if ( int_status & IM_ALLOC_INT )
774 break;
775 timeout--;
776 }
777
778
779
780
781
782
783
784
785
786
787
788 SMC_DELAY();
789 SMC_DELAY();
790
791
792 outb( 0, ioaddr + INT_MASK );
793
794
795 return probe_irq_off(cookie);
796#else
797 struct devlist *smcdev;
798 for (smcdev = smc_devlist; smcdev->port; smcdev++) {
799 if (smcdev->port == ioaddr)
800 return smcdev->irq;
801 }
802 return 0;
803#endif
804}
805
806static const struct net_device_ops smc_netdev_ops = {
807 .ndo_open = smc_open,
808 .ndo_stop = smc_close,
809 .ndo_start_xmit = smc_wait_to_send_packet,
810 .ndo_tx_timeout = smc_timeout,
811 .ndo_set_rx_mode = smc_set_multicast_list,
812 .ndo_set_mac_address = eth_mac_addr,
813 .ndo_validate_addr = eth_validate_addr,
814};
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845static int __init smc_probe(struct net_device *dev, int ioaddr)
846{
847 int i, memory, retval;
848 unsigned int bank;
849
850 const char *version_string;
851 const char *if_string;
852
853
854 word revision_register;
855 word base_address_register;
856 word configuration_register;
857 word memory_info_register;
858 word memory_cfg_register;
859
860
861 if (!request_region(ioaddr, SMC_IO_EXTENT, DRV_NAME))
862 return -EBUSY;
863
864 dev->irq = irq;
865 dev->if_port = ifport;
866
867
868 bank = inw( ioaddr + BANK_SELECT );
869 if ( (bank & 0xFF00) != 0x3300 ) {
870 retval = -ENODEV;
871 goto err_out;
872 }
873
874
875 outw( 0x0, ioaddr + BANK_SELECT );
876 bank = inw( ioaddr + BANK_SELECT );
877 if ( (bank & 0xFF00 ) != 0x3300 ) {
878 retval = -ENODEV;
879 goto err_out;
880 }
881
882
883
884 SMC_SELECT_BANK(1);
885 base_address_register = inw( ioaddr + BASE );
886 if ( ioaddr != ( base_address_register >> 3 & 0x3E0 ) ) {
887 printk(CARDNAME ": IOADDR %x doesn't match configuration (%x). "
888 "Probably not a SMC chip\n",
889 ioaddr, base_address_register >> 3 & 0x3E0 );
890
891
892 retval = -ENODEV;
893 goto err_out;
894 }
895
896
897
898
899 SMC_SELECT_BANK(3);
900 revision_register = inw( ioaddr + REVISION );
901 if ( !chip_ids[ ( revision_register >> 4 ) & 0xF ] ) {
902
903 printk(CARDNAME ": IO %x: Unrecognized revision register:"
904 " %x, Contact author.\n", ioaddr, revision_register);
905
906 retval = -ENODEV;
907 goto err_out;
908 }
909
910
911
912
913
914 pr_info_once("%s\n", version);
915
916
917 dev->base_addr = ioaddr;
918
919
920
921
922 SMC_SELECT_BANK( 1 );
923 for ( i = 0; i < 6; i += 2 ) {
924 word address;
925
926 address = inw( ioaddr + ADDR0 + i );
927 dev->dev_addr[ i + 1] = address >> 8;
928 dev->dev_addr[ i ] = address & 0xFF;
929 }
930
931
932
933 SMC_SELECT_BANK( 0 );
934 memory_info_register = inw( ioaddr + MIR );
935 memory_cfg_register = inw( ioaddr + MCR );
936 memory = ( memory_cfg_register >> 9 ) & 0x7;
937 memory *= 256 * ( memory_info_register & 0xFF );
938
939
940
941
942
943
944 SMC_SELECT_BANK(3);
945 revision_register = inw( ioaddr + REVISION );
946 version_string = chip_ids[ ( revision_register >> 4 ) & 0xF ];
947 if ( !version_string ) {
948
949 retval = -ENODEV;
950 goto err_out;
951 }
952
953
954 if ( dev->if_port == 0 ) {
955 SMC_SELECT_BANK(1);
956 configuration_register = inw( ioaddr + CONFIG );
957 if ( configuration_register & CFG_AUI_SELECT )
958 dev->if_port = 2;
959 else
960 dev->if_port = 1;
961 }
962 if_string = interfaces[ dev->if_port - 1 ];
963
964
965 smc_reset( ioaddr );
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983 if ( dev->irq < 2 ) {
984 int trials;
985
986 trials = 3;
987 while ( trials-- ) {
988 dev->irq = smc_findirq( ioaddr );
989 if ( dev->irq )
990 break;
991
992 smc_reset( ioaddr );
993 }
994 }
995 if (dev->irq == 0 ) {
996 printk(CARDNAME": Couldn't autodetect your IRQ. Use irq=xx.\n");
997 retval = -ENODEV;
998 goto err_out;
999 }
1000
1001
1002
1003 netdev_info(dev, "%s(r:%d) at %#3x IRQ:%d INTF:%s MEM:%db ",
1004 version_string, revision_register & 0xF, ioaddr, dev->irq,
1005 if_string, memory);
1006
1007
1008
1009 netdev_info(dev, "ADDR: %pM\n", dev->dev_addr);
1010
1011
1012 retval = request_irq(dev->irq, smc_interrupt, 0, DRV_NAME, dev);
1013 if (retval) {
1014 netdev_warn(dev, "%s: unable to get IRQ %d (irqval=%d).\n",
1015 DRV_NAME, dev->irq, retval);
1016 goto err_out;
1017 }
1018
1019 dev->netdev_ops = &smc_netdev_ops;
1020 dev->watchdog_timeo = HZ/20;
1021
1022 return 0;
1023
1024err_out:
1025 release_region(ioaddr, SMC_IO_EXTENT);
1026 return retval;
1027}
1028
1029#if SMC_DEBUG > 2
1030static void print_packet( byte * buf, int length )
1031{
1032#if 0
1033 print_hex_dump_debug(DRV_NAME, DUMP_PREFIX_OFFSET, 16, 1,
1034 buf, length, true);
1035#endif
1036}
1037#endif
1038
1039
1040
1041
1042
1043
1044
1045
1046static int smc_open(struct net_device *dev)
1047{
1048 int ioaddr = dev->base_addr;
1049
1050 int i;
1051
1052
1053 memset(netdev_priv(dev), 0, sizeof(struct smc_local));
1054
1055
1056
1057 smc_reset( ioaddr );
1058 smc_enable( ioaddr );
1059
1060
1061
1062 SMC_SELECT_BANK( 1 );
1063 if ( dev->if_port == 1 ) {
1064 outw( inw( ioaddr + CONFIG ) & ~CFG_AUI_SELECT,
1065 ioaddr + CONFIG );
1066 }
1067 else if ( dev->if_port == 2 ) {
1068 outw( inw( ioaddr + CONFIG ) | CFG_AUI_SELECT,
1069 ioaddr + CONFIG );
1070 }
1071
1072
1073
1074
1075
1076
1077 SMC_SELECT_BANK( 1 );
1078 for ( i = 0; i < 6; i += 2 ) {
1079 word address;
1080
1081 address = dev->dev_addr[ i + 1 ] << 8 ;
1082 address |= dev->dev_addr[ i ];
1083 outw( address, ioaddr + ADDR0 + i );
1084 }
1085
1086 netif_start_queue(dev);
1087 return 0;
1088}
1089
1090
1091
1092
1093
1094
1095
1096
1097static void smc_timeout(struct net_device *dev)
1098{
1099
1100
1101 netdev_warn(dev, CARDNAME": transmit timed out, %s?\n",
1102 tx_done(dev) ? "IRQ conflict" : "network cable problem");
1103
1104 smc_reset( dev->base_addr );
1105 smc_enable( dev->base_addr );
1106 netif_trans_update(dev);
1107
1108 ((struct smc_local *)netdev_priv(dev))->saved_skb = NULL;
1109 netif_wake_queue(dev);
1110}
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124static void smc_rcv(struct net_device *dev)
1125{
1126 int ioaddr = dev->base_addr;
1127 int packet_number;
1128 word status;
1129 word packet_length;
1130
1131
1132
1133 packet_number = inw( ioaddr + FIFO_PORTS );
1134
1135 if ( packet_number & FP_RXEMPTY ) {
1136
1137 PRINTK((CARDNAME ": WARNING: smc_rcv with nothing on FIFO.\n"));
1138
1139 return;
1140 }
1141
1142
1143 outw( PTR_READ | PTR_RCV | PTR_AUTOINC, ioaddr + POINTER );
1144
1145
1146 status = inw( ioaddr + DATA_1 );
1147 packet_length = inw( ioaddr + DATA_1 );
1148
1149 packet_length &= 0x07ff;
1150
1151 PRINTK2(("RCV: STATUS %4x LENGTH %4x\n", status, packet_length ));
1152
1153
1154
1155
1156 packet_length -= 6;
1157
1158 if ( !(status & RS_ERRORS ) ){
1159
1160 struct sk_buff * skb;
1161 byte * data;
1162
1163
1164 if ( status & RS_ODDFRAME )
1165 packet_length++;
1166
1167
1168 if ( status & RS_MULTICAST )
1169 dev->stats.multicast++;
1170
1171 skb = netdev_alloc_skb(dev, packet_length + 5);
1172 if ( skb == NULL ) {
1173 dev->stats.rx_dropped++;
1174 goto done;
1175 }
1176
1177
1178
1179
1180
1181
1182 skb_reserve( skb, 2 );
1183
1184 data = skb_put( skb, packet_length);
1185
1186#ifdef USE_32_BIT
1187
1188
1189
1190
1191 PRINTK3((" Reading %d dwords (and %d bytes)\n",
1192 packet_length >> 2, packet_length & 3 ));
1193 insl(ioaddr + DATA_1 , data, packet_length >> 2 );
1194
1195 insb( ioaddr + DATA_1, data + (packet_length & 0xFFFFFC),
1196 packet_length & 0x3 );
1197#else
1198 PRINTK3((" Reading %d words and %d byte(s)\n",
1199 (packet_length >> 1 ), packet_length & 1 ));
1200 insw(ioaddr + DATA_1 , data, packet_length >> 1);
1201 if ( packet_length & 1 ) {
1202 data += packet_length & ~1;
1203 *(data++) = inb( ioaddr + DATA_1 );
1204 }
1205#endif
1206#if SMC_DEBUG > 2
1207 print_packet( data, packet_length );
1208#endif
1209
1210 skb->protocol = eth_type_trans(skb, dev );
1211 netif_rx(skb);
1212 dev->stats.rx_packets++;
1213 dev->stats.rx_bytes += packet_length;
1214 } else {
1215
1216 dev->stats.rx_errors++;
1217
1218 if ( status & RS_ALGNERR ) dev->stats.rx_frame_errors++;
1219 if ( status & (RS_TOOSHORT | RS_TOOLONG ) )
1220 dev->stats.rx_length_errors++;
1221 if ( status & RS_BADCRC) dev->stats.rx_crc_errors++;
1222 }
1223
1224done:
1225
1226 outw( MC_RELEASE, ioaddr + MMU_CMD );
1227}
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245static void smc_tx( struct net_device * dev )
1246{
1247 int ioaddr = dev->base_addr;
1248 struct smc_local *lp = netdev_priv(dev);
1249 byte saved_packet;
1250 byte packet_no;
1251 word tx_status;
1252
1253
1254
1255
1256 saved_packet = inb( ioaddr + PNR_ARR );
1257 packet_no = inw( ioaddr + FIFO_PORTS );
1258 packet_no &= 0x7F;
1259
1260
1261 outb( packet_no, ioaddr + PNR_ARR );
1262
1263
1264 outw( PTR_AUTOINC | PTR_READ, ioaddr + POINTER );
1265
1266 tx_status = inw( ioaddr + DATA_1 );
1267 PRINTK3((CARDNAME": TX DONE STATUS: %4x\n", tx_status));
1268
1269 dev->stats.tx_errors++;
1270 if ( tx_status & TS_LOSTCAR ) dev->stats.tx_carrier_errors++;
1271 if ( tx_status & TS_LATCOL ) {
1272 netdev_dbg(dev, CARDNAME": Late collision occurred on last xmit.\n");
1273 dev->stats.tx_window_errors++;
1274 }
1275#if 0
1276 if ( tx_status & TS_16COL ) { ... }
1277#endif
1278
1279 if ( tx_status & TS_SUCCESS ) {
1280 netdev_info(dev, CARDNAME": Successful packet caused interrupt\n");
1281 }
1282
1283 SMC_SELECT_BANK( 0 );
1284 outw( inw( ioaddr + TCR ) | TCR_ENABLE, ioaddr + TCR );
1285
1286
1287 SMC_SELECT_BANK( 2 );
1288 outw( MC_FREEPKT, ioaddr + MMU_CMD );
1289
1290
1291 lp->packets_waiting--;
1292
1293 outb( saved_packet, ioaddr + PNR_ARR );
1294}
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309static irqreturn_t smc_interrupt(int irq, void * dev_id)
1310{
1311 struct net_device *dev = dev_id;
1312 int ioaddr = dev->base_addr;
1313 struct smc_local *lp = netdev_priv(dev);
1314
1315 byte status;
1316 word card_stats;
1317 byte mask;
1318 int timeout;
1319
1320 word saved_bank;
1321 word saved_pointer;
1322 int handled = 0;
1323
1324
1325 PRINTK3((CARDNAME": SMC interrupt started\n"));
1326
1327 saved_bank = inw( ioaddr + BANK_SELECT );
1328
1329 SMC_SELECT_BANK(2);
1330 saved_pointer = inw( ioaddr + POINTER );
1331
1332 mask = inb( ioaddr + INT_MASK );
1333
1334 outb( 0, ioaddr + INT_MASK );
1335
1336
1337
1338 timeout = 4;
1339
1340 PRINTK2((KERN_WARNING CARDNAME ": MASK IS %x\n", mask));
1341 do {
1342
1343 status = inb( ioaddr + INTERRUPT ) & mask;
1344 if (!status )
1345 break;
1346
1347 handled = 1;
1348
1349 PRINTK3((KERN_WARNING CARDNAME
1350 ": Handling interrupt status %x\n", status));
1351
1352 if (status & IM_RCV_INT) {
1353
1354 PRINTK2((KERN_WARNING CARDNAME
1355 ": Receive Interrupt\n"));
1356 smc_rcv(dev);
1357 } else if (status & IM_TX_INT ) {
1358 PRINTK2((KERN_WARNING CARDNAME
1359 ": TX ERROR handled\n"));
1360 smc_tx(dev);
1361 outb(IM_TX_INT, ioaddr + INTERRUPT );
1362 } else if (status & IM_TX_EMPTY_INT ) {
1363
1364 SMC_SELECT_BANK( 0 );
1365 card_stats = inw( ioaddr + COUNTER );
1366
1367 dev->stats.collisions += card_stats & 0xF;
1368 card_stats >>= 4;
1369
1370 dev->stats.collisions += card_stats & 0xF;
1371
1372
1373
1374 SMC_SELECT_BANK( 2 );
1375 PRINTK2((KERN_WARNING CARDNAME
1376 ": TX_BUFFER_EMPTY handled\n"));
1377 outb( IM_TX_EMPTY_INT, ioaddr + INTERRUPT );
1378 mask &= ~IM_TX_EMPTY_INT;
1379 dev->stats.tx_packets += lp->packets_waiting;
1380 lp->packets_waiting = 0;
1381
1382 } else if (status & IM_ALLOC_INT ) {
1383 PRINTK2((KERN_DEBUG CARDNAME
1384 ": Allocation interrupt\n"));
1385
1386 mask &= ~IM_ALLOC_INT;
1387
1388 smc_hardware_send_packet( dev );
1389
1390
1391 mask |= ( IM_TX_EMPTY_INT | IM_TX_INT );
1392
1393
1394 netif_wake_queue(dev);
1395
1396 PRINTK2((CARDNAME": Handoff done successfully.\n"));
1397 } else if (status & IM_RX_OVRN_INT ) {
1398 dev->stats.rx_errors++;
1399 dev->stats.rx_fifo_errors++;
1400 outb( IM_RX_OVRN_INT, ioaddr + INTERRUPT );
1401 } else if (status & IM_EPH_INT ) {
1402 PRINTK((CARDNAME ": UNSUPPORTED: EPH INTERRUPT\n"));
1403 } else if (status & IM_ERCV_INT ) {
1404 PRINTK((CARDNAME ": UNSUPPORTED: ERCV INTERRUPT\n"));
1405 outb( IM_ERCV_INT, ioaddr + INTERRUPT );
1406 }
1407 } while ( timeout -- );
1408
1409
1410
1411 SMC_SELECT_BANK( 2 );
1412 outb( mask, ioaddr + INT_MASK );
1413
1414 PRINTK3((KERN_WARNING CARDNAME ": MASK is now %x\n", mask));
1415 outw( saved_pointer, ioaddr + POINTER );
1416
1417 SMC_SELECT_BANK( saved_bank );
1418
1419 PRINTK3((CARDNAME ": Interrupt done\n"));
1420 return IRQ_RETVAL(handled);
1421}
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432static int smc_close(struct net_device *dev)
1433{
1434 netif_stop_queue(dev);
1435
1436 smc_shutdown( dev->base_addr );
1437
1438
1439 return 0;
1440}
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450static void smc_set_multicast_list(struct net_device *dev)
1451{
1452 short ioaddr = dev->base_addr;
1453
1454 SMC_SELECT_BANK(0);
1455 if ( dev->flags & IFF_PROMISC )
1456 outw( inw(ioaddr + RCR ) | RCR_PROMISC, ioaddr + RCR );
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467 else if (dev->flags & IFF_ALLMULTI)
1468 outw( inw(ioaddr + RCR ) | RCR_ALMUL, ioaddr + RCR );
1469
1470
1471
1472
1473 else if (!netdev_mc_empty(dev)) {
1474
1475
1476
1477 outw( inw( ioaddr + RCR ) & ~(RCR_PROMISC | RCR_ALMUL),
1478 ioaddr + RCR );
1479
1480
1481 smc_setmulticast(ioaddr, dev);
1482 }
1483 else {
1484 outw( inw( ioaddr + RCR ) & ~(RCR_PROMISC | RCR_ALMUL),
1485 ioaddr + RCR );
1486
1487
1488
1489
1490
1491 SMC_SELECT_BANK( 3 );
1492 outw( 0, ioaddr + MULTICAST1 );
1493 outw( 0, ioaddr + MULTICAST2 );
1494 outw( 0, ioaddr + MULTICAST3 );
1495 outw( 0, ioaddr + MULTICAST4 );
1496 }
1497}
1498
1499#ifdef MODULE
1500
1501static struct net_device *devSMC9194;
1502MODULE_LICENSE("GPL");
1503
1504module_param_hw(io, int, ioport, 0);
1505module_param_hw(irq, int, irq, 0);
1506module_param(ifport, int, 0);
1507MODULE_PARM_DESC(io, "SMC 99194 I/O base address");
1508MODULE_PARM_DESC(irq, "SMC 99194 IRQ number");
1509MODULE_PARM_DESC(ifport, "SMC 99194 interface port (0-default, 1-TP, 2-AUI)");
1510
1511int __init init_module(void)
1512{
1513 if (io == 0)
1514 printk(KERN_WARNING
1515 CARDNAME": You shouldn't use auto-probing with insmod!\n" );
1516
1517
1518 devSMC9194 = smc_init(-1);
1519 return PTR_ERR_OR_ZERO(devSMC9194);
1520}
1521
1522void __exit cleanup_module(void)
1523{
1524 unregister_netdev(devSMC9194);
1525 free_irq(devSMC9194->irq, devSMC9194);
1526 release_region(devSMC9194->base_addr, SMC_IO_EXTENT);
1527 free_netdev(devSMC9194);
1528}
1529
1530#endif
1531