00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 static const char *rcsid = "$Id: sk_g16.c,v 1.1 1994/06/30 16:25:15 root Exp $";
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 #include <linux/kernel.h>
00059 #include <linux/sched.h>
00060 #include <linux/ptrace.h>
00061 #include <linux/fcntl.h>
00062 #include <linux/ioport.h>
00063 #include <linux/interrupt.h>
00064 #include <linux/malloc.h>
00065 #include <linux/string.h>
00066 #include <linux/delay.h>
00067 #include <asm/system.h>
00068 #include <asm/io.h>
00069 #include <asm/bitops.h>
00070 #include <linux/errno.h>
00071 #include <linux/init.h>
00072
00073 #include <linux/netdevice.h>
00074 #include <linux/etherdevice.h>
00075 #include <linux/skbuff.h>
00076
00077 #include "sk_g16.h"
00078
00079
00080
00081
00082
00083
00084 #define SK_NAME "SK_G16"
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 #define SK_BOOT_ROM 1
00111
00112 #define SK_ADDR 0xcc000
00113
00114
00115
00116
00117
00118
00119
00120 #define POS_ADDR (rom_addr>>14)
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 #define SK_IO_PORTS { 0x100, 0x180, 0x208, 0x220, 0x288, 0x320, 0x328, 0x390, 0 }
00138
00139 #define SK_IRQS { 3, 5, 9, 11, 0 }
00140
00141 #define SK_BOOT_ROM_LOCATIONS { 0xc0000, 0xc4000, 0xc8000, 0xcc000, 0xd0000, 0xd4000, 0xd8000, 0xdc000, 0 }
00142
00143 #define SK_BOOT_ROM_ID { 0x55, 0xaa, 0x10, 0x50, 0x06, 0x33 }
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 #define SK_POS_SIZE 8
00158
00159 #define SK_POS0 ioaddr
00160 #define SK_POS1 ioaddr+1
00161 #define SK_POS2 ioaddr+2
00162 #define SK_POS3 ioaddr+3
00163 #define SK_POS4 ioaddr+4
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 #define SK_MAC0 0x00
00178 #define SK_MAC1 0x00
00179 #define SK_MAC2 0x5a
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191 #define SK_IDLOW 0xfd
00192 #define SK_IDHIGH 0x6a
00193
00194
00195
00196
00197
00198
00199
00200 #define SK_ROM_RAM_ON (POS2_CARD)
00201 #define SK_ROM_RAM_OFF (POS2_EPROM)
00202 #define SK_ROM_ON (inb(SK_POS2) & POS2_CARD)
00203 #define SK_ROM_OFF (inb(SK_POS2) | POS2_EPROM)
00204 #define SK_RAM_ON (inb(SK_POS2) | POS2_CARD)
00205 #define SK_RAM_OFF (inb(SK_POS2) & POS2_EPROM)
00206
00207 #define POS2_CARD 0x0001
00208 #define POS2_EPROM 0x0002
00209
00210
00211
00212
00213
00214
00215
00216 #define SK_IOREG (board->ioreg)
00217 #define SK_PORT (board->port)
00218 #define SK_IOCOM (board->iocom)
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 #define SK_IORUN 0x20
00232
00233
00234
00235
00236
00237 #define SK_IRQ 0x10
00238
00239 #define SK_RESET 0x08
00240 #define SK_RW 0x02
00241 #define SK_ADR 0x01
00242
00243
00244 #define SK_RREG SK_RW
00245 #define SK_WREG 0
00246 #define SK_RAP SK_ADR
00247 #define SK_RDATA 0
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259 #define SK_DOIO 0x80
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279 #define CSR0 0x00
00280 #define CSR1 0x01
00281 #define CSR2 0x02
00282 #define CSR3 0x03
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297 #define LC_LOG_TX_BUFFERS 1
00298 #define LC_LOG_RX_BUFFERS 3
00299
00300
00301
00302 #define TMDNUM (1 << (LC_LOG_TX_BUFFERS))
00303 #define RMDNUM (1 << (LC_LOG_RX_BUFFERS))
00304
00305
00306
00307 #define TMDNUMMASK (LC_LOG_TX_BUFFERS << 29)
00308 #define RMDNUMMASK (LC_LOG_RX_BUFFERS << 29)
00309
00310
00311
00312
00313
00314 #define PKT_BUF_SZ 1518
00315
00316
00317
00318
00319
00320 #define ETHERCARD_TOTAL_SIZE SK_POS_SIZE
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350 #undef SK_DEBUG
00351 #undef SK_DEBUG2
00352
00353 #ifdef SK_DEBUG
00354 #define PRINTK(x) printk x
00355 #else
00356 #define PRINTK(x)
00357 #endif
00358
00359 #ifdef SK_DEBUG2
00360 #define PRINTK2(x) printk x
00361 #else
00362 #define PRINTK2(x)
00363 #endif
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399 typedef struct
00400 {
00401 unsigned char ram[0x3fc0];
00402 unsigned char rom[0x0020];
00403 unsigned char res1[0x0010];
00404 unsigned volatile short ioreg;
00405 unsigned volatile char port;
00406 unsigned char iocom;
00407 } SK_RAM;
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423 struct SK_ram
00424 {
00425 struct init_block ib;
00426 struct tmd tmde[TMDNUM];
00427 struct rmd rmde[RMDNUM];
00428 char tmdbuf[TMDNUM][PKT_BUF_SZ];
00429 char rmdbuf[RMDNUM][PKT_BUF_SZ];
00430 };
00431
00432
00433
00434
00435
00436
00437 struct priv
00438 {
00439 struct SK_ram *ram;
00440 struct rmd *rmdhead;
00441 struct tmd *tmdhead;
00442 int rmdnum;
00443 int tmdnum;
00444 int tmdlast;
00445 void *rmdbufs[RMDNUM];
00446 void *tmdbufs[TMDNUM];
00447 struct net_device_stats stats;
00448 };
00449
00450
00451
00452
00453
00454
00455
00456 static SK_RAM *board;
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469 int SK_init(struct device *dev);
00470 static int SK_probe(struct device *dev, short ioaddr);
00471
00472 static int SK_open(struct device *dev);
00473 static int SK_send_packet(struct sk_buff *skb, struct device *dev);
00474 static void SK_interrupt(int irq, void *dev_id, struct pt_regs * regs);
00475 static void SK_rxintr(struct device *dev);
00476 static void SK_txintr(struct device *dev);
00477 static int SK_close(struct device *dev);
00478
00479 static struct net_device_stats *SK_get_stats(struct device *dev);
00480
00481 unsigned int SK_rom_addr(void);
00482
00483 static void set_multicast_list(struct device *dev);
00484
00485
00486
00487
00488
00489
00490 static int SK_lance_init(struct device *dev, unsigned short mode);
00491 void SK_reset_board(void);
00492 void SK_set_RAP(int reg_number);
00493 int SK_read_reg(int reg_number);
00494 int SK_rread_reg(void);
00495 void SK_write_reg(int reg_number, int value);
00496
00497
00498
00499
00500
00501
00502 void SK_print_pos(struct device *dev, char *text);
00503 void SK_print_dev(struct device *dev, char *text);
00504 void SK_print_ram(struct device *dev);
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534 __initfunc(int SK_init(struct device *dev))
00535 {
00536 int ioaddr = 0;
00537 int *port, ports[] = SK_IO_PORTS;
00538
00539
00540 int base_addr = dev->base_addr;
00541
00542 PRINTK(("%s: %s", SK_NAME, rcsid));
00543 rcsid = NULL;
00544
00545 if (base_addr > 0x0ff)
00546 {
00547
00548
00549 if ( (inb(SK_POS0) == SK_IDLOW) ||
00550 (inb(SK_POS1) == SK_IDHIGH) )
00551 {
00552 return SK_probe(dev, base_addr);
00553 }
00554
00555 return ENODEV;
00556 }
00557 else if (base_addr > 0)
00558 {
00559 return ENXIO;
00560 }
00561
00562
00563
00564 for (port = &ports[0]; *port; port++)
00565 {
00566 ioaddr = *port;
00567
00568
00569
00570 if (check_region(ioaddr, ETHERCARD_TOTAL_SIZE))
00571 {
00572 continue;
00573 }
00574
00575
00576
00577 if ( !(inb(SK_POS0) == SK_IDLOW) ||
00578 !(inb(SK_POS1) == SK_IDHIGH) )
00579 {
00580 continue;
00581 }
00582
00583 dev->base_addr = ioaddr;
00584
00585 if (SK_probe(dev, ioaddr) == 0)
00586 {
00587 return 0;
00588 }
00589 }
00590
00591 dev->base_addr = base_addr;
00592
00593 return ENODEV;
00594
00595 }
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617 __initfunc(int SK_probe(struct device *dev, short ioaddr))
00618 {
00619 int i,j;
00620 int sk_addr_flag = 0;
00621 unsigned int rom_addr;
00622
00623 struct priv *p;
00624
00625 if (SK_ADDR & 0x3fff || SK_ADDR < 0xa0000)
00626 {
00627
00628 sk_addr_flag = 1;
00629
00630
00631
00632
00633
00634 }
00635
00636 if (SK_BOOT_ROM)
00637 {
00638 PRINTK(("## %s: SK_BOOT_ROM is set.\n", SK_NAME));
00639
00640 rom_addr = SK_rom_addr();
00641
00642 if (rom_addr == 0)
00643 {
00644 if (sk_addr_flag)
00645 {
00646 printk("%s: SK_ADDR %#08x is not valid. Check configuration.\n",
00647 dev->name, SK_ADDR);
00648 return -1;
00649 }
00650
00651 rom_addr = SK_ADDR;
00652
00653 PRINTK(("## %s: NO Bootrom found \n", SK_NAME));
00654
00655 outb(SK_ROM_RAM_OFF, SK_POS2);
00656 outb(POS_ADDR, SK_POS3);
00657 outb(SK_RAM_ON, SK_POS2);
00658 }
00659 else if (rom_addr == SK_ADDR)
00660 {
00661 printk("%s: RAM + ROM are set to the same address %#08x\n"
00662 " Check configuration. Now switching off Boot_ROM\n",
00663 SK_NAME, rom_addr);
00664
00665 outb(SK_ROM_RAM_OFF, SK_POS2);
00666 outb(POS_ADDR, SK_POS3);
00667 outb(SK_RAM_ON, SK_POS2);
00668 }
00669 else
00670 {
00671 PRINTK(("## %s: Found ROM at %#08x\n", SK_NAME, rom_addr));
00672 PRINTK(("## %s: Keeping Boot_ROM on\n", SK_NAME));
00673
00674 if (sk_addr_flag)
00675 {
00676 printk("%s: SK_ADDR %#08x is not valid. Check configuration.\n",
00677 dev->name, SK_ADDR);
00678 return -1;
00679 }
00680
00681 rom_addr = SK_ADDR;
00682
00683 outb(SK_ROM_RAM_OFF, SK_POS2);
00684 outb(POS_ADDR, SK_POS3);
00685 outb(SK_ROM_RAM_ON, SK_POS2);
00686 }
00687 }
00688 else
00689 {
00690 PRINTK(("## %s: SK_BOOT_ROM is not set.\n", SK_NAME));
00691
00692 if (sk_addr_flag)
00693 {
00694 printk("%s: SK_ADDR %#08x is not valid. Check configuration.\n",
00695 dev->name, SK_ADDR);
00696 return -1;
00697 }
00698
00699 rom_addr = SK_rom_addr();
00700
00701
00702
00703 outb(SK_ROM_RAM_OFF, SK_POS2);
00704
00705
00706
00707
00708
00709 if (rom_addr)
00710 {
00711 printk("%s: We found Boot_ROM at %#08x. Now setting RAM on"
00712 "that address\n", SK_NAME, rom_addr);
00713
00714 outb(POS_ADDR, SK_POS3);
00715 }
00716 else
00717 {
00718 if (sk_addr_flag)
00719 {
00720 printk("%s: SK_ADDR %#08x is not valid. Check configuration.\n",
00721 dev->name, SK_ADDR);
00722 return -1;
00723 }
00724
00725 rom_addr = SK_ADDR;
00726
00727 outb(POS_ADDR, SK_POS3);
00728 }
00729 outb(SK_RAM_ON, SK_POS2);
00730 }
00731
00732 #ifdef SK_DEBUG
00733 SK_print_pos(dev, "POS registers after ROM, RAM config");
00734 #endif
00735
00736 board = (SK_RAM *) bus_to_virt(rom_addr);
00737
00738
00739 for (i = 0, j = 0; i < ETH_ALEN; i++, j+=2)
00740 {
00741 dev->dev_addr[i] = readb(board->rom+j);
00742 }
00743
00744
00745 if (!(dev->dev_addr[0] == SK_MAC0 &&
00746 dev->dev_addr[1] == SK_MAC1 &&
00747 dev->dev_addr[2] == SK_MAC2) )
00748 {
00749 PRINTK(("## %s: We did not find SK_G16 at RAM location.\n",
00750 SK_NAME));
00751 return ENODEV;
00752 }
00753
00754 printk("%s: %s found at %#3x, HW addr: %#04x:%02x:%02x:%02x:%02x:%02x\n",
00755 dev->name,
00756 "Schneider & Koch Netcard",
00757 (unsigned int) dev->base_addr,
00758 dev->dev_addr[0],
00759 dev->dev_addr[1],
00760 dev->dev_addr[2],
00761 dev->dev_addr[3],
00762 dev->dev_addr[4],
00763 dev->dev_addr[5]);
00764
00765
00766 p = dev->priv = (void *) kmalloc(sizeof(struct priv), GFP_KERNEL);
00767 if (p == NULL) {
00768 printk("%s: ERROR - no memory for driver data!\n", dev->name);
00769 return -ENOMEM;
00770 }
00771 memset((char *) dev->priv, 0, sizeof(struct priv));
00772
00773
00774 request_region(ioaddr, ETHERCARD_TOTAL_SIZE,"sk_g16");
00775
00776
00777
00778 dev->open = &SK_open;
00779 dev->stop = &SK_close;
00780 dev->hard_start_xmit = &SK_send_packet;
00781 dev->get_stats = &SK_get_stats;
00782 dev->set_multicast_list = &set_multicast_list;
00783
00784
00785
00786
00787 ether_setup(dev);
00788
00789 dev->flags &= ~IFF_MULTICAST;
00790
00791
00792
00793 p->ram = (struct SK_ram *) rom_addr;
00794 p->tmdhead = &(p->ram)->tmde[0];
00795 p->rmdhead = &(p->ram)->rmde[0];
00796
00797
00798
00799 for (i = 0; i < TMDNUM; i++)
00800 {
00801 p->tmdbufs[i] = &(p->ram)->tmdbuf[i];
00802 }
00803
00804 for (i = 0; i < RMDNUM; i++)
00805 {
00806 p->rmdbufs[i] = &(p->ram)->rmdbuf[i];
00807 }
00808
00809 #ifdef SK_DEBUG
00810 SK_print_pos(dev, "End of SK_probe");
00811 SK_print_ram(dev);
00812 #endif
00813
00814 return 0;
00815
00816 }
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843 static int SK_open(struct device *dev)
00844 {
00845 int i = 0;
00846 int irqval = 0;
00847 int ioaddr = dev->base_addr;
00848
00849 int irqtab[] = SK_IRQS;
00850
00851 struct priv *p = (struct priv *)dev->priv;
00852
00853 PRINTK(("## %s: At beginning of SK_open(). CSR0: %#06x\n",
00854 SK_NAME, SK_read_reg(CSR0)));
00855
00856 if (dev->irq == 0)
00857 {
00858 i = 0;
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869 do
00870 {
00871 irqval = request_irq(irqtab[i], &SK_interrupt, 0, "sk_g16", dev);
00872 i++;
00873 } while (irqval && irqtab[i]);
00874
00875 if (irqval)
00876 {
00877 printk("%s: unable to get an IRQ\n", dev->name);
00878 return -EAGAIN;
00879 }
00880
00881 dev->irq = irqtab[--i];
00882
00883 outb(i<<2, SK_POS4);
00884
00885 }
00886 else if (dev->irq == 2)
00887 {
00888 if (request_irq(9, &SK_interrupt, 0, "sk_g16", dev))
00889 {
00890 printk("%s: unable to get IRQ 9\n", dev->name);
00891 return -EAGAIN;
00892 }
00893 dev->irq = 9;
00894
00895
00896
00897
00898
00899
00900 outb(0x08, SK_POS4);
00901
00902 }
00903 else
00904 {
00905 int i = 0;
00906
00907
00908
00909 if (request_irq(dev->irq, &SK_interrupt, 0, "sk_g16", dev))
00910 {
00911 printk("%s: unable to get selected IRQ\n", dev->name);
00912 return -EAGAIN;
00913 }
00914
00915 switch(dev->irq)
00916 {
00917 case 3: i = 0;
00918 break;
00919 case 5: i = 1;
00920 break;
00921 case 2: i = 2;
00922 break;
00923 case 11:i = 3;
00924 break;
00925 default:
00926 printk("%s: Preselected IRQ %d is invalid for %s boards",
00927 dev->name,
00928 dev->irq,
00929 SK_NAME);
00930 return -EAGAIN;
00931 }
00932
00933 outb(i<<2, SK_POS4);
00934 }
00935
00936 printk("%s: Schneider & Koch G16 at %#3x, IRQ %d, shared mem at %#08x\n",
00937 dev->name, (unsigned int)dev->base_addr,
00938 (int) dev->irq, (unsigned int) p->ram);
00939
00940 if (!(i = SK_lance_init(dev, 0)))
00941 {
00942
00943
00944 dev->tbusy = 0;
00945 dev->interrupt = 0;
00946 dev->start = 1;
00947
00948 #ifdef SK_DEBUG
00949
00950
00951
00952
00953
00954
00955
00956 printk("## %s: After lance init. CSR0: %#06x\n",
00957 SK_NAME, SK_read_reg(CSR0));
00958 SK_write_reg(CSR0, CSR0_STOP);
00959 printk("## %s: LANCE stopped. CSR0: %#06x\n",
00960 SK_NAME, SK_read_reg(CSR0));
00961 SK_lance_init(dev, MODE_DTX | MODE_DRX);
00962 printk("## %s: Reinit with DTX + DRX off. CSR0: %#06x\n",
00963 SK_NAME, SK_read_reg(CSR0));
00964 SK_write_reg(CSR0, CSR0_STOP);
00965 printk("## %s: LANCE stopped. CSR0: %#06x\n",
00966 SK_NAME, SK_read_reg(CSR0));
00967 SK_lance_init(dev, MODE_NORMAL);
00968 printk("## %s: LANCE back to normal mode. CSR0: %#06x\n",
00969 SK_NAME, SK_read_reg(CSR0));
00970 SK_print_pos(dev, "POS regs before returning OK");
00971
00972 #endif
00973
00974 return 0;
00975 }
00976 else
00977 {
00978
00979 PRINTK(("## %s: LANCE init failed: CSR0: %#06x\n",
00980 SK_NAME, SK_read_reg(CSR0)));
00981
00982 dev->start = 0;
00983 return -EAGAIN;
00984 }
00985
00986 }
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006 static int SK_lance_init(struct device *dev, unsigned short mode)
01007 {
01008 int i;
01009 unsigned long flags;
01010 struct priv *p = (struct priv *) dev->priv;
01011 struct tmd *tmdp;
01012 struct rmd *rmdp;
01013
01014 PRINTK(("## %s: At beginning of LANCE init. CSR0: %#06x\n",
01015 SK_NAME, SK_read_reg(CSR0)));
01016
01017
01018 SK_reset_board();
01019
01020
01021 p->tmdnum = 0;
01022 p->tmdlast = 0;
01023
01024 for (i = 0; i < TMDNUM; i++)
01025 {
01026 tmdp = p->tmdhead + i;
01027
01028 writel((unsigned long) p->tmdbufs[i], tmdp->u.buffer);
01029
01030
01031 writeb(TX_STP | TX_ENP, tmdp->u.s.status);
01032 }
01033
01034
01035
01036
01037 p->rmdnum = 0;
01038
01039 for (i = 0; i < RMDNUM; i++)
01040 {
01041 rmdp = p->rmdhead + i;
01042
01043
01044 writel((unsigned long) p->rmdbufs[i], rmdp->u.buffer);
01045
01046
01047
01048
01049
01050
01051 writeb(RX_OWN, rmdp->u.s.status);
01052
01053 writew(-PKT_BUF_SZ, rmdp->blen);
01054
01055 writeb(0, rmdp->mlen);
01056
01057 }
01058
01059
01060
01061 writew(mode, (p->ram)->ib.mode);
01062
01063 for (i = 0; i < ETH_ALEN; i++)
01064 {
01065 writeb(dev->dev_addr[i], (p->ram)->ib.paddr[i]);
01066 }
01067
01068 for (i = 0; i < 8; i++)
01069 {
01070 writeb(0, (p->ram)->ib.laddr[i]);
01071 }
01072
01073
01074
01075 writel((int)p->rmdhead | RMDNUMMASK, (p->ram)->ib.rdrp);
01076 writel((int)p->tmdhead | TMDNUMMASK, (p->ram)->ib.tdrp);
01077
01078
01079
01080 save_flags(flags);
01081 cli();
01082
01083 SK_write_reg(CSR3, CSR3_ACON);
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100 SK_write_reg(CSR1, 0);
01101 SK_write_reg(CSR2, 0);
01102
01103
01104 PRINTK(("## %s: After setting CSR1-3. CSR0: %#06x\n",
01105 SK_NAME, SK_read_reg(CSR0)));
01106
01107
01108
01109
01110
01111
01112
01113
01114 SK_write_reg(CSR0, CSR0_INIT);
01115
01116 restore_flags(flags);
01117
01118
01119
01120 SK_set_RAP(CSR0);
01121
01122 for (i = 0; (i < 100) && !(SK_rread_reg() & CSR0_IDON); i++)
01123 ;
01124
01125 if (i >= 100)
01126 {
01127 printk("%s: can't init am7990, status: %04x "
01128 "init_block: %#08x\n",
01129 dev->name, (int) SK_read_reg(CSR0),
01130 (unsigned int) &(p->ram)->ib);
01131
01132 #ifdef SK_DEBUG
01133 SK_print_pos(dev, "LANCE INIT failed");
01134 SK_print_dev(dev,"Device Structure:");
01135 #endif
01136
01137 return -1;
01138 }
01139
01140 PRINTK(("## %s: init done after %d ticks\n", SK_NAME, i));
01141
01142
01143
01144 SK_write_reg(CSR0, CSR0_IDON | CSR0_INEA | CSR0_STRT);
01145
01146 PRINTK(("## %s: LANCE started. CSR0: %#06x\n", SK_NAME,
01147 SK_read_reg(CSR0)));
01148
01149 return 0;
01150
01151 }
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174 static int SK_send_packet(struct sk_buff *skb, struct device *dev)
01175 {
01176 struct priv *p = (struct priv *) dev->priv;
01177 struct tmd *tmdp;
01178 static char pad[64];
01179
01180 if (dev->tbusy)
01181 {
01182
01183
01184 int tickssofar = jiffies - dev->trans_start;
01185 if (tickssofar < 15)
01186 {
01187 return 1;
01188 }
01189
01190 printk("%s: xmitter timed out, try to restart!\n", dev->name);
01191
01192 SK_lance_init(dev, MODE_NORMAL);
01193
01194 dev->tbusy = 0;
01195
01196 dev->trans_start = jiffies;
01197
01198 }
01199
01200 PRINTK2(("## %s: SK_send_packet() called, CSR0 %#04x.\n",
01201 SK_NAME, SK_read_reg(CSR0)));
01202
01203
01204
01205
01206
01207
01208
01209 if (test_and_set_bit(0, (void *) &dev->tbusy) != 0)
01210 {
01211 printk("%s: Transmitter access conflict.\n", dev->name);
01212 }
01213 else
01214 {
01215
01216 short len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
01217
01218 tmdp = p->tmdhead + p->tmdnum;
01219
01220
01221
01222
01223
01224 memcpy_toio((tmdp->u.buffer & 0x00ffffff), skb->data, skb->len);
01225 if(len != skb->len)
01226 memcpy_toio((tmdp->u.buffer & 0x00ffffff) + skb->len, pad, len-skb->len);
01227
01228 writew(-len, tmdp->blen);
01229
01230
01231
01232
01233
01234
01235
01236 writeb(TX_OWN | TX_STP | TX_ENP, tmdp->u.s.status);
01237
01238
01239 SK_write_reg(CSR0, CSR0_TDMD | CSR0_INEA);
01240
01241 dev->trans_start = jiffies;
01242
01243
01244 p->tmdnum++;
01245 p->tmdnum &= TMDNUM-1;
01246
01247
01248 if (! (readb((p->tmdhead + p->tmdnum)->u.s.status) & TX_OWN) )
01249 {
01250
01251
01252
01253
01254 dev->tbusy = 0;
01255 }
01256
01257 p->stats.tx_bytes += skb->len;
01258 }
01259 dev_kfree_skb(skb);
01260 return 0;
01261 }
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280
01281 static void SK_interrupt(int irq, void *dev_id, struct pt_regs * regs)
01282 {
01283 int csr0;
01284 struct device *dev = dev_id;
01285 struct priv *p = (struct priv *) dev->priv;
01286
01287
01288 PRINTK2(("## %s: SK_interrupt(). status: %#06x\n",
01289 SK_NAME, SK_read_reg(CSR0)));
01290
01291 if (dev == NULL)
01292 {
01293 printk("SK_interrupt(): IRQ %d for unknown device.\n", irq);
01294 }
01295
01296
01297 if (dev->interrupt)
01298 {
01299 printk("%s: Re-entering the interrupt handler.\n", dev->name);
01300 }
01301
01302 csr0 = SK_read_reg(CSR0);
01303
01304 dev->interrupt = 1;
01305
01306
01307
01308
01309
01310
01311 SK_write_reg(CSR0, csr0 & CSR0_CLRALL);
01312
01313 if (csr0 & CSR0_ERR)
01314 {
01315 printk("%s: error: %04x\n", dev->name, csr0);
01316
01317 if (csr0 & CSR0_MISS)
01318 {
01319 p->stats.rx_dropped++;
01320 }
01321 }
01322
01323 if (csr0 & CSR0_RINT)
01324 {
01325 SK_rxintr(dev);
01326 }
01327
01328 if (csr0 & CSR0_TINT)
01329 {
01330 SK_txintr(dev);
01331 }
01332
01333 SK_write_reg(CSR0, CSR0_INEA);
01334
01335 dev->interrupt = 0;
01336 }
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356 static void SK_txintr(struct device *dev)
01357 {
01358 int tmdstat;
01359 struct tmd *tmdp;
01360 struct priv *p = (struct priv *) dev->priv;
01361
01362
01363 PRINTK2(("## %s: SK_txintr() status: %#06x\n",
01364 SK_NAME, SK_read_reg(CSR0)));
01365
01366 tmdp = p->tmdhead + p->tmdlast;
01367
01368
01369 p->tmdlast++;
01370 p->tmdlast &= TMDNUM-1;
01371
01372 tmdstat = readb(tmdp->u.s.status);
01373
01374
01375
01376
01377
01378 if (tmdstat & TX_ERR)
01379 {
01380 int stat2 = readw(tmdp->status2);
01381
01382 printk("%s: TX error: %04x %04x\n", dev->name, tmdstat, stat2);
01383
01384 if (stat2 & TX_TDR)
01385 {
01386 printk("%s: tdr-problems \n", dev->name);
01387 }
01388
01389 if (stat2 & TX_RTRY)
01390 p->stats.tx_aborted_errors++;
01391 if (stat2 & TX_LCOL)
01392 p->stats.tx_window_errors++;
01393 if (stat2 & TX_LCAR)
01394 p->stats.tx_carrier_errors++;
01395 if (stat2 & TX_UFLO)
01396 {
01397 p->stats.tx_fifo_errors++;
01398
01399
01400
01401
01402
01403
01404 SK_lance_init(dev, MODE_NORMAL);
01405 }
01406
01407 p->stats.tx_errors++;
01408
01409 writew(0, tmdp->status2);
01410 }
01411 else if (tmdstat & TX_MORE)
01412 {
01413
01414
01415
01416
01417
01418
01419
01420
01421
01422
01423
01424
01425 p->stats.collisions++;
01426 }
01427 else
01428 {
01429 p->stats.tx_packets++;
01430 }
01431
01432
01433
01434
01435
01436
01437
01438 dev->tbusy = 0;
01439
01440
01441
01442
01443
01444
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456 mark_bh(NET_BH);
01457
01458 }
01459
01460
01461
01462
01463
01464
01465
01466
01467
01468
01469
01470
01471
01472
01473
01474
01475
01476 static void SK_rxintr(struct device *dev)
01477 {
01478
01479 struct rmd *rmdp;
01480 int rmdstat;
01481 struct priv *p = (struct priv *) dev->priv;
01482
01483 PRINTK2(("## %s: SK_rxintr(). CSR0: %#06x\n",
01484 SK_NAME, SK_read_reg(CSR0)));
01485
01486 rmdp = p->rmdhead + p->rmdnum;
01487
01488
01489
01490
01491
01492 while (!( (rmdstat = readb(rmdp->u.s.status)) & RX_OWN))
01493 {
01494
01495
01496
01497
01498
01499
01500
01501
01502 if ((rmdstat & (RX_STP | RX_ENP)) != (RX_STP | RX_ENP))
01503 {
01504
01505
01506 if (rmdstat & RX_STP)
01507 {
01508 p->stats.rx_errors++;
01509 p->stats.rx_length_errors++;
01510
01511 printk("%s: packet too long\n", dev->name);
01512 }
01513
01514
01515
01516
01517
01518
01519
01520
01521
01522 writeb(RX_OWN, rmdp->u.s.status);
01523
01524 }
01525 else if (rmdstat & RX_ERR)
01526 {
01527 printk("%s: RX error: %04x\n", dev->name, (int) rmdstat);
01528
01529 p->stats.rx_errors++;
01530
01531 if (rmdstat & RX_FRAM) p->stats.rx_frame_errors++;
01532 if (rmdstat & RX_CRC) p->stats.rx_crc_errors++;
01533
01534 writeb(RX_OWN, rmdp->u.s.status);
01535
01536 }
01537 else
01538 {
01539
01540 int len = readw(rmdp->mlen) & 0x0fff;
01541 struct sk_buff *skb;
01542
01543 skb = dev_alloc_skb(len+2);
01544
01545 if (skb == NULL)
01546 {
01547
01548
01549
01550