00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
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
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
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
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 static const char *version = "depca.c:v0.51 1999/6/27 davies@maniac.ultranet.com\n";
00231
00232 #include <linux/config.h>
00233 #include <linux/module.h>
00234
00235 #include <linux/kernel.h>
00236 #include <linux/sched.h>
00237 #include <linux/string.h>
00238 #include <linux/ptrace.h>
00239 #include <linux/errno.h>
00240 #include <linux/ioport.h>
00241 #include <linux/malloc.h>
00242 #include <linux/interrupt.h>
00243 #include <linux/delay.h>
00244 #include <linux/init.h>
00245 #include <asm/uaccess.h>
00246 #include <asm/bitops.h>
00247 #include <asm/io.h>
00248 #include <asm/dma.h>
00249
00250 #include <linux/netdevice.h>
00251 #include <linux/etherdevice.h>
00252 #include <linux/skbuff.h>
00253
00254 #include <linux/time.h>
00255 #include <linux/types.h>
00256 #include <linux/unistd.h>
00257 #include <linux/ctype.h>
00258
00259 #ifdef CONFIG_MCA
00260 #include <linux/mca.h>
00261 #endif
00262
00263 #include "depca.h"
00264
00265 #ifdef DEPCA_DEBUG
00266 static int depca_debug = DEPCA_DEBUG;
00267 #else
00268 static int depca_debug = 1;
00269 #endif
00270
00271 #define DEPCA_NDA 0xffe0
00272
00273
00274
00275
00276 #define PROBE_LENGTH 32
00277 #define ETH_PROM_SIG 0xAA5500FFUL
00278
00279
00280
00281
00282
00283
00284
00285
00286 #define NUM_RX_DESC 8
00287 #define NUM_TX_DESC 8
00288 #define RX_BUFF_SZ 1536
00289 #define TX_BUFF_SZ 1536
00290
00291 #define CRC_POLYNOMIAL_BE 0x04c11db7UL
00292 #define CRC_POLYNOMIAL_LE 0xedb88320UL
00293
00294
00295
00296
00297 #define DEPCA_EISA_IO_PORTS 0x0c00
00298 #define MAX_EISA_SLOTS 16
00299 #define EISA_SLOT_INC 0x1000
00300
00301
00302
00303
00304 #define DEPCA_RAM_BASE_ADDRESSES {0xc0000,0xd0000,0xe0000,0x00000}
00305 #define DEPCA_IO_PORTS {0x300, 0x200, 0}
00306 #define DEPCA_TOTAL_SIZE 0x10
00307 static short mem_chkd = 0;
00308
00309
00310
00311
00312 #define DE212_ID 0x6def
00313
00314
00315
00316
00317 #define DEPCA_SIGNATURE {"DEPCA",\
00318 "DE100","DE101",\
00319 "DE200","DE201","DE202",\
00320 "DE210","DE212",\
00321 "DE422",\
00322 ""}
00323 static enum {
00324 DEPCA, de100, de101, de200, de201, de202, de210, de212, de422, unknown
00325 } adapter;
00326
00327
00328
00329
00330 #define DEPCA_STRLEN 16
00331 #define MAX_NUM_DEPCAS 2
00332
00333
00334
00335
00336
00337
00338
00339 #define ALIGN4 ((u_long)4 - 1)
00340 #define ALIGN8 ((u_long)8 - 1)
00341 #define ALIGN ALIGN8
00342
00343
00344
00345
00346 struct depca_rx_desc {
00347 volatile s32 base;
00348 s16 buf_length;
00349 s16 msg_length;
00350 };
00351
00352 struct depca_tx_desc {
00353 volatile s32 base;
00354 s16 length;
00355 s16 misc;
00356 };
00357
00358 #define LA_MASK 0x0000ffff
00359
00360
00361
00362
00363
00364 struct depca_init {
00365 u16 mode;
00366 u8 phys_addr[ETH_ALEN];
00367 u8 mcast_table[8];
00368 u32 rx_ring;
00369 u32 tx_ring;
00370 };
00371
00372 #define DEPCA_PKT_STAT_SZ 16
00373 #define DEPCA_PKT_BIN_SZ 128
00374
00375 struct depca_private {
00376 char devname[DEPCA_STRLEN];
00377 char adapter_name[DEPCA_STRLEN];
00378 char adapter;
00379 char mca_slot;
00380 struct depca_rx_desc *rx_ring;
00381 struct depca_tx_desc *tx_ring;
00382 struct depca_init init_block;
00383 char *rx_memcpy[NUM_RX_DESC];
00384 char *tx_memcpy[NUM_TX_DESC];
00385 u_long bus_offset;
00386 u_long sh_mem;
00387 u_long dma_buffs;
00388 int rx_new, tx_new;
00389 int rx_old, tx_old;
00390 struct net_device_stats stats;
00391 struct {
00392 u32 bins[DEPCA_PKT_STAT_SZ];
00393 u32 unicast;
00394 u32 multicast;
00395 u32 broadcast;
00396 u32 excessive_collisions;
00397 u32 tx_underruns;
00398 u32 excessive_underruns;
00399 } pktStats;
00400 int txRingMask;
00401 int rxRingMask;
00402 s32 rx_rlen;
00403 s32 tx_rlen;
00404 };
00405
00406
00407
00408
00409
00410
00411
00412
00413 #define TX_BUFFS_AVAIL ((lp->tx_old<=lp->tx_new)?\
00414 lp->tx_old+lp->txRingMask-lp->tx_new:\
00415 lp->tx_old -lp->tx_new-1)
00416
00417
00418
00419
00420 static int depca_open(struct device *dev);
00421 static int depca_start_xmit(struct sk_buff *skb, struct device *dev);
00422 static void depca_interrupt(int irq, void *dev_id, struct pt_regs *regs);
00423 static int depca_close(struct device *dev);
00424 static int depca_ioctl(struct device *dev, struct ifreq *rq, int cmd);
00425 static struct net_device_stats *depca_get_stats(struct device *dev);
00426 static void set_multicast_list(struct device *dev);
00427
00428
00429
00430
00431 static int depca_hw_init(struct device *dev, u_long ioaddr, int mca_slot);
00432 static void depca_init_ring(struct device *dev);
00433 static int depca_rx(struct device *dev);
00434 static int depca_tx(struct device *dev);
00435
00436 static void LoadCSRs(struct device *dev);
00437 static int InitRestartDepca(struct device *dev);
00438 static void DepcaSignature(char *name, u_long paddr);
00439 static int DevicePresent(u_long ioaddr);
00440 static int get_hw_addr(struct device *dev);
00441 static int EISA_signature(char *name, s32 eisa_id);
00442 static void SetMulticastFilter(struct device *dev);
00443 static void isa_probe(struct device *dev, u_long iobase);
00444 static void eisa_probe(struct device *dev, u_long iobase);
00445 #ifdef CONFIG_MCA
00446 static void mca_probe(struct device *dev, u_long iobase);
00447 #endif
00448 static struct device *alloc_device(struct device *dev, u_long iobase);
00449 static int depca_dev_index(char *s);
00450 static struct device *insert_device(struct device *dev, u_long iobase, int (*init) (struct device *));
00451 static int load_packet(struct device *dev, struct sk_buff *skb);
00452 static void depca_dbg_open(struct device *dev);
00453
00454 #ifdef MODULE
00455 int init_module(void);
00456 void cleanup_module(void);
00457 static int autoprobed = 1, loading_module = 1;
00458 # else
00459 static u_char de1xx_irq[] __initdata = { 2, 3, 4, 5, 7, 9, 0 };
00460 static u_char de2xx_irq[] __initdata = { 5, 9, 10, 11, 15, 0 };
00461 static u_char de422_irq[] __initdata = { 5, 9, 10, 11, 0 };
00462 static u_char *depca_irq;
00463 static int autoprobed = 0, loading_module = 0;
00464 #endif
00465
00466 static char name[DEPCA_STRLEN];
00467 static int num_depcas = 0, num_eth = 0;
00468 static int mem = 0;
00469
00470 static char *adapter_name = '\0';
00471
00472
00473
00474
00475
00476 #define STOP_DEPCA \
00477 outw(CSR0, DEPCA_ADDR);\
00478 outw(STOP, DEPCA_DATA)
00479
00480
00481
00482 __initfunc(int depca_probe(struct device *dev))
00483 {
00484 int tmp = num_depcas, status = -ENODEV;
00485 u_long iobase = dev->base_addr;
00486
00487 if ((iobase == 0) && loading_module) {
00488 printk("Autoprobing is not supported when loading a module based driver.\n");
00489 status = -EIO;
00490 } else {
00491 #ifdef CONFIG_MCA
00492 mca_probe(dev, iobase);
00493 #endif
00494 isa_probe(dev, iobase);
00495 eisa_probe(dev, iobase);
00496
00497 if ((tmp == num_depcas) && (iobase != 0) && loading_module) {
00498 printk("%s: depca_probe() cannot find device at 0x%04lx.\n", dev->name, iobase);
00499 }
00500
00501
00502
00503
00504
00505 for (; (dev->priv == NULL) && (dev->next != NULL); dev = dev->next);
00506
00507 if (dev->priv)
00508 status = 0;
00509 if (iobase == 0)
00510 autoprobed = 1;
00511 }
00512
00513 return status;
00514 }
00515
00516 __initfunc(static int depca_hw_init(struct device *dev, u_long ioaddr, int mca_slot))
00517 {
00518 struct depca_private *lp;
00519 int i, j, offset, netRAM, mem_len, status = 0;
00520 s16 nicsr;
00521 u_long mem_start = 0, mem_base[] = DEPCA_RAM_BASE_ADDRESSES;
00522
00523 STOP_DEPCA;
00524
00525 nicsr = inb(DEPCA_NICSR);
00526 nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
00527 outb(nicsr, DEPCA_NICSR);
00528
00529 if (inw(DEPCA_DATA) == STOP) {
00530 do {
00531 strcpy(name, (adapter_name ? adapter_name : ""));
00532 mem_start = (mem ? mem & 0xf0000 : mem_base[mem_chkd++]);
00533 DepcaSignature(name, mem_start);
00534 } while (!mem && mem_base[mem_chkd] && (adapter == unknown));
00535
00536 if ((adapter != unknown) && mem_start) {
00537 dev->base_addr = ioaddr;
00538
00539 if (mca_slot != -1) {
00540 printk("%s: %s at 0x%04lx (MCA slot %d)", dev->name, name, ioaddr, mca_slot);
00541 } else if ((ioaddr & 0x0fff) == DEPCA_EISA_IO_PORTS) {
00542 printk("%s: %s at 0x%04lx (EISA slot %d)", dev->name, name, ioaddr, (int) ((ioaddr >> 12) & 0x0f));
00543 } else {
00544 printk("%s: %s at 0x%04lx", dev->name, name, ioaddr);
00545 }
00546
00547 printk(", h/w address ");
00548 status = get_hw_addr(dev);
00549 for (i = 0; i < ETH_ALEN - 1; i++) {
00550 printk("%2.2x:", dev->dev_addr[i]);
00551 }
00552 printk("%2.2x", dev->dev_addr[i]);
00553
00554 if (status == 0) {
00555
00556 netRAM = ((adapter != DEPCA) ? 64 : 48);
00557 if ((nicsr & _128KB) && (adapter == de422))
00558 netRAM = 128;
00559 offset = 0x0000;
00560
00561
00562 if (nicsr & BUF) {
00563 offset = 0x8000;
00564 nicsr &= ~BS;
00565 netRAM -= 32;
00566 }
00567 mem_start += offset;
00568 if ((mem_len = (NUM_RX_DESC * (sizeof(struct depca_rx_desc) + RX_BUFF_SZ) + NUM_TX_DESC * (sizeof(struct depca_tx_desc) + TX_BUFF_SZ) + sizeof(struct depca_init))) <= (netRAM << 10)) {
00569 printk(",\n has %dkB RAM at 0x%.5lx", netRAM, mem_start);
00570
00571
00572 if (adapter != DEPCA) {
00573 nicsr |= SHE;
00574 outb(nicsr, DEPCA_NICSR);
00575 }
00576
00577
00578 dev->priv = (void *) kmalloc(sizeof(struct depca_private), GFP_KERNEL);
00579 if (dev->priv == NULL)
00580 return -ENOMEM;
00581 lp = (struct depca_private *) dev->priv;
00582 memset((char *) dev->priv, 0, sizeof(struct depca_private));
00583 lp->adapter = adapter;
00584 lp->mca_slot = mca_slot;
00585 sprintf(lp->adapter_name, "%s (%s)", name, dev->name);
00586 request_region(ioaddr, DEPCA_TOTAL_SIZE, lp->adapter_name);
00587
00588
00589 lp->sh_mem = mem_start;
00590 mem_start += sizeof(struct depca_init);
00591
00592
00593 mem_start = (mem_start + ALIGN) & ~ALIGN;
00594 lp->rx_ring = (struct depca_rx_desc *) mem_start;
00595
00596 mem_start += (sizeof(struct depca_rx_desc) * NUM_RX_DESC);
00597 lp->tx_ring = (struct depca_tx_desc *) mem_start;
00598
00599 mem_start += (sizeof(struct depca_tx_desc) * NUM_TX_DESC);
00600 lp->bus_offset = mem_start & 0x00ff0000;
00601 mem_start &= LA_MASK;
00602
00603 lp->dma_buffs = mem_start;
00604
00605
00606 lp->rxRingMask = NUM_RX_DESC - 1;
00607 lp->txRingMask = NUM_TX_DESC - 1;
00608
00609
00610 for (i = 0, j = lp->rxRingMask; j > 0; i++) {
00611 j >>= 1;
00612 }
00613 lp->rx_rlen = (s32) (i << 29);
00614 for (i = 0, j = lp->txRingMask; j > 0; i++) {
00615 j >>= 1;
00616 }
00617 lp->tx_rlen = (s32) (i << 29);
00618
00619
00620 depca_init_ring(dev);
00621
00622
00623 LoadCSRs(dev);
00624
00625
00626 nicsr = ((nicsr & ~IM) | IEN);
00627 outb(nicsr, DEPCA_NICSR);
00628
00629
00630
00631 if (dev->irq < 2) {
00632 #ifndef MODULE
00633 unsigned char irqnum;
00634 autoirq_setup(0);
00635
00636
00637 switch (lp->adapter) {
00638 case DEPCA:
00639 case de100:
00640 case de101:
00641 depca_irq = de1xx_irq;
00642 break;
00643 case de200:
00644 case de201:
00645 case de202:
00646 case de210:
00647 case de212:
00648 depca_irq = de2xx_irq;
00649 break;
00650 case de422:
00651 depca_irq = de422_irq;
00652 break;
00653 }
00654
00655
00656 outw(INEA | INIT, DEPCA_DATA);
00657
00658 irqnum = autoirq_report(1);
00659 if (!irqnum) {
00660 printk(" and failed to detect IRQ line.\n");
00661 status = -ENXIO;
00662 } else {
00663 for (dev->irq = 0, i = 0; (depca_irq[i]) && (!dev->irq); i++) {
00664 if (irqnum == depca_irq[i]) {
00665 dev->irq = irqnum;
00666 printk(" and uses IRQ%d.\n", dev->irq);
00667 }
00668 }
00669
00670 if (!dev->irq) {
00671 printk(" but incorrect IRQ line detected.\n");
00672 status = -ENXIO;
00673 }
00674 }
00675 #endif
00676 } else {
00677 printk(" and assigned IRQ%d.\n", dev->irq);
00678 }
00679 if (status)
00680 release_region(ioaddr, DEPCA_TOTAL_SIZE);
00681 } else {
00682 printk(",\n requests %dkB RAM: only %dkB is available!\n", (mem_len >> 10), netRAM);
00683 status = -ENXIO;
00684 }
00685 } else {
00686 printk(" which has an Ethernet PROM CRC error.\n");
00687 status = -ENXIO;
00688 }
00689 } else {
00690 status = -ENXIO;
00691 }
00692 if (!status) {
00693 if (depca_debug > 1) {
00694 printk(version);
00695 }
00696
00697
00698 dev->open = &depca_open;
00699 dev->hard_start_xmit = &depca_start_xmit;
00700 dev->stop = &depca_close;
00701 dev->get_stats = &depca_get_stats;
00702 dev->set_multicast_list = &set_multicast_list;
00703 dev->do_ioctl = &depca_ioctl;
00704
00705 dev->mem_start = 0;
00706
00707
00708 ether_setup(dev);
00709 } else {
00710 if (dev->priv) {
00711 kfree_s(dev->priv, sizeof(struct depca_private));
00712 dev->priv = NULL;
00713 }
00714 }
00715 } else {
00716 status = -ENXIO;
00717 }
00718
00719 return status;
00720 }
00721
00722
00723 static int depca_open(struct device *dev)
00724 {
00725 struct depca_private *lp = (struct depca_private *) dev->priv;
00726 u_long ioaddr = dev->base_addr;
00727 s16 nicsr;
00728 int status = 0;
00729
00730 STOP_DEPCA;
00731 nicsr = inb(DEPCA_NICSR);
00732
00733
00734 if (adapter != DEPCA) {
00735 nicsr |= SHE;
00736 outb(nicsr, DEPCA_NICSR);
00737 }
00738
00739
00740 depca_init_ring(dev);
00741 LoadCSRs(dev);
00742
00743 depca_dbg_open(dev);
00744
00745 if (request_irq(dev->irq, &depca_interrupt, 0, lp->adapter_name, dev)) {
00746 printk("depca_open(): Requested IRQ%d is busy\n", dev->irq);
00747 status = -EAGAIN;
00748 } else {
00749
00750
00751 nicsr = ((nicsr & ~IM & ~LED) | IEN);
00752 outb(nicsr, DEPCA_NICSR);
00753 outw(CSR0, DEPCA_ADDR);
00754
00755 dev->tbusy = 0;
00756 dev->interrupt = 0;
00757 dev->start = 1;
00758
00759 status = InitRestartDepca(dev);
00760
00761 if (depca_debug > 1) {
00762 printk("CSR0: 0x%4.4x\n", inw(DEPCA_DATA));
00763 printk("nicsr: 0x%02x\n", inb(DEPCA_NICSR));
00764 }
00765 }
00766
00767 MOD_INC_USE_COUNT;
00768
00769 return status;
00770 }
00771
00772
00773 static void depca_init_ring(struct device *dev)
00774 {
00775 struct depca_private *lp = (struct depca_private *) dev->priv;
00776 u_int i;
00777 u_long p;
00778
00779
00780 test_and_set_bit(0, (void *) &dev->tbusy);
00781
00782 lp->rx_new = lp->tx_new = 0;
00783 lp->rx_old = lp->tx_old = 0;
00784
00785
00786 for (i = 0; i <= lp->rxRingMask; i++) {
00787 writel((p = lp->dma_buffs + i * RX_BUFF_SZ) | R_OWN, &lp->rx_ring[i].base);
00788 writew(-RX_BUFF_SZ, &lp->rx_ring[i].buf_length);
00789 lp->rx_memcpy[i] = (char *) (p + lp->bus_offset);
00790 }
00791 for (i = 0; i <= lp->txRingMask; i++) {
00792 writel((p = lp->dma_buffs + (i + lp->txRingMask + 1) * TX_BUFF_SZ) & 0x00ffffff, &lp->tx_ring[i].base);
00793 lp->tx_memcpy[i] = (char *) (p + lp->bus_offset);
00794 }
00795
00796
00797 lp->init_block.rx_ring = ((u32) ((u_long) lp->rx_ring) & LA_MASK) | lp->rx_rlen;
00798 lp->init_block.tx_ring = ((u32) ((u_long) lp->tx_ring) & LA_MASK) | lp->tx_rlen;
00799
00800 SetMulticastFilter(dev);
00801
00802 for (i = 0; i < ETH_ALEN; i++) {
00803 lp->init_block.phys_addr[i] = dev->dev_addr[i];
00804 }
00805
00806 lp->init_block.mode = 0x0000;
00807
00808 return;
00809 }
00810
00811
00812
00813
00814 static int depca_start_xmit(struct sk_buff *skb, struct device *dev)
00815 {
00816 struct depca_private *lp = (struct depca_private *) dev->priv;
00817 u_long ioaddr = dev->base_addr;
00818 int status = 0;
00819
00820
00821 if (dev->tbusy) {
00822 int tickssofar = jiffies - dev->trans_start;
00823 if (tickssofar < 1 * HZ) {
00824 status = -1;
00825 } else {
00826 printk("%s: transmit timed out, status %04x, resetting.\n", dev->name, inw(DEPCA_DATA));
00827
00828 STOP_DEPCA;
00829 depca_init_ring(dev);
00830 LoadCSRs(dev);
00831 dev->interrupt = UNMASK_INTERRUPTS;
00832 dev->start = 1;
00833 dev->tbusy = 0;
00834 dev->trans_start = jiffies;
00835 InitRestartDepca(dev);
00836 }
00837 return status;
00838 } else if (skb->len > 0) {
00839 if(skb->len < ETH_ZLEN)
00840 {
00841 skb = skb_padto(skb, ETH_ZLEN);
00842 if(skb == NULL)
00843 return 0;
00844 }
00845
00846
00847 if (test_and_set_bit(0, (void *) &dev->tbusy) != 0) {
00848 printk("%s: Transmitter access conflict.\n", dev->name);
00849 status = -1;
00850 } else {
00851 if (TX_BUFFS_AVAIL) {
00852 status = load_packet(dev, skb);
00853
00854 if (!status) {
00855
00856 outw(CSR0, DEPCA_ADDR);
00857 outw(INEA | TDMD, DEPCA_DATA);
00858
00859 dev->trans_start = jiffies;
00860 dev_kfree_skb(skb);
00861 }
00862 if (TX_BUFFS_AVAIL) {
00863 dev->tbusy = 0;
00864 }
00865 } else {
00866 status = -1;
00867 }
00868 }
00869 }
00870
00871 return status;
00872 }
00873
00874
00875
00876
00877 static void depca_interrupt(int irq, void *dev_id, struct pt_regs *regs)
00878 {
00879 struct device *dev = dev_id;
00880 struct depca_private *lp;
00881 s16 csr0, nicsr;
00882 u_long ioaddr;
00883
00884 if (dev == NULL) {
00885 printk("depca_interrupt(): irq %d for unknown device.\n", irq);
00886 } else {
00887 lp = (struct depca_private *) dev->priv;
00888 ioaddr = dev->base_addr;
00889
00890 if (dev->interrupt)
00891 printk("%s: Re-entering the interrupt handler.\n", dev->name);
00892
00893 dev->interrupt = MASK_INTERRUPTS;
00894
00895
00896 nicsr = inb(DEPCA_NICSR);
00897 nicsr |= (IM | LED);
00898 outb(nicsr, DEPCA_NICSR);
00899
00900 outw(CSR0, DEPCA_ADDR);
00901 csr0 = inw(DEPCA_DATA);
00902
00903
00904 outw(csr0 & INTE, DEPCA_DATA);
00905
00906 if (csr0 & RINT)
00907 depca_rx(dev);
00908
00909 if (csr0 & TINT)
00910 depca_tx(dev);
00911
00912 if ((TX_BUFFS_AVAIL >= 0) && dev->tbusy) {
00913 dev->tbusy = 0;
00914 mark_bh(NET_BH);
00915 }
00916
00917
00918 nicsr = (nicsr & ~IM & ~LED);
00919 outb(nicsr, DEPCA_NICSR);
00920
00921 dev->interrupt = UNMASK_INTERRUPTS;
00922 }
00923
00924 return;
00925 }
00926
00927 static int depca_rx(struct device *dev)
00928 {
00929 struct depca_private *lp = (struct depca_private *) dev->priv;
00930 int i, entry;
00931 s32 status;
00932
00933 for (entry = lp->rx_new; !(readl(&lp->rx_ring[entry].base) & R_OWN); entry = lp->rx_new) {
00934 status = readl(&lp->rx_ring[entry].base) >> 16;
00935 if (status & R_STP) {
00936 lp->rx_old = entry;
00937 }
00938 if (status & R_ENP) {
00939 if (status & R_ERR) {
00940 lp->stats.rx_errors++;
00941 if (status & R_FRAM)
00942 lp->stats.rx_frame_errors++;
00943 if (status & R_OFLO)
00944 lp->stats.rx_over_errors++;
00945 if (status & R_CRC)
00946 lp->stats.rx_crc_errors++;
00947 if (status & R_BUFF)
00948 lp->stats.rx_fifo_errors++;
00949 } else {
00950 short len, pkt_len = readw(&lp->rx_ring[entry].msg_length) - 4;
00951 struct sk_buff *skb;
00952
00953 skb = dev_alloc_skb(pkt_len + 2);
00954 if (skb != NULL) {
00955 unsigned char *buf;
00956 skb_reserve(skb, 2);
00957 buf = skb_put(skb, pkt_len);
00958 skb->dev = dev;
00959 if (entry < lp->rx_old) {
00960 len = (lp->rxRingMask - lp->rx_old + 1) * RX_BUFF_SZ;
00961 memcpy_fromio(buf, lp->rx_memcpy[lp->rx_old], len);
00962 memcpy_fromio(buf + len, lp->rx_memcpy[0], pkt_len - len);
00963 } else {
00964 memcpy_fromio(buf, lp->rx_memcpy[lp->rx_old], pkt_len);
00965 }
00966
00967
00968
00969
00970
00971 skb->protocol = eth_type_trans(skb, dev);
00972 netif_rx(skb);
00973
00974
00975
00976
00977 lp->stats.rx_packets++;
00978 for (i = 1; i < DEPCA_PKT_STAT_SZ - 1; i++) {
00979 if (pkt_len < (i * DEPCA_PKT_BIN_SZ)) {
00980 lp->pktStats.bins[i]++;
00981 i = DEPCA_PKT_STAT_SZ;
00982 }
00983 }
00984 if (buf[0] & 0x01) {
00985 if ((*(s16 *) & buf[0] == -1) && (*(s16 *) & buf[2] == -1) && (*(s16 *) & buf[4] == -1)) {
00986 lp->pktStats.broadcast++;
00987 } else {
00988 lp->pktStats.multicast++;
00989 }
00990 } else if ((*(s16 *) & buf[0] == *(s16 *) & dev->dev_addr[0]) && (*(s16 *) & buf[2] == *(s16 *) & dev->dev_addr[2]) && (*(s16 *) & buf[4] == *(s16 *) & dev->dev_addr[4])) {
00991 lp->pktStats.unicast++;
00992 }
00993
00994 lp->pktStats.bins[0]++;
00995 if (lp->pktStats.bins[0] == 0) {
00996 memset((char *) &lp->pktStats, 0, sizeof(lp->pktStats));
00997 }
00998 } else {
00999 printk("%s: Memory squeeze, deferring packet.\n", dev->name);
01000 lp->stats.rx_dropped++;
01001 break;
01002 }
01003 }
01004
01005 for (; lp->rx_old != entry; lp->rx_old = (++lp->rx_old) & lp->rxRingMask) {
01006 writel(readl(&lp->rx_ring[lp->rx_old].base) | R_OWN, &lp->rx_ring[lp->rx_old].base);
01007 }
01008 writel(readl(&lp->rx_ring[entry].base) | R_OWN, &lp->rx_ring[entry].base);
01009 }
01010
01011
01012
01013
01014 lp->rx_new = (++lp->rx_new) & lp->rxRingMask;
01015 }
01016
01017 return 0;
01018 }
01019
01020
01021
01022
01023 static int depca_tx(struct device *dev)
01024 {
01025 struct depca_private *lp = (struct depca_private *) dev->priv;
01026 int entry;
01027 s32 status;
01028 u_long ioaddr = dev->base_addr;
01029
01030 for (entry = lp->tx_old; entry != lp->tx_new; entry = lp->tx_old) {
01031 status = readl(&lp->tx_ring[entry].base) >> 16;
01032
01033 if (status < 0) {
01034 break;
01035 } else if (status & T_ERR) {
01036 status = readl(&lp->tx_ring[entry].misc);
01037 lp->stats.tx_errors++;
01038 if (status & TMD3_RTRY)
01039 lp->stats.tx_aborted_errors++;
01040 if (status & TMD3_LCAR)
01041 lp->stats.tx_carrier_errors++;
01042 if (status & TMD3_LCOL)
01043 lp->stats.tx_window_errors++;
01044 if (status & TMD3_UFLO)
01045 lp->stats.tx_fifo_errors++;
01046 if (status & (TMD3_BUFF | TMD3_UFLO)) {
01047
01048 outw(CSR0, DEPCA_ADDR);
01049 outw(INEA | TDMD, DEPCA_DATA);
01050 }
01051 } else if (status & (T_MORE | T_ONE)) {
01052 lp->stats.collisions++;
01053 } else {
01054 lp->stats.tx_packets++;
01055 }
01056
01057
01058 lp->tx_old = (++lp->tx_old) & lp->txRingMask;
01059 }
01060
01061 return 0;
01062 }
01063
01064 static int depca_close(struct device *dev)
01065 {
01066 struct depca_private *lp = (struct depca_private *) dev->priv;
01067 s16 nicsr;
01068 u_long ioaddr = dev->base_addr;
01069
01070 dev->start = 0;
01071 dev->tbusy = 1;
01072
01073 outw(CSR0, DEPCA_ADDR);
01074
01075 if (depca_debug > 1) {
01076 printk("%s: Shutting down ethercard, status was %2.2x.\n", dev->name, inw(DEPCA_DATA));
01077 }
01078
01079
01080
01081
01082
01083 outw(STOP, DEPCA_DATA);
01084
01085
01086
01087
01088 if (lp->adapter != DEPCA) {
01089 nicsr = inb(DEPCA_NICSR);
01090 nicsr &= ~SHE;
01091 outb(nicsr, DEPCA_NICSR);
01092 }
01093
01094
01095
01096
01097 free_irq(dev->irq, dev);
01098
01099 MOD_DEC_USE_COUNT;
01100
01101 return 0;
01102 }
01103
01104 static void LoadCSRs(struct device *dev)
01105 {
01106