0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057 static const char version[] =
0058 "smc9194.c:v0.14 12/15/00 by Erik Stahlman (erik@vt.edu)";
0059
0060 #include <linux/module.h>
0061 #include <linux/kernel.h>
0062 #include <linux/types.h>
0063 #include <linux/fcntl.h>
0064 #include <linux/interrupt.h>
0065 #include <linux/ioport.h>
0066 #include <linux/in.h>
0067 #include <linux/string.h>
0068 #include <linux/init.h>
0069 #include <linux/crc32.h>
0070 #include <linux/errno.h>
0071 #include <linux/netdevice.h>
0072 #include <linux/etherdevice.h>
0073 #include <linux/skbuff.h>
0074 #include <linux/bitops.h>
0075
0076 #include <asm/io.h>
0077
0078 #include "smc9194.h"
0079
0080 #define DRV_NAME "smc9194"
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092 #ifdef __sh__
0093 #undef USE_32_BIT
0094 #else
0095 #define USE_32_BIT 1
0096 #endif
0097
0098
0099
0100
0101
0102
0103
0104 struct devlist {
0105 unsigned int port;
0106 unsigned int irq;
0107 };
0108
0109 static struct devlist smc_devlist[] __initdata = {
0110 {.port = 0x200, .irq = 0},
0111 {.port = 0x220, .irq = 0},
0112 {.port = 0x240, .irq = 0},
0113 {.port = 0x260, .irq = 0},
0114 {.port = 0x280, .irq = 0},
0115 {.port = 0x2A0, .irq = 0},
0116 {.port = 0x2C0, .irq = 0},
0117 {.port = 0x2E0, .irq = 0},
0118 {.port = 0x300, .irq = 0},
0119 {.port = 0x320, .irq = 0},
0120 {.port = 0x340, .irq = 0},
0121 {.port = 0x360, .irq = 0},
0122 {.port = 0x380, .irq = 0},
0123 {.port = 0x3A0, .irq = 0},
0124 {.port = 0x3C0, .irq = 0},
0125 {.port = 0x3E0, .irq = 0},
0126 {.port = 0, .irq = 0},
0127 };
0128
0129
0130
0131
0132
0133 #define MEMORY_WAIT_TIME 16
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144 #define SMC_DEBUG 0
0145
0146 #if (SMC_DEBUG > 2 )
0147 #define PRINTK3(x) printk x
0148 #else
0149 #define PRINTK3(x)
0150 #endif
0151
0152 #if SMC_DEBUG > 1
0153 #define PRINTK2(x) printk x
0154 #else
0155 #define PRINTK2(x)
0156 #endif
0157
0158 #ifdef SMC_DEBUG
0159 #define PRINTK(x) printk x
0160 #else
0161 #define PRINTK(x)
0162 #endif
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172 #define CARDNAME "SMC9194"
0173
0174
0175
0176 struct smc_local {
0177
0178
0179
0180
0181
0182 struct sk_buff * saved_skb;
0183
0184
0185
0186
0187
0188
0189 int packets_waiting;
0190 };
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208 struct net_device *smc_init(int unit);
0209
0210
0211
0212
0213
0214 static int smc_open(struct net_device *dev);
0215
0216
0217
0218
0219 static void smc_timeout(struct net_device *dev, unsigned int txqueue);
0220
0221
0222
0223
0224
0225
0226 static int smc_close(struct net_device *dev);
0227
0228
0229
0230
0231
0232 static void smc_set_multicast_list(struct net_device *dev);
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244 static irqreturn_t smc_interrupt(int irq, void *);
0245
0246
0247
0248
0249 static inline void smc_rcv( struct net_device *dev );
0250
0251
0252
0253
0254 static inline void smc_tx( struct net_device * dev );
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268 static int smc_probe(struct net_device *dev, int ioaddr);
0269
0270
0271
0272
0273 #if SMC_DEBUG > 2
0274 static void print_packet( byte *, int );
0275 #endif
0276
0277 #define tx_done(dev) 1
0278
0279
0280 static void smc_hardware_send_packet( struct net_device * dev );
0281
0282
0283
0284
0285
0286 static netdev_tx_t smc_wait_to_send_packet( struct sk_buff * skb,
0287 struct net_device *dev );
0288
0289
0290 static void smc_reset( int ioaddr );
0291
0292
0293 static void smc_enable( int ioaddr );
0294
0295
0296 static void smc_shutdown( int ioaddr );
0297
0298
0299
0300 static int smc_findirq( int ioaddr );
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319 static void smc_reset( int ioaddr )
0320 {
0321
0322
0323 SMC_SELECT_BANK( 0 );
0324 outw( RCR_SOFTRESET, ioaddr + RCR );
0325
0326
0327 SMC_DELAY( );
0328
0329
0330
0331 outw( RCR_CLEAR, ioaddr + RCR );
0332 outw( TCR_CLEAR, ioaddr + TCR );
0333
0334
0335
0336
0337 SMC_SELECT_BANK( 1 );
0338 outw( inw( ioaddr + CONTROL ) | CTL_AUTO_RELEASE , ioaddr + CONTROL );
0339
0340
0341 SMC_SELECT_BANK( 2 );
0342 outw( MC_RESET, ioaddr + MMU_CMD );
0343
0344
0345
0346
0347
0348 outb( 0, ioaddr + INT_MASK );
0349 }
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359 static void smc_enable( int ioaddr )
0360 {
0361 SMC_SELECT_BANK( 0 );
0362
0363 outw( TCR_NORMAL, ioaddr + TCR );
0364 outw( RCR_NORMAL, ioaddr + RCR );
0365
0366
0367 SMC_SELECT_BANK( 2 );
0368 outb( SMC_INTERRUPT_MASK, ioaddr + INT_MASK );
0369 }
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385 static void smc_shutdown( int ioaddr )
0386 {
0387
0388 SMC_SELECT_BANK( 2 );
0389 outb( 0, ioaddr + INT_MASK );
0390
0391
0392 SMC_SELECT_BANK( 0 );
0393 outb( RCR_CLEAR, ioaddr + RCR );
0394 outb( TCR_CLEAR, ioaddr + TCR );
0395 #if 0
0396
0397 SMC_SELECT_BANK( 1 );
0398 outw( inw( ioaddr + CONTROL ), CTL_POWERDOWN, ioaddr + CONTROL );
0399 #endif
0400 }
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421 static void smc_setmulticast(int ioaddr, struct net_device *dev)
0422 {
0423 int i;
0424 unsigned char multicast_table[ 8 ];
0425 struct netdev_hw_addr *ha;
0426
0427 unsigned char invert3[] = { 0, 4, 2, 6, 1, 5, 3, 7 };
0428
0429
0430 memset( multicast_table, 0, sizeof( multicast_table ) );
0431
0432 netdev_for_each_mc_addr(ha, dev) {
0433 int position;
0434
0435
0436 position = ether_crc_le(6, ha->addr) & 0x3f;
0437
0438
0439 multicast_table[invert3[position&7]] |=
0440 (1<<invert3[(position>>3)&7]);
0441
0442 }
0443
0444 SMC_SELECT_BANK( 3 );
0445
0446 for ( i = 0; i < 8 ; i++ ) {
0447 outb( multicast_table[i], ioaddr + MULTICAST1 + i );
0448 }
0449 }
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467 static netdev_tx_t smc_wait_to_send_packet(struct sk_buff *skb,
0468 struct net_device *dev)
0469 {
0470 struct smc_local *lp = netdev_priv(dev);
0471 unsigned int ioaddr = dev->base_addr;
0472 word length;
0473 unsigned short numPages;
0474 word time_out;
0475
0476 netif_stop_queue(dev);
0477
0478
0479
0480 if ( lp->saved_skb) {
0481
0482 dev->stats.tx_aborted_errors++;
0483 printk(CARDNAME": Bad Craziness - sent packet while busy.\n" );
0484 return NETDEV_TX_BUSY;
0485 }
0486 lp->saved_skb = skb;
0487
0488 length = skb->len;
0489
0490 if (length < ETH_ZLEN) {
0491 if (skb_padto(skb, ETH_ZLEN)) {
0492 netif_wake_queue(dev);
0493 return NETDEV_TX_OK;
0494 }
0495 length = ETH_ZLEN;
0496 }
0497
0498
0499
0500
0501
0502
0503
0504
0505 numPages = ((length & 0xfffe) + 6) / 256;
0506
0507 if (numPages > 7 ) {
0508 printk(CARDNAME": Far too big packet error.\n");
0509
0510
0511 dev_kfree_skb (skb);
0512 lp->saved_skb = NULL;
0513
0514 netif_wake_queue(dev);
0515 return NETDEV_TX_OK;
0516 }
0517
0518 lp->packets_waiting++;
0519
0520
0521 SMC_SELECT_BANK( 2 );
0522 outw( MC_ALLOC | numPages, ioaddr + MMU_CMD );
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535 time_out = MEMORY_WAIT_TIME;
0536 do {
0537 word status;
0538
0539 status = inb( ioaddr + INTERRUPT );
0540 if ( status & IM_ALLOC_INT ) {
0541
0542 outb( IM_ALLOC_INT, ioaddr + INTERRUPT );
0543 break;
0544 }
0545 } while ( -- time_out );
0546
0547 if ( !time_out ) {
0548
0549 SMC_ENABLE_INT( IM_ALLOC_INT );
0550 PRINTK2((CARDNAME": memory allocation deferred.\n"));
0551
0552 return NETDEV_TX_OK;
0553 }
0554
0555 smc_hardware_send_packet(dev);
0556 netif_wake_queue(dev);
0557 return NETDEV_TX_OK;
0558 }
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574
0575
0576
0577
0578 static void smc_hardware_send_packet( struct net_device * dev )
0579 {
0580 struct smc_local *lp = netdev_priv(dev);
0581 byte packet_no;
0582 struct sk_buff * skb = lp->saved_skb;
0583 word length;
0584 unsigned int ioaddr;
0585 byte * buf;
0586
0587 ioaddr = dev->base_addr;
0588
0589 if ( !skb ) {
0590 PRINTK((CARDNAME": In XMIT with no packet to send\n"));
0591 return;
0592 }
0593 length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
0594 buf = skb->data;
0595
0596
0597 packet_no = inb( ioaddr + PNR_ARR + 1 );
0598 if ( packet_no & 0x80 ) {
0599
0600 netdev_dbg(dev, CARDNAME": Memory allocation failed.\n");
0601 dev_kfree_skb_any(skb);
0602 lp->saved_skb = NULL;
0603 netif_wake_queue(dev);
0604 return;
0605 }
0606
0607
0608 outb( packet_no, ioaddr + PNR_ARR );
0609
0610
0611 outw( PTR_AUTOINC , ioaddr + POINTER );
0612
0613 PRINTK3((CARDNAME": Trying to xmit packet of length %x\n", length));
0614 #if SMC_DEBUG > 2
0615 print_packet( buf, length );
0616 #endif
0617
0618
0619
0620 #ifdef USE_32_BIT
0621 outl( (length +6 ) << 16 , ioaddr + DATA_1 );
0622 #else
0623 outw( 0, ioaddr + DATA_1 );
0624
0625 outb( (length+6) & 0xFF,ioaddr + DATA_1 );
0626 outb( (length+6) >> 8 , ioaddr + DATA_1 );
0627 #endif
0628
0629
0630
0631
0632
0633
0634
0635
0636 #ifdef USE_32_BIT
0637 if ( length & 0x2 ) {
0638 outsl(ioaddr + DATA_1, buf, length >> 2 );
0639 outw( *((word *)(buf + (length & 0xFFFFFFFC))),ioaddr +DATA_1);
0640 }
0641 else
0642 outsl(ioaddr + DATA_1, buf, length >> 2 );
0643 #else
0644 outsw(ioaddr + DATA_1 , buf, (length ) >> 1);
0645 #endif
0646
0647
0648 if ( (length & 1) == 0 ) {
0649 outw( 0, ioaddr + DATA_1 );
0650 } else {
0651 outb( buf[length -1 ], ioaddr + DATA_1 );
0652 outb( 0x20, ioaddr + DATA_1);
0653 }
0654
0655
0656 SMC_ENABLE_INT( (IM_TX_INT | IM_TX_EMPTY_INT) );
0657
0658
0659 outw( MC_ENQUEUE , ioaddr + MMU_CMD );
0660
0661 PRINTK2((CARDNAME": Sent packet of length %d\n", length));
0662
0663 lp->saved_skb = NULL;
0664 dev_kfree_skb_any (skb);
0665
0666 netif_trans_update(dev);
0667
0668
0669 netif_wake_queue(dev);
0670 }
0671
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681
0682
0683
0684
0685
0686 static int io;
0687 static int irq;
0688 static int ifport;
0689
0690 struct net_device * __init smc_init(int unit)
0691 {
0692 struct net_device *dev = alloc_etherdev(sizeof(struct smc_local));
0693 struct devlist *smcdev = smc_devlist;
0694 int err = 0;
0695
0696 if (!dev)
0697 return ERR_PTR(-ENODEV);
0698
0699 if (unit >= 0) {
0700 sprintf(dev->name, "eth%d", unit);
0701 netdev_boot_setup_check(dev);
0702 io = dev->base_addr;
0703 irq = dev->irq;
0704 }
0705
0706 if (io > 0x1ff) {
0707 err = smc_probe(dev, io);
0708 } else if (io != 0) {
0709 err = -ENXIO;
0710 } else {
0711 for (;smcdev->port; smcdev++) {
0712 if (smc_probe(dev, smcdev->port) == 0)
0713 break;
0714 }
0715 if (!smcdev->port)
0716 err = -ENODEV;
0717 }
0718 if (err)
0719 goto out;
0720 err = register_netdev(dev);
0721 if (err)
0722 goto out1;
0723 return dev;
0724 out1:
0725 free_irq(dev->irq, dev);
0726 release_region(dev->base_addr, SMC_IO_EXTENT);
0727 out:
0728 free_netdev(dev);
0729 return ERR_PTR(err);
0730 }
0731
0732
0733
0734
0735
0736
0737
0738
0739 static int __init smc_findirq(int ioaddr)
0740 {
0741 #ifndef NO_AUTOPROBE
0742 int timeout = 20;
0743 unsigned long cookie;
0744
0745
0746 cookie = probe_irq_on();
0747
0748
0749
0750
0751
0752
0753
0754
0755 SMC_SELECT_BANK(2);
0756
0757 outb( IM_ALLOC_INT, ioaddr + INT_MASK );
0758
0759
0760
0761
0762
0763 outw( MC_ALLOC | 1, ioaddr + MMU_CMD );
0764
0765
0766
0767
0768 while ( timeout ) {
0769 byte int_status;
0770
0771 int_status = inb( ioaddr + INTERRUPT );
0772
0773 if ( int_status & IM_ALLOC_INT )
0774 break;
0775 timeout--;
0776 }
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788 SMC_DELAY();
0789 SMC_DELAY();
0790
0791
0792 outb( 0, ioaddr + INT_MASK );
0793
0794
0795 return probe_irq_off(cookie);
0796 #else
0797 struct devlist *smcdev;
0798 for (smcdev = smc_devlist; smcdev->port; smcdev++) {
0799 if (smcdev->port == ioaddr)
0800 return smcdev->irq;
0801 }
0802 return 0;
0803 #endif
0804 }
0805
0806 static const struct net_device_ops smc_netdev_ops = {
0807 .ndo_open = smc_open,
0808 .ndo_stop = smc_close,
0809 .ndo_start_xmit = smc_wait_to_send_packet,
0810 .ndo_tx_timeout = smc_timeout,
0811 .ndo_set_rx_mode = smc_set_multicast_list,
0812 .ndo_set_mac_address = eth_mac_addr,
0813 .ndo_validate_addr = eth_validate_addr,
0814 };
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845 static int __init smc_probe(struct net_device *dev, int ioaddr)
0846 {
0847 int i, memory, retval;
0848 unsigned int bank;
0849
0850 const char *version_string;
0851 const char *if_string;
0852
0853
0854 word revision_register;
0855 word base_address_register;
0856 word configuration_register;
0857 word memory_info_register;
0858 word memory_cfg_register;
0859 u8 addr[ETH_ALEN];
0860
0861
0862 if (!request_region(ioaddr, SMC_IO_EXTENT, DRV_NAME))
0863 return -EBUSY;
0864
0865 dev->irq = irq;
0866 dev->if_port = ifport;
0867
0868
0869 bank = inw( ioaddr + BANK_SELECT );
0870 if ( (bank & 0xFF00) != 0x3300 ) {
0871 retval = -ENODEV;
0872 goto err_out;
0873 }
0874
0875
0876 outw( 0x0, ioaddr + BANK_SELECT );
0877 bank = inw( ioaddr + BANK_SELECT );
0878 if ( (bank & 0xFF00 ) != 0x3300 ) {
0879 retval = -ENODEV;
0880 goto err_out;
0881 }
0882
0883
0884
0885 SMC_SELECT_BANK(1);
0886 base_address_register = inw( ioaddr + BASE );
0887 if ( ioaddr != ( base_address_register >> 3 & 0x3E0 ) ) {
0888 printk(CARDNAME ": IOADDR %x doesn't match configuration (%x). "
0889 "Probably not a SMC chip\n",
0890 ioaddr, base_address_register >> 3 & 0x3E0 );
0891
0892
0893 retval = -ENODEV;
0894 goto err_out;
0895 }
0896
0897
0898
0899
0900 SMC_SELECT_BANK(3);
0901 revision_register = inw( ioaddr + REVISION );
0902 if ( !chip_ids[ ( revision_register >> 4 ) & 0xF ] ) {
0903
0904 printk(CARDNAME ": IO %x: Unrecognized revision register:"
0905 " %x, Contact author.\n", ioaddr, revision_register);
0906
0907 retval = -ENODEV;
0908 goto err_out;
0909 }
0910
0911
0912
0913
0914
0915 pr_info_once("%s\n", version);
0916
0917
0918 dev->base_addr = ioaddr;
0919
0920
0921
0922
0923 SMC_SELECT_BANK( 1 );
0924 for ( i = 0; i < 6; i += 2 ) {
0925 word address;
0926
0927 address = inw( ioaddr + ADDR0 + i );
0928 addr[i + 1] = address >> 8;
0929 addr[i] = address & 0xFF;
0930 }
0931 eth_hw_addr_set(dev, addr);
0932
0933
0934
0935 SMC_SELECT_BANK( 0 );
0936 memory_info_register = inw( ioaddr + MIR );
0937 memory_cfg_register = inw( ioaddr + MCR );
0938 memory = ( memory_cfg_register >> 9 ) & 0x7;
0939 memory *= 256 * ( memory_info_register & 0xFF );
0940
0941
0942
0943
0944
0945
0946 SMC_SELECT_BANK(3);
0947 revision_register = inw( ioaddr + REVISION );
0948 version_string = chip_ids[ ( revision_register >> 4 ) & 0xF ];
0949 if ( !version_string ) {
0950
0951 retval = -ENODEV;
0952 goto err_out;
0953 }
0954
0955
0956 if ( dev->if_port == 0 ) {
0957 SMC_SELECT_BANK(1);
0958 configuration_register = inw( ioaddr + CONFIG );
0959 if ( configuration_register & CFG_AUI_SELECT )
0960 dev->if_port = 2;
0961 else
0962 dev->if_port = 1;
0963 }
0964 if_string = interfaces[ dev->if_port - 1 ];
0965
0966
0967 smc_reset( ioaddr );
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985 if ( dev->irq < 2 ) {
0986 int trials;
0987
0988 trials = 3;
0989 while ( trials-- ) {
0990 dev->irq = smc_findirq( ioaddr );
0991 if ( dev->irq )
0992 break;
0993
0994 smc_reset( ioaddr );
0995 }
0996 }
0997 if (dev->irq == 0 ) {
0998 printk(CARDNAME": Couldn't autodetect your IRQ. Use irq=xx.\n");
0999 retval = -ENODEV;
1000 goto err_out;
1001 }
1002
1003
1004
1005 netdev_info(dev, "%s(r:%d) at %#3x IRQ:%d INTF:%s MEM:%db ",
1006 version_string, revision_register & 0xF, ioaddr, dev->irq,
1007 if_string, memory);
1008
1009
1010
1011 netdev_info(dev, "ADDR: %pM\n", dev->dev_addr);
1012
1013
1014 retval = request_irq(dev->irq, smc_interrupt, 0, DRV_NAME, dev);
1015 if (retval) {
1016 netdev_warn(dev, "%s: unable to get IRQ %d (irqval=%d).\n",
1017 DRV_NAME, dev->irq, retval);
1018 goto err_out;
1019 }
1020
1021 dev->netdev_ops = &smc_netdev_ops;
1022 dev->watchdog_timeo = HZ/20;
1023
1024 return 0;
1025
1026 err_out:
1027 release_region(ioaddr, SMC_IO_EXTENT);
1028 return retval;
1029 }
1030
1031 #if SMC_DEBUG > 2
1032 static void print_packet( byte * buf, int length )
1033 {
1034 #if 0
1035 print_hex_dump_debug(DRV_NAME, DUMP_PREFIX_OFFSET, 16, 1,
1036 buf, length, true);
1037 #endif
1038 }
1039 #endif
1040
1041
1042
1043
1044
1045
1046
1047
1048 static int smc_open(struct net_device *dev)
1049 {
1050 int ioaddr = dev->base_addr;
1051
1052 int i;
1053
1054
1055 memset(netdev_priv(dev), 0, sizeof(struct smc_local));
1056
1057
1058
1059 smc_reset( ioaddr );
1060 smc_enable( ioaddr );
1061
1062
1063
1064 SMC_SELECT_BANK( 1 );
1065 if ( dev->if_port == 1 ) {
1066 outw( inw( ioaddr + CONFIG ) & ~CFG_AUI_SELECT,
1067 ioaddr + CONFIG );
1068 }
1069 else if ( dev->if_port == 2 ) {
1070 outw( inw( ioaddr + CONFIG ) | CFG_AUI_SELECT,
1071 ioaddr + CONFIG );
1072 }
1073
1074
1075
1076
1077
1078
1079 SMC_SELECT_BANK( 1 );
1080 for ( i = 0; i < 6; i += 2 ) {
1081 word address;
1082
1083 address = dev->dev_addr[ i + 1 ] << 8 ;
1084 address |= dev->dev_addr[ i ];
1085 outw( address, ioaddr + ADDR0 + i );
1086 }
1087
1088 netif_start_queue(dev);
1089 return 0;
1090 }
1091
1092
1093
1094
1095
1096
1097
1098
1099 static void smc_timeout(struct net_device *dev, unsigned int txqueue)
1100 {
1101
1102
1103 netdev_warn(dev, CARDNAME": transmit timed out, %s?\n",
1104 tx_done(dev) ? "IRQ conflict" : "network cable problem");
1105
1106 smc_reset( dev->base_addr );
1107 smc_enable( dev->base_addr );
1108 netif_trans_update(dev);
1109
1110 ((struct smc_local *)netdev_priv(dev))->saved_skb = NULL;
1111 netif_wake_queue(dev);
1112 }
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126 static void smc_rcv(struct net_device *dev)
1127 {
1128 int ioaddr = dev->base_addr;
1129 int packet_number;
1130 word status;
1131 word packet_length;
1132
1133
1134
1135 packet_number = inw( ioaddr + FIFO_PORTS );
1136
1137 if ( packet_number & FP_RXEMPTY ) {
1138
1139 PRINTK((CARDNAME ": WARNING: smc_rcv with nothing on FIFO.\n"));
1140
1141 return;
1142 }
1143
1144
1145 outw( PTR_READ | PTR_RCV | PTR_AUTOINC, ioaddr + POINTER );
1146
1147
1148 status = inw( ioaddr + DATA_1 );
1149 packet_length = inw( ioaddr + DATA_1 );
1150
1151 packet_length &= 0x07ff;
1152
1153 PRINTK2(("RCV: STATUS %4x LENGTH %4x\n", status, packet_length ));
1154
1155
1156
1157
1158 packet_length -= 6;
1159
1160 if ( !(status & RS_ERRORS ) ){
1161
1162 struct sk_buff * skb;
1163 byte * data;
1164
1165
1166 if ( status & RS_ODDFRAME )
1167 packet_length++;
1168
1169
1170 if ( status & RS_MULTICAST )
1171 dev->stats.multicast++;
1172
1173 skb = netdev_alloc_skb(dev, packet_length + 5);
1174 if ( skb == NULL ) {
1175 dev->stats.rx_dropped++;
1176 goto done;
1177 }
1178
1179
1180
1181
1182
1183
1184 skb_reserve( skb, 2 );
1185
1186 data = skb_put( skb, packet_length);
1187
1188 #ifdef USE_32_BIT
1189
1190
1191
1192
1193 PRINTK3((" Reading %d dwords (and %d bytes)\n",
1194 packet_length >> 2, packet_length & 3 ));
1195 insl(ioaddr + DATA_1 , data, packet_length >> 2 );
1196
1197 insb( ioaddr + DATA_1, data + (packet_length & 0xFFFFFC),
1198 packet_length & 0x3 );
1199 #else
1200 PRINTK3((" Reading %d words and %d byte(s)\n",
1201 (packet_length >> 1 ), packet_length & 1 ));
1202 insw(ioaddr + DATA_1 , data, packet_length >> 1);
1203 if ( packet_length & 1 ) {
1204 data += packet_length & ~1;
1205 *(data++) = inb( ioaddr + DATA_1 );
1206 }
1207 #endif
1208 #if SMC_DEBUG > 2
1209 print_packet( data, packet_length );
1210 #endif
1211
1212 skb->protocol = eth_type_trans(skb, dev );
1213 netif_rx(skb);
1214 dev->stats.rx_packets++;
1215 dev->stats.rx_bytes += packet_length;
1216 } else {
1217
1218 dev->stats.rx_errors++;
1219
1220 if ( status & RS_ALGNERR ) dev->stats.rx_frame_errors++;
1221 if ( status & (RS_TOOSHORT | RS_TOOLONG ) )
1222 dev->stats.rx_length_errors++;
1223 if ( status & RS_BADCRC) dev->stats.rx_crc_errors++;
1224 }
1225
1226 done:
1227
1228 outw( MC_RELEASE, ioaddr + MMU_CMD );
1229 }
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247 static void smc_tx( struct net_device * dev )
1248 {
1249 int ioaddr = dev->base_addr;
1250 struct smc_local *lp = netdev_priv(dev);
1251 byte saved_packet;
1252 byte packet_no;
1253 word tx_status;
1254
1255
1256
1257
1258 saved_packet = inb( ioaddr + PNR_ARR );
1259 packet_no = inw( ioaddr + FIFO_PORTS );
1260 packet_no &= 0x7F;
1261
1262
1263 outb( packet_no, ioaddr + PNR_ARR );
1264
1265
1266 outw( PTR_AUTOINC | PTR_READ, ioaddr + POINTER );
1267
1268 tx_status = inw( ioaddr + DATA_1 );
1269 PRINTK3((CARDNAME": TX DONE STATUS: %4x\n", tx_status));
1270
1271 dev->stats.tx_errors++;
1272 if ( tx_status & TS_LOSTCAR ) dev->stats.tx_carrier_errors++;
1273 if ( tx_status & TS_LATCOL ) {
1274 netdev_dbg(dev, CARDNAME": Late collision occurred on last xmit.\n");
1275 dev->stats.tx_window_errors++;
1276 }
1277 #if 0
1278 if ( tx_status & TS_16COL ) { ... }
1279 #endif
1280
1281 if ( tx_status & TS_SUCCESS ) {
1282 netdev_info(dev, CARDNAME": Successful packet caused interrupt\n");
1283 }
1284
1285 SMC_SELECT_BANK( 0 );
1286 outw( inw( ioaddr + TCR ) | TCR_ENABLE, ioaddr + TCR );
1287
1288
1289 SMC_SELECT_BANK( 2 );
1290 outw( MC_FREEPKT, ioaddr + MMU_CMD );
1291
1292
1293 lp->packets_waiting--;
1294
1295 outb( saved_packet, ioaddr + PNR_ARR );
1296 }
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311 static irqreturn_t smc_interrupt(int irq, void * dev_id)
1312 {
1313 struct net_device *dev = dev_id;
1314 int ioaddr = dev->base_addr;
1315 struct smc_local *lp = netdev_priv(dev);
1316
1317 byte status;
1318 word card_stats;
1319 byte mask;
1320 int timeout;
1321
1322 word saved_bank;
1323 word saved_pointer;
1324 int handled = 0;
1325
1326
1327 PRINTK3((CARDNAME": SMC interrupt started\n"));
1328
1329 saved_bank = inw( ioaddr + BANK_SELECT );
1330
1331 SMC_SELECT_BANK(2);
1332 saved_pointer = inw( ioaddr + POINTER );
1333
1334 mask = inb( ioaddr + INT_MASK );
1335
1336 outb( 0, ioaddr + INT_MASK );
1337
1338
1339
1340 timeout = 4;
1341
1342 PRINTK2((KERN_WARNING CARDNAME ": MASK IS %x\n", mask));
1343 do {
1344
1345 status = inb( ioaddr + INTERRUPT ) & mask;
1346 if (!status )
1347 break;
1348
1349 handled = 1;
1350
1351 PRINTK3((KERN_WARNING CARDNAME
1352 ": Handling interrupt status %x\n", status));
1353
1354 if (status & IM_RCV_INT) {
1355
1356 PRINTK2((KERN_WARNING CARDNAME
1357 ": Receive Interrupt\n"));
1358 smc_rcv(dev);
1359 } else if (status & IM_TX_INT ) {
1360 PRINTK2((KERN_WARNING CARDNAME
1361 ": TX ERROR handled\n"));
1362 smc_tx(dev);
1363 outb(IM_TX_INT, ioaddr + INTERRUPT );
1364 } else if (status & IM_TX_EMPTY_INT ) {
1365
1366 SMC_SELECT_BANK( 0 );
1367 card_stats = inw( ioaddr + COUNTER );
1368
1369 dev->stats.collisions += card_stats & 0xF;
1370 card_stats >>= 4;
1371
1372 dev->stats.collisions += card_stats & 0xF;
1373
1374
1375
1376 SMC_SELECT_BANK( 2 );
1377 PRINTK2((KERN_WARNING CARDNAME
1378 ": TX_BUFFER_EMPTY handled\n"));
1379 outb( IM_TX_EMPTY_INT, ioaddr + INTERRUPT );
1380 mask &= ~IM_TX_EMPTY_INT;
1381 dev->stats.tx_packets += lp->packets_waiting;
1382 lp->packets_waiting = 0;
1383
1384 } else if (status & IM_ALLOC_INT ) {
1385 PRINTK2((KERN_DEBUG CARDNAME
1386 ": Allocation interrupt\n"));
1387
1388 mask &= ~IM_ALLOC_INT;
1389
1390 smc_hardware_send_packet( dev );
1391
1392
1393 mask |= ( IM_TX_EMPTY_INT | IM_TX_INT );
1394
1395
1396 netif_wake_queue(dev);
1397
1398 PRINTK2((CARDNAME": Handoff done successfully.\n"));
1399 } else if (status & IM_RX_OVRN_INT ) {
1400 dev->stats.rx_errors++;
1401 dev->stats.rx_fifo_errors++;
1402 outb( IM_RX_OVRN_INT, ioaddr + INTERRUPT );
1403 } else if (status & IM_EPH_INT ) {
1404 PRINTK((CARDNAME ": UNSUPPORTED: EPH INTERRUPT\n"));
1405 } else if (status & IM_ERCV_INT ) {
1406 PRINTK((CARDNAME ": UNSUPPORTED: ERCV INTERRUPT\n"));
1407 outb( IM_ERCV_INT, ioaddr + INTERRUPT );
1408 }
1409 } while ( timeout -- );
1410
1411
1412
1413 SMC_SELECT_BANK( 2 );
1414 outb( mask, ioaddr + INT_MASK );
1415
1416 PRINTK3((KERN_WARNING CARDNAME ": MASK is now %x\n", mask));
1417 outw( saved_pointer, ioaddr + POINTER );
1418
1419 SMC_SELECT_BANK( saved_bank );
1420
1421 PRINTK3((CARDNAME ": Interrupt done\n"));
1422 return IRQ_RETVAL(handled);
1423 }
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434 static int smc_close(struct net_device *dev)
1435 {
1436 netif_stop_queue(dev);
1437
1438 smc_shutdown( dev->base_addr );
1439
1440
1441 return 0;
1442 }
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452 static void smc_set_multicast_list(struct net_device *dev)
1453 {
1454 short ioaddr = dev->base_addr;
1455
1456 SMC_SELECT_BANK(0);
1457 if ( dev->flags & IFF_PROMISC )
1458 outw( inw(ioaddr + RCR ) | RCR_PROMISC, ioaddr + RCR );
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469 else if (dev->flags & IFF_ALLMULTI)
1470 outw( inw(ioaddr + RCR ) | RCR_ALMUL, ioaddr + RCR );
1471
1472
1473
1474
1475 else if (!netdev_mc_empty(dev)) {
1476
1477
1478
1479 outw( inw( ioaddr + RCR ) & ~(RCR_PROMISC | RCR_ALMUL),
1480 ioaddr + RCR );
1481
1482
1483 smc_setmulticast(ioaddr, dev);
1484 }
1485 else {
1486 outw( inw( ioaddr + RCR ) & ~(RCR_PROMISC | RCR_ALMUL),
1487 ioaddr + RCR );
1488
1489
1490
1491
1492
1493 SMC_SELECT_BANK( 3 );
1494 outw( 0, ioaddr + MULTICAST1 );
1495 outw( 0, ioaddr + MULTICAST2 );
1496 outw( 0, ioaddr + MULTICAST3 );
1497 outw( 0, ioaddr + MULTICAST4 );
1498 }
1499 }
1500
1501 #ifdef MODULE
1502
1503 static struct net_device *devSMC9194;
1504 MODULE_LICENSE("GPL");
1505
1506 module_param_hw(io, int, ioport, 0);
1507 module_param_hw(irq, int, irq, 0);
1508 module_param(ifport, int, 0);
1509 MODULE_PARM_DESC(io, "SMC 99194 I/O base address");
1510 MODULE_PARM_DESC(irq, "SMC 99194 IRQ number");
1511 MODULE_PARM_DESC(ifport, "SMC 99194 interface port (0-default, 1-TP, 2-AUI)");
1512
1513 static int __init smc_init_module(void)
1514 {
1515 if (io == 0)
1516 printk(KERN_WARNING
1517 CARDNAME": You shouldn't use auto-probing with insmod!\n" );
1518
1519
1520 devSMC9194 = smc_init(-1);
1521 return PTR_ERR_OR_ZERO(devSMC9194);
1522 }
1523 module_init(smc_init_module);
1524
1525 static void __exit smc_cleanup_module(void)
1526 {
1527 unregister_netdev(devSMC9194);
1528 free_irq(devSMC9194->irq, devSMC9194);
1529 release_region(devSMC9194->base_addr, SMC_IO_EXTENT);
1530 free_netdev(devSMC9194);
1531 }
1532 module_exit(smc_cleanup_module);
1533
1534 #endif