OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [net/] [ewrk3.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*  ewrk3.c: A DIGITAL EtherWORKS 3 ethernet driver for Linux.
2
 
3
   Written 1994 by David C. Davies.
4
 
5
   Copyright 1994 Digital Equipment Corporation.
6
 
7
   This software may be used and distributed according to the terms of
8
   the GNU General Public License, incorporated herein by reference.
9
 
10
   This driver is written for the Digital Equipment Corporation series
11
   of EtherWORKS ethernet cards:
12
 
13
   DE203 Turbo (BNC)
14
   DE204 Turbo (TP)
15
   DE205 Turbo (TP BNC)
16
 
17
   The driver has been tested on a relatively busy  network using the DE205
18
   card and benchmarked with 'ttcp': it transferred 16M  of data at 975kB/s
19
   (7.8Mb/s) to a DECstation 5000/200.
20
 
21
   The author may be reached at davies@maniac.ultranet.com.
22
 
23
   =========================================================================
24
   This driver has been written  substantially  from scratch, although  its
25
   inheritance of style and stack interface from 'depca.c' and in turn from
26
   Donald Becker's 'lance.c' should be obvious.
27
 
28
   The  DE203/4/5 boards  all  use a new proprietary   chip in place of the
29
   LANCE chip used in prior cards  (DEPCA, DE100, DE200/1/2, DE210, DE422).
30
   Use the depca.c driver in the standard distribution  for the LANCE based
31
   cards from DIGITAL; this driver will not work with them.
32
 
33
   The DE203/4/5 cards have 2  main modes: shared memory  and I/O only. I/O
34
   only makes  all the card accesses through  I/O transactions and  no high
35
   (shared)  memory is used. This  mode provides a >48% performance penalty
36
   and  is deprecated in this  driver,  although allowed to provide initial
37
   setup when hardstrapped.
38
 
39
   The shared memory mode comes in 3 flavours: 2kB, 32kB and 64kB. There is
40
   no point in using any mode other than the 2kB  mode - their performances
41
   are virtually identical, although the driver has  been tested in the 2kB
42
   and 32kB modes. I would suggest you uncomment the line:
43
 
44
   FORCE_2K_MODE;
45
 
46
   to allow the driver to configure the card as a  2kB card at your current
47
   base  address, thus leaving more  room to clutter  your  system box with
48
   other memory hungry boards.
49
 
50
   As many ISA  and EISA cards  can be supported  under this driver  as you
51
   wish, limited primarily  by the available IRQ lines,  rather than by the
52
   available I/O addresses  (24 ISA,  16 EISA).   I have  checked different
53
   configurations of  multiple  depca cards and  ewrk3 cards  and have  not
54
   found a problem yet (provided you have at least depca.c v0.38) ...
55
 
56
   The board IRQ setting   must be at  an unused  IRQ which is  auto-probed
57
   using  Donald  Becker's autoprobe  routines.   All  these cards   are at
58
   {5,10,11,15}.
59
 
60
   No 16MB memory  limitation should exist with this  driver as DMA is  not
61
   used and the common memory area is in low memory on the network card (my
62
   current system has 20MB and I've not had problems yet).
63
 
64
   The ability to load  this driver as a  loadable module has been included
65
   and used  extensively during the  driver development (to save those long
66
   reboot sequences). To utilise this ability, you have to do 8 things:
67
 
68
   0) have a copy of the loadable modules code installed on your system.
69
   1) copy ewrk3.c from the  /linux/drivers/net directory to your favourite
70
   temporary directory.
71
   2) edit the  source code near  line 1898 to reflect  the I/O address and
72
   IRQ you're using.
73
   3) compile  ewrk3.c, but include -DMODULE in  the command line to ensure
74
   that the correct bits are compiled (see end of source code).
75
   4) if you are wanting to add a new  card, goto 5. Otherwise, recompile a
76
   kernel with the ewrk3 configuration turned off and reboot.
77
   5) insmod ewrk3.o
78
   [Alan Cox: Changed this so you can insmod ewrk3.o irq=x io=y]
79
   [Adam Kropelin: now accepts irq=x1,x2 io=y1,y2 for multiple cards]
80
   6) run the net startup bits for your new eth?? interface manually
81
   (usually /etc/rc.inet[12] at boot time).
82
   7) enjoy!
83
 
84
   Note that autoprobing is not allowed in loadable modules - the system is
85
   already up and running and you're messing with interrupts.
86
 
87
   To unload a module, turn off the associated interface
88
   'ifconfig eth?? down' then 'rmmod ewrk3'.
89
 
90
   Promiscuous   mode has been  turned  off  in this driver,   but  all the
91
   multicast  address bits  have been   turned on. This  improved the  send
92
   performance on a busy network by about 13%.
93
 
94
   Ioctl's have now been provided (primarily because  I wanted to grab some
95
   packet size statistics). They  are patterned after 'plipconfig.c' from a
96
   suggestion by Alan Cox.  Using these  ioctls, you can enable promiscuous
97
   mode, add/delete multicast  addresses, change the hardware address,  get
98
   packet size distribution statistics and muck around with the control and
99
   status register. I'll add others if and when the need arises.
100
 
101
   TO DO:
102
   ------
103
 
104
 
105
   Revision History
106
   ----------------
107
 
108
   Version   Date        Description
109
 
110
   0.1     26-aug-94   Initial writing. ALPHA code release.
111
   0.11    31-aug-94   Fixed: 2k mode memory base calc.,
112
   LeMAC version calc.,
113
   IRQ vector assignments during autoprobe.
114
   0.12    31-aug-94   Tested working on LeMAC2 (DE20[345]-AC) card.
115
   Fixed up MCA hash table algorithm.
116
   0.20     4-sep-94   Added IOCTL functionality.
117
   0.21    14-sep-94   Added I/O mode.
118
   0.21axp 15-sep-94   Special version for ALPHA AXP Linux V1.0.
119
   0.22    16-sep-94   Added more IOCTLs & tidied up.
120
   0.23    21-sep-94   Added transmit cut through.
121
   0.24    31-oct-94   Added uid checks in some ioctls.
122
   0.30     1-nov-94   BETA code release.
123
   0.31     5-dec-94   Added check/allocate region code.
124
   0.32    16-jan-95   Broadcast packet fix.
125
   0.33    10-Feb-95   Fix recognition bug reported by <bkm@star.rl.ac.uk>.
126
   0.40    27-Dec-95   Rationalise MODULE and autoprobe code.
127
   Rewrite for portability & updated.
128
   ALPHA support from <jestabro@amt.tay1.dec.com>
129
   Added verify_area() calls in ewrk3_ioctl() from
130
   suggestion by <heiko@colossus.escape.de>.
131
   Add new multicasting code.
132
   0.41    20-Jan-96   Fix IRQ set up problem reported by
133
   <kenneth@bbs.sas.ntu.ac.sg>.
134
   0.42    22-Apr-96   Fix alloc_device() bug <jari@markkus2.fimr.fi>
135
   0.43    16-Aug-96   Update alloc_device() to conform to de4x5.c
136
   0.44    08-Nov-01   use library crc32 functions <Matt_Domsch@dell.com>
137
   0.45    19-Jul-02   fix unaligned access on alpha <martin@bruli.net>
138
   0.46    10-Oct-02   Multiple NIC support when module <akropel1@rochester.rr.com>
139
   0.47    18-Oct-02   ethtool support <akropel1@rochester.rr.com>
140
   0.48    18-Oct-02   cli/sti removal for 2.5 <vda@port.imtp.ilyichevsk.odessa.ua>
141
   ioctl locking, signature search cleanup <akropel1@rochester.rr.com>
142
 
143
   =========================================================================
144
 */
145
 
146
#include <linux/module.h>
147
#include <linux/kernel.h>
148
#include <linux/string.h>
149
#include <linux/errno.h>
150
#include <linux/ioport.h>
151
#include <linux/slab.h>
152
#include <linux/interrupt.h>
153
#include <linux/delay.h>
154
#include <linux/init.h>
155
#include <linux/crc32.h>
156
#include <linux/netdevice.h>
157
#include <linux/etherdevice.h>
158
#include <linux/skbuff.h>
159
#include <linux/ethtool.h>
160
#include <linux/time.h>
161
#include <linux/types.h>
162
#include <linux/unistd.h>
163
#include <linux/ctype.h>
164
#include <linux/bitops.h>
165
 
166
#include <asm/io.h>
167
#include <asm/dma.h>
168
#include <asm/uaccess.h>
169
 
170
#include "ewrk3.h"
171
 
172
#define DRV_NAME        "ewrk3"
173
#define DRV_VERSION     "0.48"
174
 
175
static char version[] __initdata =
176
DRV_NAME ":v" DRV_VERSION " 2002/10/18 davies@maniac.ultranet.com\n";
177
 
178
#ifdef EWRK3_DEBUG
179
static int ewrk3_debug = EWRK3_DEBUG;
180
#else
181
static int ewrk3_debug = 1;
182
#endif
183
 
184
#define EWRK3_NDA 0xffe0        /* No Device Address */
185
 
186
#define PROBE_LENGTH    32
187
#define ETH_PROM_SIG    0xAA5500FFUL
188
 
189
#ifndef EWRK3_SIGNATURE
190
#define EWRK3_SIGNATURE {"DE203","DE204","DE205",""}
191
#define EWRK3_STRLEN 8
192
#endif
193
 
194
#ifndef EWRK3_RAM_BASE_ADDRESSES
195
#define EWRK3_RAM_BASE_ADDRESSES {0xc0000,0xd0000,0x00000}
196
#endif
197
 
198
/*
199
   ** Sets up the I/O area for the autoprobe.
200
 */
201
#define EWRK3_IO_BASE 0x100     /* Start address for probe search */
202
#define EWRK3_IOP_INC 0x20      /* I/O address increment */
203
#define EWRK3_TOTAL_SIZE 0x20   /* required I/O address length */
204
 
205
#ifndef MAX_NUM_EWRK3S
206
#define MAX_NUM_EWRK3S 21
207
#endif
208
 
209
#ifndef EWRK3_EISA_IO_PORTS
210
#define EWRK3_EISA_IO_PORTS 0x0c00      /* I/O port base address, slot 0 */
211
#endif
212
 
213
#ifndef MAX_EISA_SLOTS
214
#define MAX_EISA_SLOTS 16
215
#define EISA_SLOT_INC 0x1000
216
#endif
217
 
218
#define QUEUE_PKT_TIMEOUT (1*HZ)        /* Jiffies */
219
 
220
/*
221
   ** EtherWORKS 3 shared memory window sizes
222
 */
223
#define IO_ONLY         0x00
224
#define SHMEM_2K        0x800
225
#define SHMEM_32K       0x8000
226
#define SHMEM_64K       0x10000
227
 
228
/*
229
   ** EtherWORKS 3 IRQ ENABLE/DISABLE
230
 */
231
#define ENABLE_IRQs { \
232
  icr |= lp->irq_mask;\
233
  outb(icr, EWRK3_ICR);                     /* Enable the IRQs */\
234
}
235
 
236
#define DISABLE_IRQs { \
237
  icr = inb(EWRK3_ICR);\
238
  icr &= ~lp->irq_mask;\
239
  outb(icr, EWRK3_ICR);                     /* Disable the IRQs */\
240
}
241
 
242
/*
243
   ** EtherWORKS 3 START/STOP
244
 */
245
#define START_EWRK3 { \
246
  csr = inb(EWRK3_CSR);\
247
  csr &= ~(CSR_TXD|CSR_RXD);\
248
  outb(csr, EWRK3_CSR);                     /* Enable the TX and/or RX */\
249
}
250
 
251
#define STOP_EWRK3 { \
252
  csr = (CSR_TXD|CSR_RXD);\
253
  outb(csr, EWRK3_CSR);                     /* Disable the TX and/or RX */\
254
}
255
 
256
/*
257
   ** The EtherWORKS 3 private structure
258
 */
259
#define EWRK3_PKT_STAT_SZ 16
260
#define EWRK3_PKT_BIN_SZ  128   /* Should be >=100 unless you
261
                                   increase EWRK3_PKT_STAT_SZ */
262
 
263
struct ewrk3_stats {
264
        u32 bins[EWRK3_PKT_STAT_SZ];
265
        u32 unicast;
266
        u32 multicast;
267
        u32 broadcast;
268
        u32 excessive_collisions;
269
        u32 tx_underruns;
270
        u32 excessive_underruns;
271
};
272
 
273
struct ewrk3_private {
274
        char adapter_name[80];  /* Name exported to /proc/ioports */
275
        u_long shmem_base;      /* Shared memory start address */
276
        void __iomem *shmem;
277
        u_long shmem_length;    /* Shared memory window length */
278
        struct ewrk3_stats pktStats; /* Private stats counters */
279
        u_char irq_mask;        /* Adapter IRQ mask bits */
280
        u_char mPage;           /* Maximum 2kB Page number */
281
        u_char lemac;           /* Chip rev. level */
282
        u_char hard_strapped;   /* Don't allow a full open */
283
        u_char txc;             /* Transmit cut through */
284
        void __iomem *mctbl;    /* Pointer to the multicast table */
285
        u_char led_mask;        /* Used to reserve LED access for ethtool */
286
        spinlock_t hw_lock;
287
};
288
 
289
/*
290
   ** Force the EtherWORKS 3 card to be in 2kB MODE
291
 */
292
#define FORCE_2K_MODE { \
293
  shmem_length = SHMEM_2K;\
294
  outb(((mem_start - 0x80000) >> 11), EWRK3_MBR);\
295
}
296
 
297
/*
298
   ** Public Functions
299
 */
300
static int ewrk3_open(struct net_device *dev);
301
static int ewrk3_queue_pkt(struct sk_buff *skb, struct net_device *dev);
302
static irqreturn_t ewrk3_interrupt(int irq, void *dev_id);
303
static int ewrk3_close(struct net_device *dev);
304
static void set_multicast_list(struct net_device *dev);
305
static int ewrk3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
306
static const struct ethtool_ops ethtool_ops_203;
307
static const struct ethtool_ops ethtool_ops;
308
 
309
/*
310
   ** Private functions
311
 */
312
static int ewrk3_hw_init(struct net_device *dev, u_long iobase);
313
static void ewrk3_init(struct net_device *dev);
314
static int ewrk3_rx(struct net_device *dev);
315
static int ewrk3_tx(struct net_device *dev);
316
static void ewrk3_timeout(struct net_device *dev);
317
 
318
static void EthwrkSignature(char *name, char *eeprom_image);
319
static int DevicePresent(u_long iobase);
320
static void SetMulticastFilter(struct net_device *dev);
321
static int EISA_signature(char *name, s32 eisa_id);
322
 
323
static int Read_EEPROM(u_long iobase, u_char eaddr);
324
static int Write_EEPROM(short data, u_long iobase, u_char eaddr);
325
static u_char get_hw_addr(struct net_device *dev, u_char * eeprom_image, char chipType);
326
 
327
static int ewrk3_probe1(struct net_device *dev, u_long iobase, int irq);
328
static int isa_probe(struct net_device *dev, u_long iobase);
329
static int eisa_probe(struct net_device *dev, u_long iobase);
330
 
331
static u_char irq[MAX_NUM_EWRK3S+1] = {5, 0, 10, 3, 11, 9, 15, 12};
332
 
333
static char name[EWRK3_STRLEN + 1];
334
static int num_ewrks3s;
335
 
336
/*
337
   ** Miscellaneous defines...
338
 */
339
#define INIT_EWRK3 {\
340
    outb(EEPROM_INIT, EWRK3_IOPR);\
341
    mdelay(1);\
342
}
343
 
344
#ifndef MODULE
345
struct net_device * __init ewrk3_probe(int unit)
346
{
347
        struct net_device *dev = alloc_etherdev(sizeof(struct ewrk3_private));
348
        int err;
349
 
350
        if (!dev)
351
                return ERR_PTR(-ENOMEM);
352
 
353
        if (unit >= 0) {
354
                sprintf(dev->name, "eth%d", unit);
355
                netdev_boot_setup_check(dev);
356
        }
357
 
358
        err = ewrk3_probe1(dev, dev->base_addr, dev->irq);
359
        if (err)
360
                goto out;
361
        return dev;
362
out:
363
        free_netdev(dev);
364
        return ERR_PTR(err);
365
 
366
}
367
#endif
368
 
369
static int __init ewrk3_probe1(struct net_device *dev, u_long iobase, int irq)
370
{
371
        int err;
372
 
373
        dev->base_addr = iobase;
374
        dev->irq = irq;
375
 
376
        /* Address PROM pattern */
377
        err = isa_probe(dev, iobase);
378
        if (err != 0)
379
                err = eisa_probe(dev, iobase);
380
 
381
        if (err)
382
                return err;
383
 
384
        err = register_netdev(dev);
385
        if (err)
386
                release_region(dev->base_addr, EWRK3_TOTAL_SIZE);
387
 
388
        return err;
389
}
390
 
391
static int __init
392
ewrk3_hw_init(struct net_device *dev, u_long iobase)
393
{
394
        struct ewrk3_private *lp;
395
        int i, status = 0;
396
        u_long mem_start, shmem_length;
397
        u_char cr, cmr, icr, nicsr, lemac, hard_strapped = 0;
398
        u_char eeprom_image[EEPROM_MAX], chksum, eisa_cr = 0;
399
        DECLARE_MAC_BUF(mac);
400
 
401
        /*
402
        ** Stop the EWRK3. Enable the DBR ROM. Disable interrupts and remote boot.
403
        ** This also disables the EISA_ENABLE bit in the EISA Control Register.
404
         */
405
        if (iobase > 0x400)
406
                eisa_cr = inb(EISA_CR);
407
        INIT_EWRK3;
408
 
409
        nicsr = inb(EWRK3_CSR);
410
 
411
        icr = inb(EWRK3_ICR);
412
        icr &= 0x70;
413
        outb(icr, EWRK3_ICR);   /* Disable all the IRQs */
414
 
415
        if (nicsr != (CSR_TXD | CSR_RXD))
416
                return -ENXIO;
417
 
418
        /* Check that the EEPROM is alive and well and not living on Pluto... */
419
        for (chksum = 0, i = 0; i < EEPROM_MAX; i += 2) {
420
                union {
421
                        short val;
422
                        char c[2];
423
                } tmp;
424
 
425
                tmp.val = (short) Read_EEPROM(iobase, (i >> 1));
426
                eeprom_image[i] = tmp.c[0];
427
                eeprom_image[i + 1] = tmp.c[1];
428
                chksum += eeprom_image[i] + eeprom_image[i + 1];
429
        }
430
 
431
        if (chksum != 0) {       /* Bad EEPROM Data! */
432
                printk("%s: Device has a bad on-board EEPROM.\n", dev->name);
433
                return -ENXIO;
434
        }
435
 
436
        EthwrkSignature(name, eeprom_image);
437
        if (*name == '\0')
438
                return -ENXIO;
439
 
440
        dev->base_addr = iobase;
441
 
442
        if (iobase > 0x400) {
443
                outb(eisa_cr, EISA_CR);         /* Rewrite the EISA CR */
444
        }
445
        lemac = eeprom_image[EEPROM_CHIPVER];
446
        cmr = inb(EWRK3_CMR);
447
 
448
        if (((lemac == LeMAC) && ((cmr & CMR_NO_EEPROM) != CMR_NO_EEPROM)) ||
449
            ((lemac == LeMAC2) && !(cmr & CMR_HS))) {
450
                printk("%s: %s at %#4lx", dev->name, name, iobase);
451
                hard_strapped = 1;
452
        } else if ((iobase & 0x0fff) == EWRK3_EISA_IO_PORTS) {
453
                /* EISA slot address */
454
                printk("%s: %s at %#4lx (EISA slot %ld)",
455
                       dev->name, name, iobase, ((iobase >> 12) & 0x0f));
456
        } else {        /* ISA port address */
457
                printk("%s: %s at %#4lx", dev->name, name, iobase);
458
        }
459
 
460
        printk(", h/w address ");
461
        if (lemac != LeMAC2)
462
                DevicePresent(iobase);  /* need after EWRK3_INIT */
463
        status = get_hw_addr(dev, eeprom_image, lemac);
464
        printk("%s\n", print_mac(mac, dev->dev_addr));
465
 
466
        if (status) {
467
                printk("      which has an EEPROM CRC error.\n");
468
                return -ENXIO;
469
        }
470
 
471
        if (lemac == LeMAC2) {  /* Special LeMAC2 CMR things */
472
                cmr &= ~(CMR_RA | CMR_WB | CMR_LINK | CMR_POLARITY | CMR_0WS);
473
                if (eeprom_image[EEPROM_MISC0] & READ_AHEAD)
474
                        cmr |= CMR_RA;
475
                if (eeprom_image[EEPROM_MISC0] & WRITE_BEHIND)
476
                        cmr |= CMR_WB;
477
                if (eeprom_image[EEPROM_NETMAN0] & NETMAN_POL)
478
                        cmr |= CMR_POLARITY;
479
                if (eeprom_image[EEPROM_NETMAN0] & NETMAN_LINK)
480
                        cmr |= CMR_LINK;
481
                if (eeprom_image[EEPROM_MISC0] & _0WS_ENA)
482
                        cmr |= CMR_0WS;
483
        }
484
        if (eeprom_image[EEPROM_SETUP] & SETUP_DRAM)
485
                cmr |= CMR_DRAM;
486
        outb(cmr, EWRK3_CMR);
487
 
488
        cr = inb(EWRK3_CR);     /* Set up the Control Register */
489
        cr |= eeprom_image[EEPROM_SETUP] & SETUP_APD;
490
        if (cr & SETUP_APD)
491
                cr |= eeprom_image[EEPROM_SETUP] & SETUP_PS;
492
        cr |= eeprom_image[EEPROM_MISC0] & FAST_BUS;
493
        cr |= eeprom_image[EEPROM_MISC0] & ENA_16;
494
        outb(cr, EWRK3_CR);
495
 
496
        /*
497
        ** Determine the base address and window length for the EWRK3
498
        ** RAM from the memory base register.
499
        */
500
        mem_start = inb(EWRK3_MBR);
501
        shmem_length = 0;
502
        if (mem_start != 0) {
503
                if ((mem_start >= 0x0a) && (mem_start <= 0x0f)) {
504
                        mem_start *= SHMEM_64K;
505
                        shmem_length = SHMEM_64K;
506
                } else if ((mem_start >= 0x14) && (mem_start <= 0x1f)) {
507
                        mem_start *= SHMEM_32K;
508
                        shmem_length = SHMEM_32K;
509
                } else if ((mem_start >= 0x40) && (mem_start <= 0xff)) {
510
                        mem_start = mem_start * SHMEM_2K + 0x80000;
511
                        shmem_length = SHMEM_2K;
512
                } else {
513
                        return -ENXIO;
514
                }
515
        }
516
        /*
517
        ** See the top of this source code for comments about
518
        ** uncommenting this line.
519
        */
520
/*          FORCE_2K_MODE; */
521
 
522
        if (hard_strapped) {
523
                printk("      is hard strapped.\n");
524
        } else if (mem_start) {
525
                printk("      has a %dk RAM window", (int) (shmem_length >> 10));
526
                printk(" at 0x%.5lx", mem_start);
527
        } else {
528
                printk("      is in I/O only mode");
529
        }
530
 
531
        lp = netdev_priv(dev);
532
        lp->shmem_base = mem_start;
533
        lp->shmem = ioremap(mem_start, shmem_length);
534
        if (!lp->shmem)
535
                return -ENOMEM;
536
        lp->shmem_length = shmem_length;
537
        lp->lemac = lemac;
538
        lp->hard_strapped = hard_strapped;
539
        lp->led_mask = CR_LED;
540
        spin_lock_init(&lp->hw_lock);
541
 
542
        lp->mPage = 64;
543
        if (cmr & CMR_DRAM)
544
                lp->mPage <<= 1;        /* 2 DRAMS on module */
545
 
546
        sprintf(lp->adapter_name, "%s (%s)", name, dev->name);
547
 
548
        lp->irq_mask = ICR_TNEM | ICR_TXDM | ICR_RNEM | ICR_RXDM;
549
 
550
        if (!hard_strapped) {
551
                /*
552
                ** Enable EWRK3 board interrupts for autoprobing
553
                */
554
                icr |= ICR_IE;  /* Enable interrupts */
555
                outb(icr, EWRK3_ICR);
556
 
557
                /* The DMA channel may be passed in on this parameter. */
558
                dev->dma = 0;
559
 
560
                /* To auto-IRQ we enable the initialization-done and DMA err,
561
                   interrupts. For now we will always get a DMA error. */
562
                if (dev->irq < 2) {
563
#ifndef MODULE
564
                        u_char irqnum;
565
                        unsigned long irq_mask;
566
 
567
 
568
                        irq_mask = probe_irq_on();
569
 
570
                        /*
571
                        ** Trigger a TNE interrupt.
572
                        */
573
                        icr |= ICR_TNEM;
574
                        outb(1, EWRK3_TDQ);     /* Write to the TX done queue */
575
                        outb(icr, EWRK3_ICR);   /* Unmask the TXD interrupt */
576
 
577
                        irqnum = irq[((icr & IRQ_SEL) >> 4)];
578
 
579
                        mdelay(20);
580
                        dev->irq = probe_irq_off(irq_mask);
581
                        if ((dev->irq) && (irqnum == dev->irq)) {
582
                                printk(" and uses IRQ%d.\n", dev->irq);
583
                        } else {
584
                                if (!dev->irq) {
585
                                        printk(" and failed to detect IRQ line.\n");
586
                                } else if ((irqnum == 1) && (lemac == LeMAC2)) {
587
                                        printk(" and an illegal IRQ line detected.\n");
588
                                } else {
589
                                        printk(", but incorrect IRQ line detected.\n");
590
                                }
591
                                iounmap(lp->shmem);
592
                                return -ENXIO;
593
                        }
594
 
595
                        DISABLE_IRQs;   /* Mask all interrupts */
596
 
597
#endif                          /* MODULE */
598
                } else {
599
                        printk(" and requires IRQ%d.\n", dev->irq);
600
                }
601
        }
602
 
603
        if (ewrk3_debug > 1) {
604
                printk(version);
605
        }
606
        /* The EWRK3-specific entries in the device structure. */
607
        dev->open = ewrk3_open;
608
        dev->hard_start_xmit = ewrk3_queue_pkt;
609
        dev->stop = ewrk3_close;
610
        dev->set_multicast_list = set_multicast_list;
611
        dev->do_ioctl = ewrk3_ioctl;
612
        if (lp->adapter_name[4] == '3')
613
                SET_ETHTOOL_OPS(dev, &ethtool_ops_203);
614
        else
615
                SET_ETHTOOL_OPS(dev, &ethtool_ops);
616
        dev->tx_timeout = ewrk3_timeout;
617
        dev->watchdog_timeo = QUEUE_PKT_TIMEOUT;
618
 
619
        dev->mem_start = 0;
620
 
621
        return 0;
622
}
623
 
624
 
625
static int ewrk3_open(struct net_device *dev)
626
{
627
        struct ewrk3_private *lp = netdev_priv(dev);
628
        u_long iobase = dev->base_addr;
629
        int status = 0;
630
        u_char icr, csr;
631
 
632
        /*
633
           ** Stop the TX and RX...
634
         */
635
        STOP_EWRK3;
636
 
637
        if (!lp->hard_strapped) {
638
                if (request_irq(dev->irq, (void *) ewrk3_interrupt, 0, "ewrk3", dev)) {
639
                        printk("ewrk3_open(): Requested IRQ%d is busy\n", dev->irq);
640
                        status = -EAGAIN;
641
                } else {
642
 
643
                        /*
644
                           ** Re-initialize the EWRK3...
645
                         */
646
                        ewrk3_init(dev);
647
 
648
                        if (ewrk3_debug > 1) {
649
                                DECLARE_MAC_BUF(mac);
650
                                printk("%s: ewrk3 open with irq %d\n", dev->name, dev->irq);
651
                                printk("  physical address: %s\n",
652
                                       print_mac(mac, dev->dev_addr));
653
                                if (lp->shmem_length == 0) {
654
                                        printk("  no shared memory, I/O only mode\n");
655
                                } else {
656
                                        printk("  start of shared memory: 0x%08lx\n", lp->shmem_base);
657
                                        printk("  window length: 0x%04lx\n", lp->shmem_length);
658
                                }
659
                                printk("  # of DRAMS: %d\n", ((inb(EWRK3_CMR) & 0x02) ? 2 : 1));
660
                                printk("  csr:  0x%02x\n", inb(EWRK3_CSR));
661
                                printk("  cr:   0x%02x\n", inb(EWRK3_CR));
662
                                printk("  icr:  0x%02x\n", inb(EWRK3_ICR));
663
                                printk("  cmr:  0x%02x\n", inb(EWRK3_CMR));
664
                                printk("  fmqc: 0x%02x\n", inb(EWRK3_FMQC));
665
                        }
666
                        netif_start_queue(dev);
667
                        /*
668
                           ** Unmask EWRK3 board interrupts
669
                         */
670
                        icr = inb(EWRK3_ICR);
671
                        ENABLE_IRQs;
672
 
673
                }
674
        } else {
675
                printk(KERN_ERR "%s: ewrk3 available for hard strapped set up only.\n", dev->name);
676
                printk(KERN_ERR "      Run the 'ewrk3setup' utility or remove the hard straps.\n");
677
                return -EINVAL;
678
        }
679
 
680
        return status;
681
}
682
 
683
/*
684
   ** Initialize the EtherWORKS 3 operating conditions
685
 */
686
static void ewrk3_init(struct net_device *dev)
687
{
688
        struct ewrk3_private *lp = netdev_priv(dev);
689
        u_char csr, page;
690
        u_long iobase = dev->base_addr;
691
        int i;
692
 
693
        /*
694
           ** Enable any multicasts
695
         */
696
        set_multicast_list(dev);
697
 
698
        /*
699
        ** Set hardware MAC address. Address is initialized from the EEPROM
700
        ** during startup but may have since been changed by the user.
701
        */
702
        for (i=0; i<ETH_ALEN; i++)
703
                outb(dev->dev_addr[i], EWRK3_PAR0 + i);
704
 
705
        /*
706
           ** Clean out any remaining entries in all the queues here
707
         */
708
        while (inb(EWRK3_TQ));
709
        while (inb(EWRK3_TDQ));
710
        while (inb(EWRK3_RQ));
711
        while (inb(EWRK3_FMQ));
712
 
713
        /*
714
           ** Write a clean free memory queue
715
         */
716
        for (page = 1; page < lp->mPage; page++) {      /* Write the free page numbers */
717
                outb(page, EWRK3_FMQ);  /* to the Free Memory Queue */
718
        }
719
 
720
        START_EWRK3;            /* Enable the TX and/or RX */
721
}
722
 
723
/*
724
 *  Transmit timeout
725
 */
726
 
727
static void ewrk3_timeout(struct net_device *dev)
728
{
729
        struct ewrk3_private *lp = netdev_priv(dev);
730
        u_char icr, csr;
731
        u_long iobase = dev->base_addr;
732
 
733
        if (!lp->hard_strapped)
734
        {
735
                printk(KERN_WARNING"%s: transmit timed/locked out, status %04x, resetting.\n",
736
                       dev->name, inb(EWRK3_CSR));
737
 
738
                /*
739
                   ** Mask all board interrupts
740
                 */
741
                DISABLE_IRQs;
742
 
743
                /*
744
                   ** Stop the TX and RX...
745
                 */
746
                STOP_EWRK3;
747
 
748
                ewrk3_init(dev);
749
 
750
                /*
751
                   ** Unmask EWRK3 board interrupts
752
                 */
753
                ENABLE_IRQs;
754
 
755
                dev->trans_start = jiffies;
756
                netif_wake_queue(dev);
757
        }
758
}
759
 
760
/*
761
   ** Writes a socket buffer to the free page queue
762
 */
763
static int ewrk3_queue_pkt (struct sk_buff *skb, struct net_device *dev)
764
{
765
        struct ewrk3_private *lp = netdev_priv(dev);
766
        u_long iobase = dev->base_addr;
767
        void __iomem *buf = NULL;
768
        u_char icr;
769
        u_char page;
770
 
771
        spin_lock_irq (&lp->hw_lock);
772
        DISABLE_IRQs;
773
 
774
        /* if no resources available, exit, request packet be queued */
775
        if (inb (EWRK3_FMQC) == 0) {
776
                printk (KERN_WARNING "%s: ewrk3_queue_pkt(): No free resources...\n",
777
                        dev->name);
778
                printk (KERN_WARNING "%s: ewrk3_queue_pkt(): CSR: %02x ICR: %02x FMQC: %02x\n",
779
                        dev->name, inb (EWRK3_CSR), inb (EWRK3_ICR),
780
                        inb (EWRK3_FMQC));
781
                goto err_out;
782
        }
783
 
784
        /*
785
         ** Get a free page from the FMQ
786
         */
787
        if ((page = inb (EWRK3_FMQ)) >= lp->mPage) {
788
                printk ("ewrk3_queue_pkt(): Invalid free memory page (%d).\n",
789
                     (u_char) page);
790
                goto err_out;
791
        }
792
 
793
 
794
        /*
795
         ** Set up shared memory window and pointer into the window
796
         */
797
        if (lp->shmem_length == IO_ONLY) {
798
                outb (page, EWRK3_IOPR);
799
        } else if (lp->shmem_length == SHMEM_2K) {
800
                buf = lp->shmem;
801
                outb (page, EWRK3_MPR);
802
        } else if (lp->shmem_length == SHMEM_32K) {
803
                buf = (((short) page << 11) & 0x7800) + lp->shmem;
804
                outb ((page >> 4), EWRK3_MPR);
805
        } else if (lp->shmem_length == SHMEM_64K) {
806
                buf = (((short) page << 11) & 0xf800) + lp->shmem;
807
                outb ((page >> 5), EWRK3_MPR);
808
        } else {
809
                printk (KERN_ERR "%s: Oops - your private data area is hosed!\n",
810
                        dev->name);
811
                BUG ();
812
        }
813
 
814
        /*
815
         ** Set up the buffer control structures and copy the data from
816
         ** the socket buffer to the shared memory .
817
         */
818
        if (lp->shmem_length == IO_ONLY) {
819
                int i;
820
                u_char *p = skb->data;
821
                outb ((char) (TCR_QMODE | TCR_PAD | TCR_IFC), EWRK3_DATA);
822
                outb ((char) (skb->len & 0xff), EWRK3_DATA);
823
                outb ((char) ((skb->len >> 8) & 0xff), EWRK3_DATA);
824
                outb ((char) 0x04, EWRK3_DATA);
825
                for (i = 0; i < skb->len; i++) {
826
                        outb (*p++, EWRK3_DATA);
827
                }
828
                outb (page, EWRK3_TQ);  /* Start sending pkt */
829
        } else {
830
                writeb ((char) (TCR_QMODE | TCR_PAD | TCR_IFC), buf);   /* ctrl byte */
831
                buf += 1;
832
                writeb ((char) (skb->len & 0xff), buf); /* length (16 bit xfer) */
833
                buf += 1;
834
                if (lp->txc) {
835
                        writeb(((skb->len >> 8) & 0xff) | XCT, buf);
836
                        buf += 1;
837
                        writeb (0x04, buf);     /* index byte */
838
                        buf += 1;
839
                        writeb (0x00, (buf + skb->len));        /* Write the XCT flag */
840
                        memcpy_toio (buf, skb->data, PRELOAD);  /* Write PRELOAD bytes */
841
                        outb (page, EWRK3_TQ);  /* Start sending pkt */
842
                        memcpy_toio (buf + PRELOAD,
843
                                         skb->data + PRELOAD,
844
                                         skb->len - PRELOAD);
845
                        writeb (0xff, (buf + skb->len));        /* Write the XCT flag */
846
                } else {
847
                        writeb ((skb->len >> 8) & 0xff, buf);
848
                        buf += 1;
849
                        writeb (0x04, buf);     /* index byte */
850
                        buf += 1;
851
                        memcpy_toio (buf, skb->data, skb->len); /* Write data bytes */
852
                        outb (page, EWRK3_TQ);  /* Start sending pkt */
853
                }
854
        }
855
 
856
        ENABLE_IRQs;
857
        spin_unlock_irq (&lp->hw_lock);
858
 
859
        dev->stats.tx_bytes += skb->len;
860
        dev->trans_start = jiffies;
861
        dev_kfree_skb (skb);
862
 
863
        /* Check for free resources: stop Tx queue if there are none */
864
        if (inb (EWRK3_FMQC) == 0)
865
                netif_stop_queue (dev);
866
 
867
        return 0;
868
 
869
err_out:
870
        ENABLE_IRQs;
871
        spin_unlock_irq (&lp->hw_lock);
872
        return 1;
873
}
874
 
875
/*
876
   ** The EWRK3 interrupt handler.
877
 */
878
static irqreturn_t ewrk3_interrupt(int irq, void *dev_id)
879
{
880
        struct net_device *dev = dev_id;
881
        struct ewrk3_private *lp;
882
        u_long iobase;
883
        u_char icr, cr, csr;
884
 
885
        lp = netdev_priv(dev);
886
        iobase = dev->base_addr;
887
 
888
        /* get the interrupt information */
889
        csr = inb(EWRK3_CSR);
890
 
891
        /*
892
         ** Mask the EWRK3 board interrupts and turn on the LED
893
         */
894
        spin_lock(&lp->hw_lock);
895
        DISABLE_IRQs;
896
 
897
        cr = inb(EWRK3_CR);
898
        cr |= lp->led_mask;
899
        outb(cr, EWRK3_CR);
900
 
901
        if (csr & CSR_RNE)      /* Rx interrupt (packet[s] arrived) */
902
                ewrk3_rx(dev);
903
 
904
        if (csr & CSR_TNE)      /* Tx interrupt (packet sent) */
905
                ewrk3_tx(dev);
906
 
907
        /*
908
         ** Now deal with the TX/RX disable flags. These are set when there
909
         ** are no more resources. If resources free up then enable these
910
         ** interrupts, otherwise mask them - failure to do this will result
911
         ** in the system hanging in an interrupt loop.
912
         */
913
        if (inb(EWRK3_FMQC)) {  /* any resources available? */
914
                lp->irq_mask |= ICR_TXDM | ICR_RXDM;    /* enable the interrupt source */
915
                csr &= ~(CSR_TXD | CSR_RXD);    /* ensure restart of a stalled TX or RX */
916
                outb(csr, EWRK3_CSR);
917
                netif_wake_queue(dev);
918
        } else {
919
                lp->irq_mask &= ~(ICR_TXDM | ICR_RXDM);         /* disable the interrupt source */
920
        }
921
 
922
        /* Unmask the EWRK3 board interrupts and turn off the LED */
923
        cr &= ~(lp->led_mask);
924
        outb(cr, EWRK3_CR);
925
        ENABLE_IRQs;
926
        spin_unlock(&lp->hw_lock);
927
        return IRQ_HANDLED;
928
}
929
 
930
/* Called with lp->hw_lock held */
931
static int ewrk3_rx(struct net_device *dev)
932
{
933
        struct ewrk3_private *lp = netdev_priv(dev);
934
        u_long iobase = dev->base_addr;
935
        int i, status = 0;
936
        u_char page;
937
        void __iomem *buf = NULL;
938
 
939
        while (inb(EWRK3_RQC) && !status) {     /* Whilst there's incoming data */
940
                if ((page = inb(EWRK3_RQ)) < lp->mPage) {       /* Get next entry's buffer page */
941
                        /*
942
                           ** Set up shared memory window and pointer into the window
943
                         */
944
                        if (lp->shmem_length == IO_ONLY) {
945
                                outb(page, EWRK3_IOPR);
946
                        } else if (lp->shmem_length == SHMEM_2K) {
947
                                buf = lp->shmem;
948
                                outb(page, EWRK3_MPR);
949
                        } else if (lp->shmem_length == SHMEM_32K) {
950
                                buf = (((short) page << 11) & 0x7800) + lp->shmem;
951
                                outb((page >> 4), EWRK3_MPR);
952
                        } else if (lp->shmem_length == SHMEM_64K) {
953
                                buf = (((short) page << 11) & 0xf800) + lp->shmem;
954
                                outb((page >> 5), EWRK3_MPR);
955
                        } else {
956
                                status = -1;
957
                                printk("%s: Oops - your private data area is hosed!\n", dev->name);
958
                        }
959
 
960
                        if (!status) {
961
                                char rx_status;
962
                                int pkt_len;
963
 
964
                                if (lp->shmem_length == IO_ONLY) {
965
                                        rx_status = inb(EWRK3_DATA);
966
                                        pkt_len = inb(EWRK3_DATA);
967
                                        pkt_len |= ((u_short) inb(EWRK3_DATA) << 8);
968
                                } else {
969
                                        rx_status = readb(buf);
970
                                        buf += 1;
971
                                        pkt_len = readw(buf);
972
                                        buf += 3;
973
                                }
974
 
975
                                if (!(rx_status & R_ROK)) {     /* There was an error. */
976
                                        dev->stats.rx_errors++; /* Update the error stats. */
977
                                        if (rx_status & R_DBE)
978
                                                dev->stats.rx_frame_errors++;
979
                                        if (rx_status & R_CRC)
980
                                                dev->stats.rx_crc_errors++;
981
                                        if (rx_status & R_PLL)
982
                                                dev->stats.rx_fifo_errors++;
983
                                } else {
984
                                        struct sk_buff *skb;
985
 
986
                                        if ((skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
987
                                                unsigned char *p;
988
                                                skb_reserve(skb, 2);    /* Align to 16 bytes */
989
                                                p = skb_put(skb, pkt_len);
990
 
991
                                                if (lp->shmem_length == IO_ONLY) {
992
                                                        *p = inb(EWRK3_DATA);   /* dummy read */
993
                                                        for (i = 0; i < pkt_len; i++) {
994
                                                                *p++ = inb(EWRK3_DATA);
995
                                                        }
996
                                                } else {
997
                                                        memcpy_fromio(p, buf, pkt_len);
998
                                                }
999
 
1000
                                                for (i = 1; i < EWRK3_PKT_STAT_SZ - 1; i++) {
1001
                                                        if (pkt_len < i * EWRK3_PKT_BIN_SZ) {
1002
                                                                lp->pktStats.bins[i]++;
1003
                                                                i = EWRK3_PKT_STAT_SZ;
1004
                                                        }
1005
                                                }
1006
                                                p = skb->data;  /* Look at the dest addr */
1007
                                                if (p[0] & 0x01) {       /* Multicast/Broadcast */
1008
                                                        if ((*(s16 *) & p[0] == -1) && (*(s16 *) & p[2] == -1) && (*(s16 *) & p[4] == -1)) {
1009
                                                                lp->pktStats.broadcast++;
1010
                                                        } else {
1011
                                                                lp->pktStats.multicast++;
1012
                                                        }
1013
                                                } else if ((*(s16 *) & p[0] == *(s16 *) & dev->dev_addr[0]) &&
1014
                                                           (*(s16 *) & p[2] == *(s16 *) & dev->dev_addr[2]) &&
1015
                                                           (*(s16 *) & p[4] == *(s16 *) & dev->dev_addr[4])) {
1016
                                                        lp->pktStats.unicast++;
1017
                                                }
1018
                                                lp->pktStats.bins[0]++;          /* Duplicates stats.rx_packets */
1019
                                                if (lp->pktStats.bins[0] == 0) {  /* Reset counters */
1020
                                                        memset(&lp->pktStats, 0, sizeof(lp->pktStats));
1021
                                                }
1022
                                                /*
1023
                                                   ** Notify the upper protocol layers that there is another
1024
                                                   ** packet to handle
1025
                                                 */
1026
                                                skb->protocol = eth_type_trans(skb, dev);
1027
                                                netif_rx(skb);
1028
 
1029
                                                /*
1030
                                                   ** Update stats
1031
                                                 */
1032
                                                dev->last_rx = jiffies;
1033
                                                dev->stats.rx_packets++;
1034
                                                dev->stats.rx_bytes += pkt_len;
1035
                                        } else {
1036
                                                printk("%s: Insufficient memory; nuking packet.\n", dev->name);
1037
                                                dev->stats.rx_dropped++;                /* Really, deferred. */
1038
                                                break;
1039
                                        }
1040
                                }
1041
                        }
1042
                        /*
1043
                           ** Return the received buffer to the free memory queue
1044
                         */
1045
                        outb(page, EWRK3_FMQ);
1046
                } else {
1047
                        printk("ewrk3_rx(): Illegal page number, page %d\n", page);
1048
                        printk("ewrk3_rx(): CSR: %02x ICR: %02x FMQC: %02x\n", inb(EWRK3_CSR), inb(EWRK3_ICR), inb(EWRK3_FMQC));
1049
                }
1050
        }
1051
        return status;
1052
}
1053
 
1054
/*
1055
** Buffer sent - check for TX buffer errors.
1056
** Called with lp->hw_lock held
1057
*/
1058
static int ewrk3_tx(struct net_device *dev)
1059
{
1060
        struct ewrk3_private *lp = netdev_priv(dev);
1061
        u_long iobase = dev->base_addr;
1062
        u_char tx_status;
1063
 
1064
        while ((tx_status = inb(EWRK3_TDQ)) > 0) {       /* Whilst there's old buffers */
1065
                if (tx_status & T_VSTS) {       /* The status is valid */
1066
                        if (tx_status & T_TXE) {
1067
                                dev->stats.tx_errors++;
1068
                                if (tx_status & T_NCL)
1069
                                        dev->stats.tx_carrier_errors++;
1070
                                if (tx_status & T_LCL)
1071
                                        dev->stats.tx_window_errors++;
1072
                                if (tx_status & T_CTU) {
1073
                                        if ((tx_status & T_COLL) ^ T_XUR) {
1074
                                                lp->pktStats.tx_underruns++;
1075
                                        } else {
1076
                                                lp->pktStats.excessive_underruns++;
1077
                                        }
1078
                                } else if (tx_status & T_COLL) {
1079
                                        if ((tx_status & T_COLL) ^ T_XCOLL) {
1080
                                                dev->stats.collisions++;
1081
                                        } else {
1082
                                                lp->pktStats.excessive_collisions++;
1083
                                        }
1084
                                }
1085
                        } else {
1086
                                dev->stats.tx_packets++;
1087
                        }
1088
                }
1089
        }
1090
 
1091
        return 0;
1092
}
1093
 
1094
static int ewrk3_close(struct net_device *dev)
1095
{
1096
        struct ewrk3_private *lp = netdev_priv(dev);
1097
        u_long iobase = dev->base_addr;
1098
        u_char icr, csr;
1099
 
1100
        netif_stop_queue(dev);
1101
 
1102
        if (ewrk3_debug > 1) {
1103
                printk("%s: Shutting down ethercard, status was %2.2x.\n",
1104
                       dev->name, inb(EWRK3_CSR));
1105
        }
1106
        /*
1107
           ** We stop the EWRK3 here... mask interrupts and stop TX & RX
1108
         */
1109
        DISABLE_IRQs;
1110
 
1111
        STOP_EWRK3;
1112
 
1113
        /*
1114
           ** Clean out the TX and RX queues here (note that one entry
1115
           ** may get added to either the TXD or RX queues if the TX or RX
1116
           ** just starts processing a packet before the STOP_EWRK3 command
1117
           ** is received. This will be flushed in the ewrk3_open() call).
1118
         */
1119
        while (inb(EWRK3_TQ));
1120
        while (inb(EWRK3_TDQ));
1121
        while (inb(EWRK3_RQ));
1122
 
1123
        if (!lp->hard_strapped) {
1124
                free_irq(dev->irq, dev);
1125
        }
1126
        return 0;
1127
}
1128
 
1129
/*
1130
   ** Set or clear the multicast filter for this adapter.
1131
 */
1132
static void set_multicast_list(struct net_device *dev)
1133
{
1134
        struct ewrk3_private *lp = netdev_priv(dev);
1135
        u_long iobase = dev->base_addr;
1136
        u_char csr;
1137
 
1138
        csr = inb(EWRK3_CSR);
1139
 
1140
        if (lp->shmem_length == IO_ONLY) {
1141
                lp->mctbl = NULL;
1142
        } else {
1143
                lp->mctbl = lp->shmem + PAGE0_HTE;
1144
        }
1145
 
1146
        csr &= ~(CSR_PME | CSR_MCE);
1147
        if (dev->flags & IFF_PROMISC) {         /* set promiscuous mode */
1148
                csr |= CSR_PME;
1149
                outb(csr, EWRK3_CSR);
1150
        } else {
1151
                SetMulticastFilter(dev);
1152
                csr |= CSR_MCE;
1153
                outb(csr, EWRK3_CSR);
1154
        }
1155
}
1156
 
1157
/*
1158
   ** Calculate the hash code and update the logical address filter
1159
   ** from a list of ethernet multicast addresses.
1160
   ** Little endian crc one liner from Matt Thomas, DEC.
1161
   **
1162
   ** Note that when clearing the table, the broadcast bit must remain asserted
1163
   ** to receive broadcast messages.
1164
 */
1165
static void SetMulticastFilter(struct net_device *dev)
1166
{
1167
        struct ewrk3_private *lp = netdev_priv(dev);
1168
        struct dev_mc_list *dmi = dev->mc_list;
1169
        u_long iobase = dev->base_addr;
1170
        int i;
1171
        char *addrs, bit, byte;
1172
        short __iomem *p = lp->mctbl;
1173
        u16 hashcode;
1174
        u32 crc;
1175
 
1176
        spin_lock_irq(&lp->hw_lock);
1177
 
1178
        if (lp->shmem_length == IO_ONLY) {
1179
                outb(0, EWRK3_IOPR);
1180
                outw(PAGE0_HTE, EWRK3_PIR1);
1181
        } else {
1182
                outb(0, EWRK3_MPR);
1183
        }
1184
 
1185
        if (dev->flags & IFF_ALLMULTI) {
1186
                for (i = 0; i < (HASH_TABLE_LEN >> 3); i++) {
1187
                        if (lp->shmem_length == IO_ONLY) {
1188
                                outb(0xff, EWRK3_DATA);
1189
                        } else {        /* memset didn't work here */
1190
                                writew(0xffff, p);
1191
                                p++;
1192
                                i++;
1193
                        }
1194
                }
1195
        } else {
1196
                /* Clear table except for broadcast bit */
1197
                if (lp->shmem_length == IO_ONLY) {
1198
                        for (i = 0; i < (HASH_TABLE_LEN >> 4) - 1; i++) {
1199
                                outb(0x00, EWRK3_DATA);
1200
                        }
1201
                        outb(0x80, EWRK3_DATA);
1202
                        i++;    /* insert the broadcast bit */
1203
                        for (; i < (HASH_TABLE_LEN >> 3); i++) {
1204
                                outb(0x00, EWRK3_DATA);
1205
                        }
1206
                } else {
1207
                        memset_io(lp->mctbl, 0, HASH_TABLE_LEN >> 3);
1208
                        writeb(0x80, lp->mctbl + (HASH_TABLE_LEN >> 4) - 1);
1209
                }
1210
 
1211
                /* Update table */
1212
                for (i = 0; i < dev->mc_count; i++) {    /* for each address in the list */
1213
                        addrs = dmi->dmi_addr;
1214
                        dmi = dmi->next;
1215
                        if ((*addrs & 0x01) == 1) {     /* multicast address? */
1216
                                crc = ether_crc_le(ETH_ALEN, addrs);
1217
                                hashcode = crc & ((1 << 9) - 1);        /* hashcode is 9 LSb of CRC */
1218
 
1219
                                byte = hashcode >> 3;   /* bit[3-8] -> byte in filter */
1220
                                bit = 1 << (hashcode & 0x07);   /* bit[0-2] -> bit in byte */
1221
 
1222
                                if (lp->shmem_length == IO_ONLY) {
1223
                                        u_char tmp;
1224
 
1225
                                        outw(PAGE0_HTE + byte, EWRK3_PIR1);
1226
                                        tmp = inb(EWRK3_DATA);
1227
                                        tmp |= bit;
1228
                                        outw(PAGE0_HTE + byte, EWRK3_PIR1);
1229
                                        outb(tmp, EWRK3_DATA);
1230
                                } else {
1231
                                        writeb(readb(lp->mctbl + byte) | bit, lp->mctbl + byte);
1232
                                }
1233
                        }
1234
                }
1235
        }
1236
 
1237
        spin_unlock_irq(&lp->hw_lock);
1238
}
1239
 
1240
/*
1241
   ** ISA bus I/O device probe
1242
 */
1243
static int __init isa_probe(struct net_device *dev, u_long ioaddr)
1244
{
1245
        int i = num_ewrks3s, maxSlots;
1246
        int ret = -ENODEV;
1247
 
1248
        u_long iobase;
1249
 
1250
        if (ioaddr >= 0x400)
1251
                goto out;
1252
 
1253
        if (ioaddr == 0) {       /* Autoprobing */
1254
                iobase = EWRK3_IO_BASE;         /* Get the first slot address */
1255
                maxSlots = 24;
1256
        } else {                /* Probe a specific location */
1257
                iobase = ioaddr;
1258
                maxSlots = i + 1;
1259
        }
1260
 
1261
        for (; (i < maxSlots) && (dev != NULL);
1262
             iobase += EWRK3_IOP_INC, i++)
1263
        {
1264
                if (request_region(iobase, EWRK3_TOTAL_SIZE, DRV_NAME)) {
1265
                        if (DevicePresent(iobase) == 0) {
1266
                                int irq = dev->irq;
1267
                                ret = ewrk3_hw_init(dev, iobase);
1268
                                if (!ret)
1269
                                        break;
1270
                                dev->irq = irq;
1271
                        }
1272
                        release_region(iobase, EWRK3_TOTAL_SIZE);
1273
                }
1274
        }
1275
 out:
1276
 
1277
        return ret;
1278
}
1279
 
1280
/*
1281
   ** EISA bus I/O device probe. Probe from slot 1 since slot 0 is usually
1282
   ** the motherboard.
1283
 */
1284
static int __init eisa_probe(struct net_device *dev, u_long ioaddr)
1285
{
1286
        int i, maxSlots;
1287
        u_long iobase;
1288
        int ret = -ENODEV;
1289
 
1290
        if (ioaddr < 0x1000)
1291
                goto out;
1292
 
1293
        iobase = ioaddr;
1294
        i = (ioaddr >> 12);
1295
        maxSlots = i + 1;
1296
 
1297
        for (i = 1; (i < maxSlots) && (dev != NULL); i++, iobase += EISA_SLOT_INC) {
1298
                if (EISA_signature(name, EISA_ID) == 0) {
1299
                        if (request_region(iobase, EWRK3_TOTAL_SIZE, DRV_NAME) &&
1300
                            DevicePresent(iobase) == 0) {
1301
                                int irq = dev->irq;
1302
                                ret = ewrk3_hw_init(dev, iobase);
1303
                                if (!ret)
1304
                                        break;
1305
                                dev->irq = irq;
1306
                        }
1307
                        release_region(iobase, EWRK3_TOTAL_SIZE);
1308
                }
1309
        }
1310
 
1311
 out:
1312
        return ret;
1313
}
1314
 
1315
 
1316
/*
1317
   ** Read the EWRK3 EEPROM using this routine
1318
 */
1319
static int Read_EEPROM(u_long iobase, u_char eaddr)
1320
{
1321
        int i;
1322
 
1323
        outb((eaddr & 0x3f), EWRK3_PIR1);       /* set up 6 bits of address info */
1324
        outb(EEPROM_RD, EWRK3_IOPR);    /* issue read command */
1325
        for (i = 0; i < 5000; i++)
1326
                inb(EWRK3_CSR); /* wait 1msec */
1327
 
1328
        return inw(EWRK3_EPROM1);       /* 16 bits data return */
1329
}
1330
 
1331
/*
1332
   ** Write the EWRK3 EEPROM using this routine
1333
 */
1334
static int Write_EEPROM(short data, u_long iobase, u_char eaddr)
1335
{
1336
        int i;
1337
 
1338
        outb(EEPROM_WR_EN, EWRK3_IOPR);         /* issue write enable command */
1339
        for (i = 0; i < 5000; i++)
1340
                inb(EWRK3_CSR); /* wait 1msec */
1341
        outw(data, EWRK3_EPROM1);       /* write data to register */
1342
        outb((eaddr & 0x3f), EWRK3_PIR1);       /* set up 6 bits of address info */
1343
        outb(EEPROM_WR, EWRK3_IOPR);    /* issue write command */
1344
        for (i = 0; i < 75000; i++)
1345
                inb(EWRK3_CSR); /* wait 15msec */
1346
        outb(EEPROM_WR_DIS, EWRK3_IOPR);        /* issue write disable command */
1347
        for (i = 0; i < 5000; i++)
1348
                inb(EWRK3_CSR); /* wait 1msec */
1349
 
1350
        return 0;
1351
}
1352
 
1353
/*
1354
   ** Look for a particular board name in the on-board EEPROM.
1355
 */
1356
static void __init EthwrkSignature(char *name, char *eeprom_image)
1357
{
1358
        int i;
1359
        char *signatures[] = EWRK3_SIGNATURE;
1360
 
1361
        for (i=0; *signatures[i] != '\0'; i++)
1362
                if( !strncmp(eeprom_image+EEPROM_PNAME7, signatures[i], strlen(signatures[i])) )
1363
                        break;
1364
 
1365
        if (*signatures[i] != '\0') {
1366
                memcpy(name, eeprom_image+EEPROM_PNAME7, EWRK3_STRLEN);
1367
                name[EWRK3_STRLEN] = '\0';
1368
        } else
1369
                name[0] = '\0';
1370
 
1371
        return;
1372
}
1373
 
1374
/*
1375
   ** Look for a special sequence in the Ethernet station address PROM that
1376
   ** is common across all EWRK3 products.
1377
   **
1378
   ** Search the Ethernet address ROM for the signature. Since the ROM address
1379
   ** counter can start at an arbitrary point, the search must include the entire
1380
   ** probe sequence length plus the (length_of_the_signature - 1).
1381
   ** Stop the search IMMEDIATELY after the signature is found so that the
1382
   ** PROM address counter is correctly positioned at the start of the
1383
   ** ethernet address for later read out.
1384
 */
1385
 
1386
static int __init DevicePresent(u_long iobase)
1387
{
1388
        union {
1389
                struct {
1390
                        u32 a;
1391
                        u32 b;
1392
                } llsig;
1393
                char Sig[sizeof(u32) << 1];
1394
        }
1395
        dev;
1396
        short sigLength;
1397
        char data;
1398
        int i, j, status = 0;
1399
 
1400
        dev.llsig.a = ETH_PROM_SIG;
1401
        dev.llsig.b = ETH_PROM_SIG;
1402
        sigLength = sizeof(u32) << 1;
1403
 
1404
        for (i = 0, j = 0; j < sigLength && i < PROBE_LENGTH + sigLength - 1; i++) {
1405
                data = inb(EWRK3_APROM);
1406
                if (dev.Sig[j] == data) {       /* track signature */
1407
                        j++;
1408
                } else {        /* lost signature; begin search again */
1409
                        if (data == dev.Sig[0]) {
1410
                                j = 1;
1411
                        } else {
1412
                                j = 0;
1413
                        }
1414
                }
1415
        }
1416
 
1417
        if (j != sigLength) {
1418
                status = -ENODEV;       /* search failed */
1419
        }
1420
        return status;
1421
}
1422
 
1423
static u_char __init get_hw_addr(struct net_device *dev, u_char * eeprom_image, char chipType)
1424
{
1425
        int i, j, k;
1426
        u_short chksum;
1427
        u_char crc, lfsr, sd, status = 0;
1428
        u_long iobase = dev->base_addr;
1429
        u16 tmp;
1430
 
1431
        if (chipType == LeMAC2) {
1432
                for (crc = 0x6a, j = 0; j < ETH_ALEN; j++) {
1433
                        sd = dev->dev_addr[j] = eeprom_image[EEPROM_PADDR0 + j];
1434
                        outb(dev->dev_addr[j], EWRK3_PAR0 + j);
1435
                        for (k = 0; k < 8; k++, sd >>= 1) {
1436
                                lfsr = ((((crc & 0x02) >> 1) ^ (crc & 0x01)) ^ (sd & 0x01)) << 7;
1437
                                crc = (crc >> 1) + lfsr;
1438
                        }
1439
                }
1440
                if (crc != eeprom_image[EEPROM_PA_CRC])
1441
                        status = -1;
1442
        } else {
1443
                for (i = 0, k = 0; i < ETH_ALEN;) {
1444
                        k <<= 1;
1445
                        if (k > 0xffff)
1446
                                k -= 0xffff;
1447
 
1448
                        k += (u_char) (tmp = inb(EWRK3_APROM));
1449
                        dev->dev_addr[i] = (u_char) tmp;
1450
                        outb(dev->dev_addr[i], EWRK3_PAR0 + i);
1451
                        i++;
1452
                        k += (u_short) ((tmp = inb(EWRK3_APROM)) << 8);
1453
                        dev->dev_addr[i] = (u_char) tmp;
1454
                        outb(dev->dev_addr[i], EWRK3_PAR0 + i);
1455
                        i++;
1456
 
1457
                        if (k > 0xffff)
1458
                                k -= 0xffff;
1459
                }
1460
                if (k == 0xffff)
1461
                        k = 0;
1462
                chksum = inb(EWRK3_APROM);
1463
                chksum |= (inb(EWRK3_APROM) << 8);
1464
                if (k != chksum)
1465
                        status = -1;
1466
        }
1467
 
1468
        return status;
1469
}
1470
 
1471
/*
1472
   ** Look for a particular board name in the EISA configuration space
1473
 */
1474
static int __init EISA_signature(char *name, s32 eisa_id)
1475
{
1476
        u_long i;
1477
        char *signatures[] = EWRK3_SIGNATURE;
1478
        char ManCode[EWRK3_STRLEN];
1479
        union {
1480
                s32 ID;
1481
                char Id[4];
1482
        } Eisa;
1483
        int status = 0;
1484
 
1485
        *name = '\0';
1486
        for (i = 0; i < 4; i++) {
1487
                Eisa.Id[i] = inb(eisa_id + i);
1488
        }
1489
 
1490
        ManCode[0] = (((Eisa.Id[0] >> 2) & 0x1f) + 0x40);
1491
        ManCode[1] = (((Eisa.Id[1] & 0xe0) >> 5) + ((Eisa.Id[0] & 0x03) << 3) + 0x40);
1492
        ManCode[2] = (((Eisa.Id[2] >> 4) & 0x0f) + 0x30);
1493
        ManCode[3] = ((Eisa.Id[2] & 0x0f) + 0x30);
1494
        ManCode[4] = (((Eisa.Id[3] >> 4) & 0x0f) + 0x30);
1495
        ManCode[5] = '\0';
1496
 
1497
        for (i = 0; (*signatures[i] != '\0') && (*name == '\0'); i++) {
1498
                if (strstr(ManCode, signatures[i]) != NULL) {
1499
                        strcpy(name, ManCode);
1500
                        status = 1;
1501
                }
1502
        }
1503
 
1504
        return status;          /* return the device name string */
1505
}
1506
 
1507
static void ewrk3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
1508
{
1509
        int fwrev = Read_EEPROM(dev->base_addr, EEPROM_REVLVL);
1510
 
1511
        strcpy(info->driver, DRV_NAME);
1512
        strcpy(info->version, DRV_VERSION);
1513
        sprintf(info->fw_version, "%d", fwrev);
1514
        strcpy(info->bus_info, "N/A");
1515
        info->eedump_len = EEPROM_MAX;
1516
}
1517
 
1518
static int ewrk3_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1519
{
1520
        struct ewrk3_private *lp = netdev_priv(dev);
1521
        unsigned long iobase = dev->base_addr;
1522
        u8 cr = inb(EWRK3_CR);
1523
 
1524
        switch (lp->adapter_name[4]) {
1525
        case '3': /* DE203 */
1526
                ecmd->supported = SUPPORTED_BNC;
1527
                ecmd->port = PORT_BNC;
1528
                break;
1529
 
1530
        case '4': /* DE204 */
1531
                ecmd->supported = SUPPORTED_TP;
1532
                ecmd->port = PORT_TP;
1533
                break;
1534
 
1535
        case '5': /* DE205 */
1536
                ecmd->supported = SUPPORTED_TP | SUPPORTED_BNC | SUPPORTED_AUI;
1537
                ecmd->autoneg = !(cr & CR_APD);
1538
                /*
1539
                ** Port is only valid if autoneg is disabled
1540
                ** and even then we don't know if AUI is jumpered.
1541
                */
1542
                if (!ecmd->autoneg)
1543
                        ecmd->port = (cr & CR_PSEL) ? PORT_BNC : PORT_TP;
1544
                break;
1545
        }
1546
 
1547
        ecmd->supported |= SUPPORTED_10baseT_Half;
1548
        ecmd->speed = SPEED_10;
1549
        ecmd->duplex = DUPLEX_HALF;
1550
        return 0;
1551
}
1552
 
1553
static int ewrk3_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1554
{
1555
        struct ewrk3_private *lp = netdev_priv(dev);
1556
        unsigned long iobase = dev->base_addr;
1557
        unsigned long flags;
1558
        u8 cr;
1559
 
1560
        /* DE205 is the only card with anything to set */
1561
        if (lp->adapter_name[4] != '5')
1562
                return -EOPNOTSUPP;
1563
 
1564
        /* Sanity-check parameters */
1565
        if (ecmd->speed != SPEED_10)
1566
                return -EINVAL;
1567
        if (ecmd->port != PORT_TP && ecmd->port != PORT_BNC)
1568
                return -EINVAL; /* AUI is not software-selectable */
1569
        if (ecmd->transceiver != XCVR_INTERNAL)
1570
                return -EINVAL;
1571
        if (ecmd->duplex != DUPLEX_HALF)
1572
                return -EINVAL;
1573
        if (ecmd->phy_address != 0)
1574
                return -EINVAL;
1575
 
1576
        spin_lock_irqsave(&lp->hw_lock, flags);
1577
        cr = inb(EWRK3_CR);
1578
 
1579
        /* If Autoneg is set, change to Auto Port mode */
1580
        /* Otherwise, disable Auto Port and set port explicitly */
1581
        if (ecmd->autoneg) {
1582
                cr &= ~CR_APD;
1583
        } else {
1584
                cr |= CR_APD;
1585
                if (ecmd->port == PORT_TP)
1586
                        cr &= ~CR_PSEL;         /* Force TP */
1587
                else
1588
                        cr |= CR_PSEL;          /* Force BNC */
1589
        }
1590
 
1591
        /* Commit the changes */
1592
        outb(cr, EWRK3_CR);
1593
        spin_unlock_irqrestore(&lp->hw_lock, flags);
1594
        return 0;
1595
}
1596
 
1597
static u32 ewrk3_get_link(struct net_device *dev)
1598
{
1599
        unsigned long iobase = dev->base_addr;
1600
        u8 cmr = inb(EWRK3_CMR);
1601
        /* DE203 has BNC only and link status does not apply */
1602
        /* On DE204 this is always valid since TP is the only port. */
1603
        /* On DE205 this reflects TP status even if BNC or AUI is selected. */
1604
        return !(cmr & CMR_LINK);
1605
}
1606
 
1607
static int ewrk3_phys_id(struct net_device *dev, u32 data)
1608
{
1609
        struct ewrk3_private *lp = netdev_priv(dev);
1610
        unsigned long iobase = dev->base_addr;
1611
        unsigned long flags;
1612
        u8 cr;
1613
        int count;
1614
 
1615
        /* Toggle LED 4x per second */
1616
        count = data << 2;
1617
 
1618
        spin_lock_irqsave(&lp->hw_lock, flags);
1619
 
1620
        /* Bail if a PHYS_ID is already in progress */
1621
        if (lp->led_mask == 0) {
1622
                spin_unlock_irqrestore(&lp->hw_lock, flags);
1623
                return -EBUSY;
1624
        }
1625
 
1626
        /* Prevent ISR from twiddling the LED */
1627
        lp->led_mask = 0;
1628
 
1629
        while (count--) {
1630
                /* Toggle the LED */
1631
                cr = inb(EWRK3_CR);
1632
                outb(cr ^ CR_LED, EWRK3_CR);
1633
 
1634
                /* Wait a little while */
1635
                spin_unlock_irqrestore(&lp->hw_lock, flags);
1636
                msleep(250);
1637
                spin_lock_irqsave(&lp->hw_lock, flags);
1638
 
1639
                /* Exit if we got a signal */
1640
                if (signal_pending(current))
1641
                        break;
1642
        }
1643
 
1644
        lp->led_mask = CR_LED;
1645
        cr = inb(EWRK3_CR);
1646
        outb(cr & ~CR_LED, EWRK3_CR);
1647
        spin_unlock_irqrestore(&lp->hw_lock, flags);
1648
        return signal_pending(current) ? -ERESTARTSYS : 0;
1649
}
1650
 
1651
static const struct ethtool_ops ethtool_ops_203 = {
1652
        .get_drvinfo = ewrk3_get_drvinfo,
1653
        .get_settings = ewrk3_get_settings,
1654
        .set_settings = ewrk3_set_settings,
1655
        .phys_id = ewrk3_phys_id,
1656
};
1657
 
1658
static const struct ethtool_ops ethtool_ops = {
1659
        .get_drvinfo = ewrk3_get_drvinfo,
1660
        .get_settings = ewrk3_get_settings,
1661
        .set_settings = ewrk3_set_settings,
1662
        .get_link = ewrk3_get_link,
1663
        .phys_id = ewrk3_phys_id,
1664
};
1665
 
1666
/*
1667
   ** Perform IOCTL call functions here. Some are privileged operations and the
1668
   ** effective uid is checked in those cases.
1669
 */
1670
static int ewrk3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1671
{
1672
        struct ewrk3_private *lp = netdev_priv(dev);
1673
        struct ewrk3_ioctl *ioc = (struct ewrk3_ioctl *) &rq->ifr_ifru;
1674
        u_long iobase = dev->base_addr;
1675
        int i, j, status = 0;
1676
        u_char csr;
1677
        unsigned long flags;
1678
        union ewrk3_addr {
1679
                u_char addr[HASH_TABLE_LEN * ETH_ALEN];
1680
                u_short val[(HASH_TABLE_LEN * ETH_ALEN) >> 1];
1681
        };
1682
 
1683
        union ewrk3_addr *tmp;
1684
 
1685
        /* All we handle are private IOCTLs */
1686
        if (cmd != EWRK3IOCTL)
1687
                return -EOPNOTSUPP;
1688
 
1689
        tmp = kmalloc(sizeof(union ewrk3_addr), GFP_KERNEL);
1690
        if(tmp==NULL)
1691
                return -ENOMEM;
1692
 
1693
        switch (ioc->cmd) {
1694
        case EWRK3_GET_HWADDR:  /* Get the hardware address */
1695
                for (i = 0; i < ETH_ALEN; i++) {
1696
                        tmp->addr[i] = dev->dev_addr[i];
1697
                }
1698
                ioc->len = ETH_ALEN;
1699
                if (copy_to_user(ioc->data, tmp->addr, ioc->len))
1700
                        status = -EFAULT;
1701
                break;
1702
 
1703
        case EWRK3_SET_HWADDR:  /* Set the hardware address */
1704
                if (capable(CAP_NET_ADMIN)) {
1705
                        spin_lock_irqsave(&lp->hw_lock, flags);
1706
                        csr = inb(EWRK3_CSR);
1707
                        csr |= (CSR_TXD | CSR_RXD);
1708
                        outb(csr, EWRK3_CSR);   /* Disable the TX and RX */
1709
                        spin_unlock_irqrestore(&lp->hw_lock, flags);
1710
 
1711
                        if (copy_from_user(tmp->addr, ioc->data, ETH_ALEN)) {
1712
                                status = -EFAULT;
1713
                                break;
1714
                        }
1715
                        spin_lock_irqsave(&lp->hw_lock, flags);
1716
                        for (i = 0; i < ETH_ALEN; i++) {
1717
                                dev->dev_addr[i] = tmp->addr[i];
1718
                                outb(tmp->addr[i], EWRK3_PAR0 + i);
1719
                        }
1720
 
1721
                        csr = inb(EWRK3_CSR);
1722
                        csr &= ~(CSR_TXD | CSR_RXD);    /* Enable the TX and RX */
1723
                        outb(csr, EWRK3_CSR);
1724
                        spin_unlock_irqrestore(&lp->hw_lock, flags);
1725
                } else {
1726
                        status = -EPERM;
1727
                }
1728
 
1729
                break;
1730
        case EWRK3_SET_PROM:    /* Set Promiscuous Mode */
1731
                if (capable(CAP_NET_ADMIN)) {
1732
                        spin_lock_irqsave(&lp->hw_lock, flags);
1733
                        csr = inb(EWRK3_CSR);
1734
                        csr |= CSR_PME;
1735
                        csr &= ~CSR_MCE;
1736
                        outb(csr, EWRK3_CSR);
1737
                        spin_unlock_irqrestore(&lp->hw_lock, flags);
1738
                } else {
1739
                        status = -EPERM;
1740
                }
1741
 
1742
                break;
1743
        case EWRK3_CLR_PROM:    /* Clear Promiscuous Mode */
1744
                if (capable(CAP_NET_ADMIN)) {
1745
                        spin_lock_irqsave(&lp->hw_lock, flags);
1746
                        csr = inb(EWRK3_CSR);
1747
                        csr &= ~CSR_PME;
1748
                        outb(csr, EWRK3_CSR);
1749
                        spin_unlock_irqrestore(&lp->hw_lock, flags);
1750
                } else {
1751
                        status = -EPERM;
1752
                }
1753
 
1754
                break;
1755
        case EWRK3_GET_MCA:     /* Get the multicast address table */
1756
                spin_lock_irqsave(&lp->hw_lock, flags);
1757
                if (lp->shmem_length == IO_ONLY) {
1758
                        outb(0, EWRK3_IOPR);
1759
                        outw(PAGE0_HTE, EWRK3_PIR1);
1760
                        for (i = 0; i < (HASH_TABLE_LEN >> 3); i++) {
1761
                                tmp->addr[i] = inb(EWRK3_DATA);
1762
                        }
1763
                } else {
1764
                        outb(0, EWRK3_MPR);
1765
                        memcpy_fromio(tmp->addr, lp->shmem + PAGE0_HTE, (HASH_TABLE_LEN >> 3));
1766
                }
1767
                spin_unlock_irqrestore(&lp->hw_lock, flags);
1768
 
1769
                ioc->len = (HASH_TABLE_LEN >> 3);
1770
                if (copy_to_user(ioc->data, tmp->addr, ioc->len))
1771
                        status = -EFAULT;
1772
 
1773
                break;
1774
        case EWRK3_SET_MCA:     /* Set a multicast address */
1775
                if (capable(CAP_NET_ADMIN)) {
1776
                        if (ioc->len > 1024)
1777
                        {
1778
                                status = -EINVAL;
1779
                                break;
1780
                        }
1781
                        if (copy_from_user(tmp->addr, ioc->data, ETH_ALEN * ioc->len)) {
1782
                                status = -EFAULT;
1783
                                break;
1784
                        }
1785
                        set_multicast_list(dev);
1786
                } else {
1787
                        status = -EPERM;
1788
                }
1789
 
1790
                break;
1791
        case EWRK3_CLR_MCA:     /* Clear all multicast addresses */
1792
                if (capable(CAP_NET_ADMIN)) {
1793
                        set_multicast_list(dev);
1794
                } else {
1795
                        status = -EPERM;
1796
                }
1797
 
1798
                break;
1799
        case EWRK3_MCA_EN:      /* Enable multicast addressing */
1800
                if (capable(CAP_NET_ADMIN)) {
1801
                        spin_lock_irqsave(&lp->hw_lock, flags);
1802
                        csr = inb(EWRK3_CSR);
1803
                        csr |= CSR_MCE;
1804
                        csr &= ~CSR_PME;
1805
                        outb(csr, EWRK3_CSR);
1806
                        spin_unlock_irqrestore(&lp->hw_lock, flags);
1807
                } else {
1808
                        status = -EPERM;
1809
                }
1810
 
1811
                break;
1812
        case EWRK3_GET_STATS: { /* Get the driver statistics */
1813
                struct ewrk3_stats *tmp_stats =
1814
                        kmalloc(sizeof(lp->pktStats), GFP_KERNEL);
1815
                if (!tmp_stats) {
1816
                        status = -ENOMEM;
1817
                        break;
1818
                }
1819
 
1820
                spin_lock_irqsave(&lp->hw_lock, flags);
1821
                memcpy(tmp_stats, &lp->pktStats, sizeof(lp->pktStats));
1822
                spin_unlock_irqrestore(&lp->hw_lock, flags);
1823
 
1824
                ioc->len = sizeof(lp->pktStats);
1825
                if (copy_to_user(ioc->data, tmp_stats, sizeof(lp->pktStats)))
1826
                        status = -EFAULT;
1827
                kfree(tmp_stats);
1828
                break;
1829
        }
1830
        case EWRK3_CLR_STATS:   /* Zero out the driver statistics */
1831
                if (capable(CAP_NET_ADMIN)) {
1832
                        spin_lock_irqsave(&lp->hw_lock, flags);
1833
                        memset(&lp->pktStats, 0, sizeof(lp->pktStats));
1834
                        spin_unlock_irqrestore(&lp->hw_lock,flags);
1835
                } else {
1836
                        status = -EPERM;
1837
                }
1838
 
1839
                break;
1840
        case EWRK3_GET_CSR:     /* Get the CSR Register contents */
1841
                tmp->addr[0] = inb(EWRK3_CSR);
1842
                ioc->len = 1;
1843
                if (copy_to_user(ioc->data, tmp->addr, ioc->len))
1844
                        status = -EFAULT;
1845
                break;
1846
        case EWRK3_SET_CSR:     /* Set the CSR Register contents */
1847
                if (capable(CAP_NET_ADMIN)) {
1848
                        if (copy_from_user(tmp->addr, ioc->data, 1)) {
1849
                                status = -EFAULT;
1850
                                break;
1851
                        }
1852
                        outb(tmp->addr[0], EWRK3_CSR);
1853
                } else {
1854
                        status = -EPERM;
1855
                }
1856
 
1857
                break;
1858
        case EWRK3_GET_EEPROM:  /* Get the EEPROM contents */
1859
                if (capable(CAP_NET_ADMIN)) {
1860
                        for (i = 0; i < (EEPROM_MAX >> 1); i++) {
1861
                                tmp->val[i] = (short) Read_EEPROM(iobase, i);
1862
                        }
1863
                        i = EEPROM_MAX;
1864
                        tmp->addr[i++] = inb(EWRK3_CMR);                /* Config/Management Reg. */
1865
                        for (j = 0; j < ETH_ALEN; j++) {
1866
                                tmp->addr[i++] = inb(EWRK3_PAR0 + j);
1867
                        }
1868
                        ioc->len = EEPROM_MAX + 1 + ETH_ALEN;
1869
                        if (copy_to_user(ioc->data, tmp->addr, ioc->len))
1870
                                status = -EFAULT;
1871
                } else {
1872
                        status = -EPERM;
1873
                }
1874
 
1875
                break;
1876
        case EWRK3_SET_EEPROM:  /* Set the EEPROM contents */
1877
                if (capable(CAP_NET_ADMIN)) {
1878
                        if (copy_from_user(tmp->addr, ioc->data, EEPROM_MAX)) {
1879
                                status = -EFAULT;
1880
                                break;
1881
                        }
1882
                        for (i = 0; i < (EEPROM_MAX >> 1); i++) {
1883
                                Write_EEPROM(tmp->val[i], iobase, i);
1884
                        }
1885
                } else {
1886
                        status = -EPERM;
1887
                }
1888
 
1889
                break;
1890
        case EWRK3_GET_CMR:     /* Get the CMR Register contents */
1891
                tmp->addr[0] = inb(EWRK3_CMR);
1892
                ioc->len = 1;
1893
                if (copy_to_user(ioc->data, tmp->addr, ioc->len))
1894
                        status = -EFAULT;
1895
                break;
1896
        case EWRK3_SET_TX_CUT_THRU:     /* Set TX cut through mode */
1897
                if (capable(CAP_NET_ADMIN)) {
1898
                        lp->txc = 1;
1899
                } else {
1900
                        status = -EPERM;
1901
                }
1902
 
1903
                break;
1904
        case EWRK3_CLR_TX_CUT_THRU:     /* Clear TX cut through mode */
1905
                if (capable(CAP_NET_ADMIN)) {
1906
                        lp->txc = 0;
1907
                } else {
1908
                        status = -EPERM;
1909
                }
1910
 
1911
                break;
1912
        default:
1913
                status = -EOPNOTSUPP;
1914
        }
1915
        kfree(tmp);
1916
        return status;
1917
}
1918
 
1919
#ifdef MODULE
1920
static struct net_device *ewrk3_devs[MAX_NUM_EWRK3S];
1921
static int ndevs;
1922
static int io[MAX_NUM_EWRK3S+1] = { 0x300, 0, };
1923
 
1924
/* '21' below should really be 'MAX_NUM_EWRK3S' */
1925
module_param_array(io, int, NULL, 0);
1926
module_param_array(irq, int, NULL, 0);
1927
MODULE_PARM_DESC(io, "EtherWORKS 3 I/O base address(es)");
1928
MODULE_PARM_DESC(irq, "EtherWORKS 3 IRQ number(s)");
1929
 
1930
static __exit void ewrk3_exit_module(void)
1931
{
1932
        int i;
1933
 
1934
        for( i=0; i<ndevs; i++ ) {
1935
                struct net_device *dev = ewrk3_devs[i];
1936
                struct ewrk3_private *lp = netdev_priv(dev);
1937
                ewrk3_devs[i] = NULL;
1938
                unregister_netdev(dev);
1939
                release_region(dev->base_addr, EWRK3_TOTAL_SIZE);
1940
                iounmap(lp->shmem);
1941
                free_netdev(dev);
1942
        }
1943
}
1944
 
1945
static __init int ewrk3_init_module(void)
1946
{
1947
        int i=0;
1948
 
1949
        while( io[i] && irq[i] ) {
1950
                struct net_device *dev
1951
                        = alloc_etherdev(sizeof(struct ewrk3_private));
1952
 
1953
                if (!dev)
1954
                        break;
1955
 
1956
                if (ewrk3_probe1(dev, io[i], irq[i]) != 0) {
1957
                        free_netdev(dev);
1958
                        break;
1959
                }
1960
 
1961
                ewrk3_devs[ndevs++] = dev;
1962
                i++;
1963
        }
1964
 
1965
        return ndevs ? 0 : -EIO;
1966
}
1967
 
1968
 
1969
/* Hack for breakage in new module stuff */
1970
module_exit(ewrk3_exit_module);
1971
module_init(ewrk3_init_module);
1972
#endif                          /* MODULE */
1973
MODULE_LICENSE("GPL");
1974
 
1975
 
1976
 
1977
/*
1978
 * Local variables:
1979
 *  compile-command: "gcc -D__KERNEL__ -I/linux/include -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce -malign-loops=2 -malign-jumps=2 -malign-functions=2 -O2 -m486 -c ewrk3.c"
1980
 *
1981
 *  compile-command: "gcc -D__KERNEL__ -DMODULE -I/linux/include -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce -malign-loops=2 -malign-jumps=2 -malign-functions=2 -O2 -m486 -c ewrk3.c"
1982
 * End:
1983
 */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.