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

Subversion Repositories test_project

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/* cs89x0.c: A Crystal Semiconductor (Now Cirrus Logic) CS89[02]0
2
 *  driver for linux.
3
 */
4
 
5
/*
6
        Written 1996 by Russell Nelson, with reference to skeleton.c
7
        written 1993-1994 by Donald Becker.
8
 
9
        This software may be used and distributed according to the terms
10
        of the GNU General Public License, incorporated herein by reference.
11
 
12
        The author may be reached at nelson@crynwr.com, Crynwr
13
        Software, 521 Pleasant Valley Rd., Potsdam, NY 13676
14
 
15
  Changelog:
16
 
17
  Mike Cruse        : mcruse@cti-ltd.com
18
                    : Changes for Linux 2.0 compatibility.
19
                    : Added dev_id parameter in net_interrupt(),
20
                    : request_irq() and free_irq(). Just NULL for now.
21
 
22
  Mike Cruse        : Added MOD_INC_USE_COUNT and MOD_DEC_USE_COUNT macros
23
                    : in net_open() and net_close() so kerneld would know
24
                    : that the module is in use and wouldn't eject the
25
                    : driver prematurely.
26
 
27
  Mike Cruse        : Rewrote init_module() and cleanup_module using 8390.c
28
                    : as an example. Disabled autoprobing in init_module(),
29
                    : not a good thing to do to other devices while Linux
30
                    : is running from all accounts.
31
 
32
  Russ Nelson       : Jul 13 1998.  Added RxOnly DMA support.
33
 
34
  Melody Lee        : Aug 10 1999.  Changes for Linux 2.2.5 compatibility.
35
                    : email: ethernet@crystal.cirrus.com
36
 
37
  Alan Cox          : Removed 1.2 support, added 2.1 extra counters.
38
 
39
  Andrew Morton     : andrewm@uow.edu.au
40
                    : Kernel 2.3.48
41
                    : Handle kmalloc() failures
42
                    : Other resource allocation fixes
43
                    : Add SMP locks
44
                    : Integrate Russ Nelson's ALLOW_DMA functionality back in.
45
                    : If ALLOW_DMA is true, make DMA runtime selectable
46
                    : Folded in changes from Cirrus (Melody Lee
47
                    : <klee@crystal.cirrus.com>)
48
                    : Don't call netif_wake_queue() in net_send_packet()
49
                    : Fixed an out-of-mem bug in dma_rx()
50
                    : Updated Documentation/networking/cs89x0.txt
51
 
52
  Andrew Morton     : andrewm@uow.edu.au / Kernel 2.3.99-pre1
53
                    : Use skb_reserve to longword align IP header (two places)
54
                    : Remove a delay loop from dma_rx()
55
                    : Replace '100' with HZ
56
                    : Clean up a couple of skb API abuses
57
                    : Added 'cs89x0_dma=N' kernel boot option
58
                    : Correctly initialise lp->lock in non-module compile
59
 
60
  Andrew Morton     : andrewm@uow.edu.au / Kernel 2.3.99-pre4-1
61
                    : MOD_INC/DEC race fix (see
62
                    : http://www.uwsg.indiana.edu/hypermail/linux/kernel/0003.3/1532.html)
63
 
64
  Andrew Morton     : andrewm@uow.edu.au / Kernel 2.4.0-test7-pre2
65
                    : Enhanced EEPROM support to cover more devices,
66
                    :   abstracted IRQ mapping to support CONFIG_ARCH_CLPS7500 arch
67
                    :   (Jason Gunthorpe <jgg@ualberta.ca>)
68
 
69
  Andrew Morton     : Kernel 2.4.0-test11-pre4
70
                    : Use dev->name in request_*() (Andrey Panin)
71
                    : Fix an error-path memleak in init_module()
72
                    : Preserve return value from request_irq()
73
                    : Fix type of `media' module parm (Keith Owens)
74
                    : Use SET_MODULE_OWNER()
75
                    : Tidied up strange request_irq() abuse in net_open().
76
 
77
  Andrew Morton     : Kernel 2.4.3-pre1
78
                    : Request correct number of pages for DMA (Hugh Dickens)
79
                    : Select PP_ChipID _after_ unregister_netdev in cleanup_module()
80
                    :  because unregister_netdev() calls get_stats.
81
                    : Make `version[]' __initdata
82
                    : Uninlined the read/write reg/word functions.
83
 
84
  Oskar Schirmer    : oskar@scara.com
85
                    : HiCO.SH4 (superh) support added (irq#1, cs89x0_media=)
86
 
87
  Deepak Saxena     : dsaxena@plexity.net
88
                    : Intel IXDP2x01 (XScale ixp2x00 NPU) platform support
89
 
90
  Dmitry Pervushin  : dpervushin@ru.mvista.com
91
                    : PNX010X platform support
92
 
93
  Deepak Saxena     : dsaxena@plexity.net
94
                    : Intel IXDP2351 platform support
95
 
96
  Dmitry Pervushin  : dpervushin@ru.mvista.com
97
                    : PNX010X platform support
98
 
99
*/
100
 
101
/* Always include 'config.h' first in case the user wants to turn on
102
   or override something. */
103
#include <linux/module.h>
104
 
105
/*
106
 * Set this to zero to disable DMA code
107
 *
108
 * Note that even if DMA is turned off we still support the 'dma' and  'use_dma'
109
 * module options so we don't break any startup scripts.
110
 */
111
#ifndef CONFIG_ISA_DMA_API
112
#define ALLOW_DMA       0
113
#else
114
#define ALLOW_DMA       1
115
#endif
116
 
117
/*
118
 * Set this to zero to remove all the debug statements via
119
 * dead code elimination
120
 */
121
#define DEBUGGING       1
122
 
123
/*
124
  Sources:
125
 
126
        Crynwr packet driver epktisa.
127
 
128
        Crystal Semiconductor data sheets.
129
 
130
*/
131
 
132
#include <linux/errno.h>
133
#include <linux/netdevice.h>
134
#include <linux/etherdevice.h>
135
#include <linux/kernel.h>
136
#include <linux/types.h>
137
#include <linux/fcntl.h>
138
#include <linux/interrupt.h>
139
#include <linux/ioport.h>
140
#include <linux/in.h>
141
#include <linux/skbuff.h>
142
#include <linux/slab.h>
143
#include <linux/spinlock.h>
144
#include <linux/string.h>
145
#include <linux/init.h>
146
#include <linux/bitops.h>
147
#include <linux/delay.h>
148
 
149
#include <asm/system.h>
150
#include <asm/io.h>
151
#include <asm/irq.h>
152
#if ALLOW_DMA
153
#include <asm/dma.h>
154
#endif
155
 
156
#include "cs89x0.h"
157
 
158
static char version[] __initdata =
159
"cs89x0.c: v2.4.3-pre1 Russell Nelson <nelson@crynwr.com>, Andrew Morton <andrewm@uow.edu.au>\n";
160
 
161
#define DRV_NAME "cs89x0"
162
 
163
/* First, a few definitions that the brave might change.
164
   A zero-terminated list of I/O addresses to be probed. Some special flags..
165
      Addr & 1 = Read back the address port, look for signature and reset
166
                 the page window before probing
167
      Addr & 3 = Reset the page window and probe
168
   The CLPS eval board has the Cirrus chip at 0x80090300, in ARM IO space,
169
   but it is possible that a Cirrus board could be plugged into the ISA
170
   slots. */
171
/* The cs8900 has 4 IRQ pins, software selectable. cs8900_irq_map maps
172
   them to system IRQ numbers. This mapping is card specific and is set to
173
   the configuration of the Cirrus Eval board for this chip. */
174
#ifdef CONFIG_ARCH_CLPS7500
175
static unsigned int netcard_portlist[] __initdata =
176
   { 0x80090303, 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
177
static unsigned int cs8900_irq_map[] = {12,0,0,0};
178
#elif defined(CONFIG_SH_HICOSH4)
179
static unsigned int netcard_portlist[] __initdata =
180
   { 0x0300, 0};
181
static unsigned int cs8900_irq_map[] = {1,0,0,0};
182
#elif defined(CONFIG_MACH_IXDP2351)
183
static unsigned int netcard_portlist[] __initdata = {IXDP2351_VIRT_CS8900_BASE, 0};
184
static unsigned int cs8900_irq_map[] = {IRQ_IXDP2351_CS8900, 0, 0, 0};
185
#include <asm/irq.h>
186
#elif defined(CONFIG_ARCH_IXDP2X01)
187
#include <asm/irq.h>
188
static unsigned int netcard_portlist[] __initdata = {IXDP2X01_CS8900_VIRT_BASE, 0};
189
static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0};
190
#elif defined(CONFIG_ARCH_PNX010X)
191
#include <asm/irq.h>
192
#include <asm/arch/gpio.h>
193
#define CIRRUS_DEFAULT_BASE     IO_ADDRESS(EXT_STATIC2_s0_BASE + 0x200000)      /* = Physical address 0x48200000 */
194
#define CIRRUS_DEFAULT_IRQ      VH_INTC_INT_NUM_CASCADED_INTERRUPT_1 /* Event inputs bank 1 - ID 35/bit 3 */
195
static unsigned int netcard_portlist[] __initdata = {CIRRUS_DEFAULT_BASE, 0};
196
static unsigned int cs8900_irq_map[] = {CIRRUS_DEFAULT_IRQ, 0, 0, 0};
197
#else
198
static unsigned int netcard_portlist[] __initdata =
199
   { 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
200
static unsigned int cs8900_irq_map[] = {10,11,12,5};
201
#endif
202
 
203
#if DEBUGGING
204
static unsigned int net_debug = DEBUGGING;
205
#else
206
#define net_debug 0     /* gcc will remove all the debug code for us */
207
#endif
208
 
209
/* The number of low I/O ports used by the ethercard. */
210
#define NETCARD_IO_EXTENT       16
211
 
212
/* we allow the user to override various values normally set in the EEPROM */
213
#define FORCE_RJ45      0x0001    /* pick one of these three */
214
#define FORCE_AUI       0x0002
215
#define FORCE_BNC       0x0004
216
 
217
#define FORCE_AUTO      0x0010    /* pick one of these three */
218
#define FORCE_HALF      0x0020
219
#define FORCE_FULL      0x0030
220
 
221
/* Information that need to be kept for each board. */
222
struct net_local {
223
        struct net_device_stats stats;
224
        int chip_type;          /* one of: CS8900, CS8920, CS8920M */
225
        char chip_revision;     /* revision letter of the chip ('A'...) */
226
        int send_cmd;           /* the proper send command: TX_NOW, TX_AFTER_381, or TX_AFTER_ALL */
227
        int auto_neg_cnf;       /* auto-negotiation word from EEPROM */
228
        int adapter_cnf;        /* adapter configuration from EEPROM */
229
        int isa_config;         /* ISA configuration from EEPROM */
230
        int irq_map;            /* IRQ map from EEPROM */
231
        int rx_mode;            /* what mode are we in? 0, RX_MULTCAST_ACCEPT, or RX_ALL_ACCEPT */
232
        int curr_rx_cfg;        /* a copy of PP_RxCFG */
233
        int linectl;            /* either 0 or LOW_RX_SQUELCH, depending on configuration. */
234
        int send_underrun;      /* keep track of how many underruns in a row we get */
235
        int force;              /* force various values; see FORCE* above. */
236
        spinlock_t lock;
237
#if ALLOW_DMA
238
        int use_dma;            /* Flag: we're using dma */
239
        int dma;                /* DMA channel */
240
        int dmasize;            /* 16 or 64 */
241
        unsigned char *dma_buff;        /* points to the beginning of the buffer */
242
        unsigned char *end_dma_buff;    /* points to the end of the buffer */
243
        unsigned char *rx_dma_ptr;      /* points to the next packet  */
244
#endif
245
};
246
 
247
/* Index to functions, as function prototypes. */
248
 
249
static int cs89x0_probe1(struct net_device *dev, int ioaddr, int modular);
250
static int net_open(struct net_device *dev);
251
static int net_send_packet(struct sk_buff *skb, struct net_device *dev);
252
static irqreturn_t net_interrupt(int irq, void *dev_id);
253
static void set_multicast_list(struct net_device *dev);
254
static void net_timeout(struct net_device *dev);
255
static void net_rx(struct net_device *dev);
256
static int net_close(struct net_device *dev);
257
static struct net_device_stats *net_get_stats(struct net_device *dev);
258
static void reset_chip(struct net_device *dev);
259
static int get_eeprom_data(struct net_device *dev, int off, int len, int *buffer);
260
static int get_eeprom_cksum(int off, int len, int *buffer);
261
static int set_mac_address(struct net_device *dev, void *addr);
262
static void count_rx_errors(int status, struct net_local *lp);
263
#ifdef CONFIG_NET_POLL_CONTROLLER
264
static void net_poll_controller(struct net_device *dev);
265
#endif
266
#if ALLOW_DMA
267
static void get_dma_channel(struct net_device *dev);
268
static void release_dma_buff(struct net_local *lp);
269
#endif
270
 
271
/* Example routines you must write ;->. */
272
#define tx_done(dev) 1
273
 
274
/*
275
 * Permit 'cs89x0_dma=N' in the kernel boot environment
276
 */
277
#if !defined(MODULE) && (ALLOW_DMA != 0)
278
static int g_cs89x0_dma;
279
 
280
static int __init dma_fn(char *str)
281
{
282
        g_cs89x0_dma = simple_strtol(str,NULL,0);
283
        return 1;
284
}
285
 
286
__setup("cs89x0_dma=", dma_fn);
287
#endif  /* !defined(MODULE) && (ALLOW_DMA != 0) */
288
 
289
#ifndef MODULE
290
static int g_cs89x0_media__force;
291
 
292
static int __init media_fn(char *str)
293
{
294
        if (!strcmp(str, "rj45")) g_cs89x0_media__force = FORCE_RJ45;
295
        else if (!strcmp(str, "aui")) g_cs89x0_media__force = FORCE_AUI;
296
        else if (!strcmp(str, "bnc")) g_cs89x0_media__force = FORCE_BNC;
297
        return 1;
298
}
299
 
300
__setup("cs89x0_media=", media_fn);
301
 
302
 
303
/* Check for a network adaptor of this type, and return '0' iff one exists.
304
   If dev->base_addr == 0, probe all likely locations.
305
   If dev->base_addr == 1, always return failure.
306
   If dev->base_addr == 2, allocate space for the device and return success
307
   (detachable devices only).
308
   Return 0 on success.
309
   */
310
 
311
struct net_device * __init cs89x0_probe(int unit)
312
{
313
        struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
314
        unsigned *port;
315
        int err = 0;
316
        int irq;
317
        int io;
318
 
319
        if (!dev)
320
                return ERR_PTR(-ENODEV);
321
 
322
        sprintf(dev->name, "eth%d", unit);
323
        netdev_boot_setup_check(dev);
324
        io = dev->base_addr;
325
        irq = dev->irq;
326
 
327
        if (net_debug)
328
                printk("cs89x0:cs89x0_probe(0x%x)\n", io);
329
 
330
        if (io > 0x1ff) {       /* Check a single specified location. */
331
                err = cs89x0_probe1(dev, io, 0);
332
        } else if (io != 0) {    /* Don't probe at all. */
333
                err = -ENXIO;
334
        } else {
335
                for (port = netcard_portlist; *port; port++) {
336
                        if (cs89x0_probe1(dev, *port, 0) == 0)
337
                                break;
338
                        dev->irq = irq;
339
                }
340
                if (!*port)
341
                        err = -ENODEV;
342
        }
343
        if (err)
344
                goto out;
345
        return dev;
346
out:
347
        free_netdev(dev);
348
        printk(KERN_WARNING "cs89x0: no cs8900 or cs8920 detected.  Be sure to disable PnP with SETUP\n");
349
        return ERR_PTR(err);
350
}
351
#endif
352
 
353
#if defined(CONFIG_MACH_IXDP2351)
354
static u16
355
readword(unsigned long base_addr, int portno)
356
{
357
        return __raw_readw(base_addr + (portno << 1));
358
}
359
 
360
static void
361
writeword(unsigned long base_addr, int portno, u16 value)
362
{
363
        __raw_writew(value, base_addr + (portno << 1));
364
}
365
#elif defined(CONFIG_ARCH_IXDP2X01)
366
static u16
367
readword(unsigned long base_addr, int portno)
368
{
369
        return __raw_readl(base_addr + (portno << 1));
370
}
371
 
372
static void
373
writeword(unsigned long base_addr, int portno, u16 value)
374
{
375
        __raw_writel(value, base_addr + (portno << 1));
376
}
377
#elif defined(CONFIG_ARCH_PNX010X)
378
static u16
379
readword(unsigned long base_addr, int portno)
380
{
381
        return inw(base_addr + (portno << 1));
382
}
383
 
384
static void
385
writeword(unsigned long base_addr, int portno, u16 value)
386
{
387
        outw(value, base_addr + (portno << 1));
388
}
389
#else
390
static u16
391
readword(unsigned long base_addr, int portno)
392
{
393
        return inw(base_addr + portno);
394
}
395
 
396
static void
397
writeword(unsigned long base_addr, int portno, u16 value)
398
{
399
        outw(value, base_addr + portno);
400
}
401
#endif
402
 
403
static void
404
readwords(unsigned long base_addr, int portno, void *buf, int length)
405
{
406
        u8 *buf8 = (u8 *)buf;
407
 
408
        do {
409
                u16 tmp16;
410
 
411
                tmp16 = readword(base_addr, portno);
412
                *buf8++ = (u8)tmp16;
413
                *buf8++ = (u8)(tmp16 >> 8);
414
        } while (--length);
415
}
416
 
417
static void
418
writewords(unsigned long base_addr, int portno, void *buf, int length)
419
{
420
        u8 *buf8 = (u8 *)buf;
421
 
422
        do {
423
                u16 tmp16;
424
 
425
                tmp16 = *buf8++;
426
                tmp16 |= (*buf8++) << 8;
427
                writeword(base_addr, portno, tmp16);
428
        } while (--length);
429
}
430
 
431
static u16
432
readreg(struct net_device *dev, u16 regno)
433
{
434
        writeword(dev->base_addr, ADD_PORT, regno);
435
        return readword(dev->base_addr, DATA_PORT);
436
}
437
 
438
static void
439
writereg(struct net_device *dev, u16 regno, u16 value)
440
{
441
        writeword(dev->base_addr, ADD_PORT, regno);
442
        writeword(dev->base_addr, DATA_PORT, value);
443
}
444
 
445
static int __init
446
wait_eeprom_ready(struct net_device *dev)
447
{
448
        int timeout = jiffies;
449
        /* check to see if the EEPROM is ready, a timeout is used -
450
           just in case EEPROM is ready when SI_BUSY in the
451
           PP_SelfST is clear */
452
        while(readreg(dev, PP_SelfST) & SI_BUSY)
453
                if (jiffies - timeout >= 40)
454
                        return -1;
455
        return 0;
456
}
457
 
458
static int __init
459
get_eeprom_data(struct net_device *dev, int off, int len, int *buffer)
460
{
461
        int i;
462
 
463
        if (net_debug > 3) printk("EEPROM data from %x for %x:\n",off,len);
464
        for (i = 0; i < len; i++) {
465
                if (wait_eeprom_ready(dev) < 0) return -1;
466
                /* Now send the EEPROM read command and EEPROM location to read */
467
                writereg(dev, PP_EECMD, (off + i) | EEPROM_READ_CMD);
468
                if (wait_eeprom_ready(dev) < 0) return -1;
469
                buffer[i] = readreg(dev, PP_EEData);
470
                if (net_debug > 3) printk("%04x ", buffer[i]);
471
        }
472
        if (net_debug > 3) printk("\n");
473
        return 0;
474
}
475
 
476
static int  __init
477
get_eeprom_cksum(int off, int len, int *buffer)
478
{
479
        int i, cksum;
480
 
481
        cksum = 0;
482
        for (i = 0; i < len; i++)
483
                cksum += buffer[i];
484
        cksum &= 0xffff;
485
        if (cksum == 0)
486
                return 0;
487
        return -1;
488
}
489
 
490
#ifdef CONFIG_NET_POLL_CONTROLLER
491
/*
492
 * Polling receive - used by netconsole and other diagnostic tools
493
 * to allow network i/o with interrupts disabled.
494
 */
495
static void net_poll_controller(struct net_device *dev)
496
{
497
        disable_irq(dev->irq);
498
        net_interrupt(dev->irq, dev);
499
        enable_irq(dev->irq);
500
}
501
#endif
502
 
503
/* This is the real probe routine.  Linux has a history of friendly device
504
   probes on the ISA bus.  A good device probes avoids doing writes, and
505
   verifies that the correct device exists and functions.
506
   Return 0 on success.
507
 */
508
 
509
static int __init
510
cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)
511
{
512
        struct net_local *lp = netdev_priv(dev);
513
        static unsigned version_printed;
514
        int i;
515
        int tmp;
516
        unsigned rev_type = 0;
517
        int eeprom_buff[CHKSUM_LEN];
518
        int retval;
519
        DECLARE_MAC_BUF(mac);
520
 
521
        /* Initialize the device structure. */
522
        if (!modular) {
523
                memset(lp, 0, sizeof(*lp));
524
                spin_lock_init(&lp->lock);
525
#ifndef MODULE
526
#if ALLOW_DMA
527
                if (g_cs89x0_dma) {
528
                        lp->use_dma = 1;
529
                        lp->dma = g_cs89x0_dma;
530
                        lp->dmasize = 16;       /* Could make this an option... */
531
                }
532
#endif
533
                lp->force = g_cs89x0_media__force;
534
#endif
535
        }
536
 
537
#ifdef CONFIG_ARCH_PNX010X
538
        initialize_ebi();
539
 
540
        /* Map GPIO registers for the pins connected to the CS8900a. */
541
        if (map_cirrus_gpio() < 0)
542
                return -ENODEV;
543
 
544
        reset_cirrus();
545
 
546
        /* Map event-router registers. */
547
        if (map_event_router() < 0)
548
                return -ENODEV;
549
 
550
        enable_cirrus_irq();
551
 
552
        unmap_cirrus_gpio();
553
        unmap_event_router();
554
 
555
        dev->base_addr = ioaddr;
556
 
557
        for (i = 0 ; i < 3 ; i++)
558
                readreg(dev, 0);
559
#endif
560
 
561
        /* Grab the region so we can find another board if autoIRQ fails. */
562
        /* WTF is going on here? */
563
        if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, DRV_NAME)) {
564
                printk(KERN_ERR "%s: request_region(0x%x, 0x%x) failed\n",
565
                                DRV_NAME, ioaddr, NETCARD_IO_EXTENT);
566
                retval = -EBUSY;
567
                goto out1;
568
        }
569
 
570
#ifdef CONFIG_SH_HICOSH4
571
        /* truely reset the chip */
572
        writeword(ioaddr, ADD_PORT, 0x0114);
573
        writeword(ioaddr, DATA_PORT, 0x0040);
574
#endif
575
 
576
        /* if they give us an odd I/O address, then do ONE write to
577
           the address port, to get it back to address zero, where we
578
           expect to find the EISA signature word. An IO with a base of 0x3
579
           will skip the test for the ADD_PORT. */
580
        if (ioaddr & 1) {
581
                if (net_debug > 1)
582
                        printk(KERN_INFO "%s: odd ioaddr 0x%x\n", dev->name, ioaddr);
583
                if ((ioaddr & 2) != 2)
584
                        if ((readword(ioaddr & ~3, ADD_PORT) & ADD_MASK) != ADD_SIG) {
585
                                printk(KERN_ERR "%s: bad signature 0x%x\n",
586
                                        dev->name, readword(ioaddr & ~3, ADD_PORT));
587
                                retval = -ENODEV;
588
                                goto out2;
589
                        }
590
        }
591
 
592
        ioaddr &= ~3;
593
        printk(KERN_DEBUG "PP_addr at %x[%x]: 0x%x\n",
594
                        ioaddr, ADD_PORT, readword(ioaddr, ADD_PORT));
595
        writeword(ioaddr, ADD_PORT, PP_ChipID);
596
 
597
        tmp = readword(ioaddr, DATA_PORT);
598
        if (tmp != CHIP_EISA_ID_SIG) {
599
                printk(KERN_DEBUG "%s: incorrect signature at %x[%x]: 0x%x!="
600
                        CHIP_EISA_ID_SIG_STR "\n",
601
                        dev->name, ioaddr, DATA_PORT, tmp);
602
                retval = -ENODEV;
603
                goto out2;
604
        }
605
 
606
        /* Fill in the 'dev' fields. */
607
        dev->base_addr = ioaddr;
608
 
609
        /* get the chip type */
610
        rev_type = readreg(dev, PRODUCT_ID_ADD);
611
        lp->chip_type = rev_type &~ REVISON_BITS;
612
        lp->chip_revision = ((rev_type & REVISON_BITS) >> 8) + 'A';
613
 
614
        /* Check the chip type and revision in order to set the correct send command
615
        CS8920 revision C and CS8900 revision F can use the faster send. */
616
        lp->send_cmd = TX_AFTER_381;
617
        if (lp->chip_type == CS8900 && lp->chip_revision >= 'F')
618
                lp->send_cmd = TX_NOW;
619
        if (lp->chip_type != CS8900 && lp->chip_revision >= 'C')
620
                lp->send_cmd = TX_NOW;
621
 
622
        if (net_debug  &&  version_printed++ == 0)
623
                printk(version);
624
 
625
        printk(KERN_INFO "%s: cs89%c0%s rev %c found at %#3lx ",
626
               dev->name,
627
               lp->chip_type==CS8900?'0':'2',
628
               lp->chip_type==CS8920M?"M":"",
629
               lp->chip_revision,
630
               dev->base_addr);
631
 
632
        reset_chip(dev);
633
 
634
        /* Here we read the current configuration of the chip. If there
635
           is no Extended EEPROM then the idea is to not disturb the chip
636
           configuration, it should have been correctly setup by automatic
637
           EEPROM read on reset. So, if the chip says it read the EEPROM
638
           the driver will always do *something* instead of complain that
639
           adapter_cnf is 0. */
640
 
641
#ifdef CONFIG_SH_HICOSH4
642
        if (1) {
643
                /* For the HiCO.SH4 board, things are different: we don't
644
                   have EEPROM, but there is some data in flash, so we go
645
                   get it there directly (MAC). */
646
                __u16 *confd;
647
                short cnt;
648
                if (((* (volatile __u32 *) 0xa0013ff0) & 0x00ffffff)
649
                        == 0x006c3000) {
650
                        confd = (__u16*) 0xa0013fc0;
651
                } else {
652
                        confd = (__u16*) 0xa001ffc0;
653
                }
654
                cnt = (*confd++ & 0x00ff) >> 1;
655
                while (--cnt > 0) {
656
                        __u16 j = *confd++;
657
 
658
                        switch (j & 0x0fff) {
659
                        case PP_IA:
660
                                for (i = 0; i < ETH_ALEN/2; i++) {
661
                                        dev->dev_addr[i*2] = confd[i] & 0xFF;
662
                                        dev->dev_addr[i*2+1] = confd[i] >> 8;
663
                                }
664
                                break;
665
                        }
666
                        j = (j >> 12) + 1;
667
                        confd += j;
668
                        cnt -= j;
669
                }
670
        } else
671
#endif
672
 
673
        if ((readreg(dev, PP_SelfST) & (EEPROM_OK | EEPROM_PRESENT)) ==
674
              (EEPROM_OK|EEPROM_PRESENT)) {
675
                /* Load the MAC. */
676
                for (i=0; i < ETH_ALEN/2; i++) {
677
                        unsigned int Addr;
678
                        Addr = readreg(dev, PP_IA+i*2);
679
                        dev->dev_addr[i*2] = Addr & 0xFF;
680
                        dev->dev_addr[i*2+1] = Addr >> 8;
681
                }
682
 
683
                /* Load the Adapter Configuration.
684
                   Note:  Barring any more specific information from some
685
                   other source (ie EEPROM+Schematics), we would not know
686
                   how to operate a 10Base2 interface on the AUI port.
687
                   However, since we  do read the status of HCB1 and use
688
                   settings that always result in calls to control_dc_dc(dev,0)
689
                   a BNC interface should work if the enable pin
690
                   (dc/dc converter) is on HCB1. It will be called AUI
691
                   however. */
692
 
693
                lp->adapter_cnf = 0;
694
                i = readreg(dev, PP_LineCTL);
695
                /* Preserve the setting of the HCB1 pin. */
696
                if ((i & (HCB1 | HCB1_ENBL)) ==  (HCB1 | HCB1_ENBL))
697
                        lp->adapter_cnf |= A_CNF_DC_DC_POLARITY;
698
                /* Save the sqelch bit */
699
                if ((i & LOW_RX_SQUELCH) == LOW_RX_SQUELCH)
700
                        lp->adapter_cnf |= A_CNF_EXTND_10B_2 | A_CNF_LOW_RX_SQUELCH;
701
                /* Check if the card is in 10Base-t only mode */
702
                if ((i & (AUI_ONLY | AUTO_AUI_10BASET)) == 0)
703
                        lp->adapter_cnf |=  A_CNF_10B_T | A_CNF_MEDIA_10B_T;
704
                /* Check if the card is in AUI only mode */
705
                if ((i & (AUI_ONLY | AUTO_AUI_10BASET)) == AUI_ONLY)
706
                        lp->adapter_cnf |=  A_CNF_AUI | A_CNF_MEDIA_AUI;
707
                /* Check if the card is in Auto mode. */
708
                if ((i & (AUI_ONLY | AUTO_AUI_10BASET)) == AUTO_AUI_10BASET)
709
                        lp->adapter_cnf |=  A_CNF_AUI | A_CNF_10B_T |
710
                        A_CNF_MEDIA_AUI | A_CNF_MEDIA_10B_T | A_CNF_MEDIA_AUTO;
711
 
712
                if (net_debug > 1)
713
                        printk(KERN_INFO "%s: PP_LineCTL=0x%x, adapter_cnf=0x%x\n",
714
                                        dev->name, i, lp->adapter_cnf);
715
 
716
                /* IRQ. Other chips already probe, see below. */
717
                if (lp->chip_type == CS8900)
718
                        lp->isa_config = readreg(dev, PP_CS8900_ISAINT) & INT_NO_MASK;
719
 
720
                printk( "[Cirrus EEPROM] ");
721
        }
722
 
723
        printk("\n");
724
 
725
        /* First check to see if an EEPROM is attached. */
726
#ifdef CONFIG_SH_HICOSH4 /* no EEPROM on HiCO, don't hazzle with it here */
727
        if (1) {
728
                printk(KERN_NOTICE "cs89x0: No EEPROM on HiCO.SH4\n");
729
        } else
730
#endif
731
        if ((readreg(dev, PP_SelfST) & EEPROM_PRESENT) == 0)
732
                printk(KERN_WARNING "cs89x0: No EEPROM, relying on command line....\n");
733
        else if (get_eeprom_data(dev, START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
734
                printk(KERN_WARNING "\ncs89x0: EEPROM read failed, relying on command line.\n");
735
        } else if (get_eeprom_cksum(START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
736
                /* Check if the chip was able to read its own configuration starting
737
                   at 0 in the EEPROM*/
738
                if ((readreg(dev, PP_SelfST) & (EEPROM_OK | EEPROM_PRESENT)) !=
739
                    (EEPROM_OK|EEPROM_PRESENT))
740
                        printk(KERN_WARNING "cs89x0: Extended EEPROM checksum bad and no Cirrus EEPROM, relying on command line\n");
741
 
742
        } else {
743
                /* This reads an extended EEPROM that is not documented
744
                   in the CS8900 datasheet. */
745
 
746
                /* get transmission control word  but keep the autonegotiation bits */
747
                if (!lp->auto_neg_cnf) lp->auto_neg_cnf = eeprom_buff[AUTO_NEG_CNF_OFFSET/2];
748
                /* Store adapter configuration */
749
                if (!lp->adapter_cnf) lp->adapter_cnf = eeprom_buff[ADAPTER_CNF_OFFSET/2];
750
                /* Store ISA configuration */
751
                lp->isa_config = eeprom_buff[ISA_CNF_OFFSET/2];
752
                dev->mem_start = eeprom_buff[PACKET_PAGE_OFFSET/2] << 8;
753
 
754
                /* eeprom_buff has 32-bit ints, so we can't just memcpy it */
755
                /* store the initial memory base address */
756
                for (i = 0; i < ETH_ALEN/2; i++) {
757
                        dev->dev_addr[i*2] = eeprom_buff[i];
758
                        dev->dev_addr[i*2+1] = eeprom_buff[i] >> 8;
759
                }
760
                if (net_debug > 1)
761
                        printk(KERN_DEBUG "%s: new adapter_cnf: 0x%x\n",
762
                                dev->name, lp->adapter_cnf);
763
        }
764
 
765
        /* allow them to force multiple transceivers.  If they force multiple, autosense */
766
        {
767
                int count = 0;
768
                if (lp->force & FORCE_RJ45)     {lp->adapter_cnf |= A_CNF_10B_T; count++; }
769
                if (lp->force & FORCE_AUI)      {lp->adapter_cnf |= A_CNF_AUI; count++; }
770
                if (lp->force & FORCE_BNC)      {lp->adapter_cnf |= A_CNF_10B_2; count++; }
771
                if (count > 1)                  {lp->adapter_cnf |= A_CNF_MEDIA_AUTO; }
772
                else if (lp->force & FORCE_RJ45){lp->adapter_cnf |= A_CNF_MEDIA_10B_T; }
773
                else if (lp->force & FORCE_AUI) {lp->adapter_cnf |= A_CNF_MEDIA_AUI; }
774
                else if (lp->force & FORCE_BNC) {lp->adapter_cnf |= A_CNF_MEDIA_10B_2; }
775
        }
776
 
777
        if (net_debug > 1)
778
                printk(KERN_DEBUG "%s: after force 0x%x, adapter_cnf=0x%x\n",
779
                        dev->name, lp->force, lp->adapter_cnf);
780
 
781
        /* FIXME: We don't let you set dc-dc polarity or low RX squelch from the command line: add it here */
782
 
783
        /* FIXME: We don't let you set the IMM bit from the command line: add it to lp->auto_neg_cnf here */
784
 
785
        /* FIXME: we don't set the Ethernet address on the command line.  Use
786
           ifconfig IFACE hw ether AABBCCDDEEFF */
787
 
788
        printk(KERN_INFO "cs89x0 media %s%s%s",
789
               (lp->adapter_cnf & A_CNF_10B_T)?"RJ-45,":"",
790
               (lp->adapter_cnf & A_CNF_AUI)?"AUI,":"",
791
               (lp->adapter_cnf & A_CNF_10B_2)?"BNC,":"");
792
 
793
        lp->irq_map = 0xffff;
794
 
795
        /* If this is a CS8900 then no pnp soft */
796
        if (lp->chip_type != CS8900 &&
797
            /* Check if the ISA IRQ has been set  */
798
                (i = readreg(dev, PP_CS8920_ISAINT) & 0xff,
799
                 (i != 0 && i < CS8920_NO_INTS))) {
800
                if (!dev->irq)
801
                        dev->irq = i;
802
        } else {
803
                i = lp->isa_config & INT_NO_MASK;
804
                if (lp->chip_type == CS8900) {
805
#if defined(CONFIG_MACH_IXDP2351) || defined(CONFIG_ARCH_IXDP2X01) || defined(CONFIG_ARCH_PNX010X)
806
                        i = cs8900_irq_map[0];
807
#else
808
                        /* Translate the IRQ using the IRQ mapping table. */
809
                        if (i >= ARRAY_SIZE(cs8900_irq_map))
810
                                printk("\ncs89x0: invalid ISA interrupt number %d\n", i);
811
                        else
812
                                i = cs8900_irq_map[i];
813
 
814
                        lp->irq_map = CS8900_IRQ_MAP; /* fixed IRQ map for CS8900 */
815
                } else {
816
                        int irq_map_buff[IRQ_MAP_LEN/2];
817
 
818
                        if (get_eeprom_data(dev, IRQ_MAP_EEPROM_DATA,
819
                                            IRQ_MAP_LEN/2,
820
                                            irq_map_buff) >= 0) {
821
                                if ((irq_map_buff[0] & 0xff) == PNP_IRQ_FRMT)
822
                                        lp->irq_map = (irq_map_buff[0]>>8) | (irq_map_buff[1] << 8);
823
                        }
824
#endif
825
                }
826
                if (!dev->irq)
827
                        dev->irq = i;
828
        }
829
 
830
        printk(" IRQ %d", dev->irq);
831
 
832
#if ALLOW_DMA
833
        if (lp->use_dma) {
834
                get_dma_channel(dev);
835
                printk(", DMA %d", dev->dma);
836
        }
837
        else
838
#endif
839
        {
840
                printk(", programmed I/O");
841
        }
842
 
843
        /* print the ethernet address. */
844
        printk(", MAC %s", print_mac(mac, dev->dev_addr));
845
 
846
        dev->open               = net_open;
847
        dev->stop               = net_close;
848
        dev->tx_timeout         = net_timeout;
849
        dev->watchdog_timeo     = HZ;
850
        dev->hard_start_xmit    = net_send_packet;
851
        dev->get_stats          = net_get_stats;
852
        dev->set_multicast_list = set_multicast_list;
853
        dev->set_mac_address    = set_mac_address;
854
#ifdef CONFIG_NET_POLL_CONTROLLER
855
        dev->poll_controller    = net_poll_controller;
856
#endif
857
 
858
        printk("\n");
859
        if (net_debug)
860
                printk("cs89x0_probe1() successful\n");
861
 
862
        retval = register_netdev(dev);
863
        if (retval)
864
                goto out3;
865
        return 0;
866
out3:
867
        writeword(dev->base_addr, ADD_PORT, PP_ChipID);
868
out2:
869
        release_region(ioaddr & ~3, NETCARD_IO_EXTENT);
870
out1:
871
        return retval;
872
}
873
 
874
 
875
/*********************************
876
 * This page contains DMA routines
877
**********************************/
878
 
879
#if ALLOW_DMA
880
 
881
#define dma_page_eq(ptr1, ptr2) ((long)(ptr1)>>17 == (long)(ptr2)>>17)
882
 
883
static void
884
get_dma_channel(struct net_device *dev)
885
{
886
        struct net_local *lp = netdev_priv(dev);
887
 
888
        if (lp->dma) {
889
                dev->dma = lp->dma;
890
                lp->isa_config |= ISA_RxDMA;
891
        } else {
892
                if ((lp->isa_config & ANY_ISA_DMA) == 0)
893
                        return;
894
                dev->dma = lp->isa_config & DMA_NO_MASK;
895
                if (lp->chip_type == CS8900)
896
                        dev->dma += 5;
897
                if (dev->dma < 5 || dev->dma > 7) {
898
                        lp->isa_config &= ~ANY_ISA_DMA;
899
                        return;
900
                }
901
        }
902
        return;
903
}
904
 
905
static void
906
write_dma(struct net_device *dev, int chip_type, int dma)
907
{
908
        struct net_local *lp = netdev_priv(dev);
909
        if ((lp->isa_config & ANY_ISA_DMA) == 0)
910
                return;
911
        if (chip_type == CS8900) {
912
                writereg(dev, PP_CS8900_ISADMA, dma-5);
913
        } else {
914
                writereg(dev, PP_CS8920_ISADMA, dma);
915
        }
916
}
917
 
918
static void
919
set_dma_cfg(struct net_device *dev)
920
{
921
        struct net_local *lp = netdev_priv(dev);
922
 
923
        if (lp->use_dma) {
924
                if ((lp->isa_config & ANY_ISA_DMA) == 0) {
925
                        if (net_debug > 3)
926
                                printk("set_dma_cfg(): no DMA\n");
927
                        return;
928
                }
929
                if (lp->isa_config & ISA_RxDMA) {
930
                        lp->curr_rx_cfg |= RX_DMA_ONLY;
931
                        if (net_debug > 3)
932
                                printk("set_dma_cfg(): RX_DMA_ONLY\n");
933
                } else {
934
                        lp->curr_rx_cfg |= AUTO_RX_DMA; /* not that we support it... */
935
                        if (net_debug > 3)
936
                                printk("set_dma_cfg(): AUTO_RX_DMA\n");
937
                }
938
        }
939
}
940
 
941
static int
942
dma_bufcfg(struct net_device *dev)
943
{
944
        struct net_local *lp = netdev_priv(dev);
945
        if (lp->use_dma)
946
                return (lp->isa_config & ANY_ISA_DMA)? RX_DMA_ENBL : 0;
947
        else
948
                return 0;
949
}
950
 
951
static int
952
dma_busctl(struct net_device *dev)
953
{
954
        int retval = 0;
955
        struct net_local *lp = netdev_priv(dev);
956
        if (lp->use_dma) {
957
                if (lp->isa_config & ANY_ISA_DMA)
958
                        retval |= RESET_RX_DMA; /* Reset the DMA pointer */
959
                if (lp->isa_config & DMA_BURST)
960
                        retval |= DMA_BURST_MODE; /* Does ISA config specify DMA burst ? */
961
                if (lp->dmasize == 64)
962
                        retval |= RX_DMA_SIZE_64K; /* did they ask for 64K? */
963
                retval |= MEMORY_ON;    /* we need memory enabled to use DMA. */
964
        }
965
        return retval;
966
}
967
 
968
static void
969
dma_rx(struct net_device *dev)
970
{
971
        struct net_local *lp = netdev_priv(dev);
972
        struct sk_buff *skb;
973
        int status, length;
974
        unsigned char *bp = lp->rx_dma_ptr;
975
 
976
        status = bp[0] + (bp[1]<<8);
977
        length = bp[2] + (bp[3]<<8);
978
        bp += 4;
979
        if (net_debug > 5) {
980
                printk( "%s: receiving DMA packet at %lx, status %x, length %x\n",
981
                        dev->name, (unsigned long)bp, status, length);
982
        }
983
        if ((status & RX_OK) == 0) {
984
                count_rx_errors(status, lp);
985
                goto skip_this_frame;
986
        }
987
 
988
        /* Malloc up new buffer. */
989
        skb = dev_alloc_skb(length + 2);
990
        if (skb == NULL) {
991
                if (net_debug)  /* I don't think we want to do this to a stressed system */
992
                        printk("%s: Memory squeeze, dropping packet.\n", dev->name);
993
                lp->stats.rx_dropped++;
994
 
995
                /* AKPM: advance bp to the next frame */
996
skip_this_frame:
997
                bp += (length + 3) & ~3;
998
                if (bp >= lp->end_dma_buff) bp -= lp->dmasize*1024;
999
                lp->rx_dma_ptr = bp;
1000
                return;
1001
        }
1002
        skb_reserve(skb, 2);    /* longword align L3 header */
1003
 
1004
        if (bp + length > lp->end_dma_buff) {
1005
                int semi_cnt = lp->end_dma_buff - bp;
1006
                memcpy(skb_put(skb,semi_cnt), bp, semi_cnt);
1007
                memcpy(skb_put(skb,length - semi_cnt), lp->dma_buff,
1008
                       length - semi_cnt);
1009
        } else {
1010
                memcpy(skb_put(skb,length), bp, length);
1011
        }
1012
        bp += (length + 3) & ~3;
1013
        if (bp >= lp->end_dma_buff) bp -= lp->dmasize*1024;
1014
        lp->rx_dma_ptr = bp;
1015
 
1016
        if (net_debug > 3) {
1017
                printk( "%s: received %d byte DMA packet of type %x\n",
1018
                        dev->name, length,
1019
                        (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
1020
        }
1021
        skb->protocol=eth_type_trans(skb,dev);
1022
        netif_rx(skb);
1023
        dev->last_rx = jiffies;
1024
        lp->stats.rx_packets++;
1025
        lp->stats.rx_bytes += length;
1026
}
1027
 
1028
#endif  /* ALLOW_DMA */
1029
 
1030
void  __init reset_chip(struct net_device *dev)
1031
{
1032
#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01)
1033
        struct net_local *lp = netdev_priv(dev);
1034
        int ioaddr = dev->base_addr;
1035
#endif
1036
        int reset_start_time;
1037
 
1038
        writereg(dev, PP_SelfCTL, readreg(dev, PP_SelfCTL) | POWER_ON_RESET);
1039
 
1040
        /* wait 30 ms */
1041
        msleep(30);
1042
 
1043
#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01)
1044
        if (lp->chip_type != CS8900) {
1045
                /* Hardware problem requires PNP registers to be reconfigured after a reset */
1046
                writeword(ioaddr, ADD_PORT, PP_CS8920_ISAINT);
1047
                outb(dev->irq, ioaddr + DATA_PORT);
1048
                outb(0,      ioaddr + DATA_PORT + 1);
1049
 
1050
                writeword(ioaddr, ADD_PORT, PP_CS8920_ISAMemB);
1051
                outb((dev->mem_start >> 16) & 0xff, ioaddr + DATA_PORT);
1052
                outb((dev->mem_start >> 8) & 0xff,   ioaddr + DATA_PORT + 1);
1053
        }
1054
#endif  /* IXDP2x01 */
1055
 
1056
        /* Wait until the chip is reset */
1057
        reset_start_time = jiffies;
1058
        while( (readreg(dev, PP_SelfST) & INIT_DONE) == 0 && jiffies - reset_start_time < 2)
1059
                ;
1060
}
1061
 
1062
 
1063
static void
1064
control_dc_dc(struct net_device *dev, int on_not_off)
1065
{
1066
        struct net_local *lp = netdev_priv(dev);
1067
        unsigned int selfcontrol;
1068
        int timenow = jiffies;
1069
        /* control the DC to DC convertor in the SelfControl register.
1070
           Note: This is hooked up to a general purpose pin, might not
1071
           always be a DC to DC convertor. */
1072
 
1073
        selfcontrol = HCB1_ENBL; /* Enable the HCB1 bit as an output */
1074
        if (((lp->adapter_cnf & A_CNF_DC_DC_POLARITY) != 0) ^ on_not_off)
1075
                selfcontrol |= HCB1;
1076
        else
1077
                selfcontrol &= ~HCB1;
1078
        writereg(dev, PP_SelfCTL, selfcontrol);
1079
 
1080
        /* Wait for the DC/DC converter to power up - 500ms */
1081
        while (jiffies - timenow < HZ)
1082
                ;
1083
}
1084
 
1085
#define DETECTED_NONE  0
1086
#define DETECTED_RJ45H 1
1087
#define DETECTED_RJ45F 2
1088
#define DETECTED_AUI   3
1089
#define DETECTED_BNC   4
1090
 
1091
static int
1092
detect_tp(struct net_device *dev)
1093
{
1094
        struct net_local *lp = netdev_priv(dev);
1095
        int timenow = jiffies;
1096
        int fdx;
1097
 
1098
        if (net_debug > 1) printk("%s: Attempting TP\n", dev->name);
1099
 
1100
        /* If connected to another full duplex capable 10-Base-T card the link pulses
1101
           seem to be lost when the auto detect bit in the LineCTL is set.
1102
           To overcome this the auto detect bit will be cleared whilst testing the
1103
           10-Base-T interface.  This would not be necessary for the sparrow chip but
1104
           is simpler to do it anyway. */
1105
        writereg(dev, PP_LineCTL, lp->linectl &~ AUI_ONLY);
1106
        control_dc_dc(dev, 0);
1107
 
1108
        /* Delay for the hardware to work out if the TP cable is present - 150ms */
1109
        for (timenow = jiffies; jiffies - timenow < 15; )
1110
                ;
1111
        if ((readreg(dev, PP_LineST) & LINK_OK) == 0)
1112
                return DETECTED_NONE;
1113
 
1114
        if (lp->chip_type == CS8900) {
1115
                switch (lp->force & 0xf0) {
1116
#if 0
1117
                case FORCE_AUTO:
1118
                        printk("%s: cs8900 doesn't autonegotiate\n",dev->name);
1119
                        return DETECTED_NONE;
1120
#endif
1121
                /* CS8900 doesn't support AUTO, change to HALF*/
1122
                case FORCE_AUTO:
1123
                        lp->force &= ~FORCE_AUTO;
1124
                        lp->force |= FORCE_HALF;
1125
                        break;
1126
                case FORCE_HALF:
1127
                        break;
1128
                case FORCE_FULL:
1129
                        writereg(dev, PP_TestCTL, readreg(dev, PP_TestCTL) | FDX_8900);
1130
                        break;
1131
                }
1132
                fdx = readreg(dev, PP_TestCTL) & FDX_8900;
1133
        } else {
1134
                switch (lp->force & 0xf0) {
1135
                case FORCE_AUTO:
1136
                        lp->auto_neg_cnf = AUTO_NEG_ENABLE;
1137
                        break;
1138
                case FORCE_HALF:
1139
                        lp->auto_neg_cnf = 0;
1140
                        break;
1141
                case FORCE_FULL:
1142
                        lp->auto_neg_cnf = RE_NEG_NOW | ALLOW_FDX;
1143
                        break;
1144
                }
1145
 
1146
                writereg(dev, PP_AutoNegCTL, lp->auto_neg_cnf & AUTO_NEG_MASK);
1147
 
1148
                if ((lp->auto_neg_cnf & AUTO_NEG_BITS) == AUTO_NEG_ENABLE) {
1149
                        printk(KERN_INFO "%s: negotiating duplex...\n",dev->name);
1150
                        while (readreg(dev, PP_AutoNegST) & AUTO_NEG_BUSY) {
1151
                                if (jiffies - timenow > 4000) {
1152
                                        printk(KERN_ERR "**** Full / half duplex auto-negotiation timed out ****\n");
1153
                                        break;
1154
                                }
1155
                        }
1156
                }
1157
                fdx = readreg(dev, PP_AutoNegST) & FDX_ACTIVE;
1158
        }
1159
        if (fdx)
1160
                return DETECTED_RJ45F;
1161
        else
1162
                return DETECTED_RJ45H;
1163
}
1164
 
1165
/* send a test packet - return true if carrier bits are ok */
1166
static int
1167
send_test_pkt(struct net_device *dev)
1168
{
1169
        char test_packet[] = { 0,0,0,0,0,0, 0,0,0,0,0,0,
1170
                                 0, 46, /* A 46 in network order */
1171
                                 0, 0, /* DSAP=0 & SSAP=0 fields */
1172
                                 0xf3, 0 /* Control (Test Req + P bit set) */ };
1173
        long timenow = jiffies;
1174
 
1175
        writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) | SERIAL_TX_ON);
1176
 
1177
        memcpy(test_packet,          dev->dev_addr, ETH_ALEN);
1178
        memcpy(test_packet+ETH_ALEN, dev->dev_addr, ETH_ALEN);
1179
 
1180
        writeword(dev->base_addr, TX_CMD_PORT, TX_AFTER_ALL);
1181
        writeword(dev->base_addr, TX_LEN_PORT, ETH_ZLEN);
1182
 
1183
        /* Test to see if the chip has allocated memory for the packet */
1184
        while (jiffies - timenow < 5)
1185
                if (readreg(dev, PP_BusST) & READY_FOR_TX_NOW)
1186
                        break;
1187
        if (jiffies - timenow >= 5)
1188
                return 0;        /* this shouldn't happen */
1189
 
1190
        /* Write the contents of the packet */
1191
        writewords(dev->base_addr, TX_FRAME_PORT,test_packet,(ETH_ZLEN+1) >>1);
1192
 
1193
        if (net_debug > 1) printk("Sending test packet ");
1194
        /* wait a couple of jiffies for packet to be received */
1195
        for (timenow = jiffies; jiffies - timenow < 3; )
1196
                ;
1197
        if ((readreg(dev, PP_TxEvent) & TX_SEND_OK_BITS) == TX_OK) {
1198
                if (net_debug > 1) printk("succeeded\n");
1199
                return 1;
1200
        }
1201
        if (net_debug > 1) printk("failed\n");
1202
        return 0;
1203
}
1204
 
1205
 
1206
static int
1207
detect_aui(struct net_device *dev)
1208
{
1209
        struct net_local *lp = netdev_priv(dev);
1210
 
1211
        if (net_debug > 1) printk("%s: Attempting AUI\n", dev->name);
1212
        control_dc_dc(dev, 0);
1213
 
1214
        writereg(dev, PP_LineCTL, (lp->linectl &~ AUTO_AUI_10BASET) | AUI_ONLY);
1215
 
1216
        if (send_test_pkt(dev))
1217
                return DETECTED_AUI;
1218
        else
1219
                return DETECTED_NONE;
1220
}
1221
 
1222
static int
1223
detect_bnc(struct net_device *dev)
1224
{
1225
        struct net_local *lp = netdev_priv(dev);
1226
 
1227
        if (net_debug > 1) printk("%s: Attempting BNC\n", dev->name);
1228
        control_dc_dc(dev, 1);
1229
 
1230
        writereg(dev, PP_LineCTL, (lp->linectl &~ AUTO_AUI_10BASET) | AUI_ONLY);
1231
 
1232
        if (send_test_pkt(dev))
1233
                return DETECTED_BNC;
1234
        else
1235
                return DETECTED_NONE;
1236
}
1237
 
1238
 
1239
static void
1240
write_irq(struct net_device *dev, int chip_type, int irq)
1241
{
1242
        int i;
1243
 
1244
        if (chip_type == CS8900) {
1245
                /* Search the mapping table for the corresponding IRQ pin. */
1246
                for (i = 0; i != ARRAY_SIZE(cs8900_irq_map); i++)
1247
                        if (cs8900_irq_map[i] == irq)
1248
                                break;
1249
                /* Not found */
1250
                if (i == ARRAY_SIZE(cs8900_irq_map))
1251
                        i = 3;
1252
                writereg(dev, PP_CS8900_ISAINT, i);
1253
        } else {
1254
                writereg(dev, PP_CS8920_ISAINT, irq);
1255
        }
1256
}
1257
 
1258
/* Open/initialize the board.  This is called (in the current kernel)
1259
   sometime after booting when the 'ifconfig' program is run.
1260
 
1261
   This routine should set everything up anew at each open, even
1262
   registers that "should" only need to be set once at boot, so that
1263
   there is non-reboot way to recover if something goes wrong.
1264
   */
1265
 
1266
/* AKPM: do we need to do any locking here? */
1267
 
1268
static int
1269
net_open(struct net_device *dev)
1270
{
1271
        struct net_local *lp = netdev_priv(dev);
1272
        int result = 0;
1273
        int i;
1274
        int ret;
1275
 
1276
#if !defined(CONFIG_SH_HICOSH4) && !defined(CONFIG_ARCH_PNX010X) /* uses irq#1, so this won't work */
1277
        if (dev->irq < 2) {
1278
                /* Allow interrupts to be generated by the chip */
1279
/* Cirrus' release had this: */
1280
#if 0
1281
                writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL)|ENABLE_IRQ );
1282
#endif
1283
/* And 2.3.47 had this: */
1284
                writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
1285
 
1286
                for (i = 2; i < CS8920_NO_INTS; i++) {
1287
                        if ((1 << i) & lp->irq_map) {
1288
                                if (request_irq(i, net_interrupt, 0, dev->name, dev) == 0) {
1289
                                        dev->irq = i;
1290
                                        write_irq(dev, lp->chip_type, i);
1291
                                        /* writereg(dev, PP_BufCFG, GENERATE_SW_INTERRUPT); */
1292
                                        break;
1293
                                }
1294
                        }
1295
                }
1296
 
1297
                if (i >= CS8920_NO_INTS) {
1298
                        writereg(dev, PP_BusCTL, 0);     /* disable interrupts. */
1299
                        printk(KERN_ERR "cs89x0: can't get an interrupt\n");
1300
                        ret = -EAGAIN;
1301
                        goto bad_out;
1302
                }
1303
        }
1304
        else
1305
#endif
1306
        {
1307
#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X)
1308
                if (((1 << dev->irq) & lp->irq_map) == 0) {
1309
                        printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
1310
                               dev->name, dev->irq, lp->irq_map);
1311
                        ret = -EAGAIN;
1312
                        goto bad_out;
1313
                }
1314
#endif
1315
/* FIXME: Cirrus' release had this: */
1316
                writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL)|ENABLE_IRQ );
1317
/* And 2.3.47 had this: */
1318
#if 0
1319
                writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
1320
#endif
1321
                write_irq(dev, lp->chip_type, dev->irq);
1322
                ret = request_irq(dev->irq, &net_interrupt, 0, dev->name, dev);
1323
                if (ret) {
1324
                        if (net_debug)
1325
                                printk(KERN_DEBUG "cs89x0: request_irq(%d) failed\n", dev->irq);
1326
                        goto bad_out;
1327
                }
1328
        }
1329
 
1330
#if ALLOW_DMA
1331
        if (lp->use_dma) {
1332
                if (lp->isa_config & ANY_ISA_DMA) {
1333
                        unsigned long flags;
1334
                        lp->dma_buff = (unsigned char *)__get_dma_pages(GFP_KERNEL,
1335
                                                        get_order(lp->dmasize * 1024));
1336
 
1337
                        if (!lp->dma_buff) {
1338
                                printk(KERN_ERR "%s: cannot get %dK memory for DMA\n", dev->name, lp->dmasize);
1339
                                goto release_irq;
1340
                        }
1341
                        if (net_debug > 1) {
1342
                                printk( "%s: dma %lx %lx\n",
1343
                                        dev->name,
1344
                                        (unsigned long)lp->dma_buff,
1345
                                        (unsigned long)isa_virt_to_bus(lp->dma_buff));
1346
                        }
1347
                        if ((unsigned long) lp->dma_buff >= MAX_DMA_ADDRESS ||
1348
                            !dma_page_eq(lp->dma_buff, lp->dma_buff+lp->dmasize*1024-1)) {
1349
                                printk(KERN_ERR "%s: not usable as DMA buffer\n", dev->name);
1350
                                goto release_irq;
1351
                        }
1352
                        memset(lp->dma_buff, 0, lp->dmasize * 1024);     /* Why? */
1353
                        if (request_dma(dev->dma, dev->name)) {
1354
                                printk(KERN_ERR "%s: cannot get dma channel %d\n", dev->name, dev->dma);
1355
                                goto release_irq;
1356
                        }
1357
                        write_dma(dev, lp->chip_type, dev->dma);
1358
                        lp->rx_dma_ptr = lp->dma_buff;
1359
                        lp->end_dma_buff = lp->dma_buff + lp->dmasize*1024;
1360
                        spin_lock_irqsave(&lp->lock, flags);
1361
                        disable_dma(dev->dma);
1362
                        clear_dma_ff(dev->dma);
1363
                        set_dma_mode(dev->dma, 0x14); /* auto_init as well */
1364
                        set_dma_addr(dev->dma, isa_virt_to_bus(lp->dma_buff));
1365
                        set_dma_count(dev->dma, lp->dmasize*1024);
1366
                        enable_dma(dev->dma);
1367
                        spin_unlock_irqrestore(&lp->lock, flags);
1368
                }
1369
        }
1370
#endif  /* ALLOW_DMA */
1371
 
1372
        /* set the Ethernet address */
1373
        for (i=0; i < ETH_ALEN/2; i++)
1374
                writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
1375
 
1376
        /* while we're testing the interface, leave interrupts disabled */
1377
        writereg(dev, PP_BusCTL, MEMORY_ON);
1378
 
1379
        /* Set the LineCTL quintuplet based on adapter configuration read from EEPROM */
1380
        if ((lp->adapter_cnf & A_CNF_EXTND_10B_2) && (lp->adapter_cnf & A_CNF_LOW_RX_SQUELCH))
1381
                lp->linectl = LOW_RX_SQUELCH;
1382
        else
1383
                lp->linectl = 0;
1384
 
1385
        /* check to make sure that they have the "right" hardware available */
1386
        switch(lp->adapter_cnf & A_CNF_MEDIA_TYPE) {
1387
        case A_CNF_MEDIA_10B_T: result = lp->adapter_cnf & A_CNF_10B_T; break;
1388
        case A_CNF_MEDIA_AUI:   result = lp->adapter_cnf & A_CNF_AUI; break;
1389
        case A_CNF_MEDIA_10B_2: result = lp->adapter_cnf & A_CNF_10B_2; break;
1390
        default: result = lp->adapter_cnf & (A_CNF_10B_T | A_CNF_AUI | A_CNF_10B_2);
1391
        }
1392
#ifdef CONFIG_ARCH_PNX010X
1393
        result = A_CNF_10B_T;
1394
#endif
1395
        if (!result) {
1396
                printk(KERN_ERR "%s: EEPROM is configured for unavailable media\n", dev->name);
1397
        release_irq:
1398
#if ALLOW_DMA
1399
                release_dma_buff(lp);
1400
#endif
1401
                writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) & ~(SERIAL_TX_ON | SERIAL_RX_ON));
1402
                free_irq(dev->irq, dev);
1403
                ret = -EAGAIN;
1404
                goto bad_out;
1405
        }
1406
 
1407
        /* set the hardware to the configured choice */
1408
        switch(lp->adapter_cnf & A_CNF_MEDIA_TYPE) {
1409
        case A_CNF_MEDIA_10B_T:
1410
                result = detect_tp(dev);
1411
                if (result==DETECTED_NONE) {
1412
                        printk(KERN_WARNING "%s: 10Base-T (RJ-45) has no cable\n", dev->name);
1413
                        if (lp->auto_neg_cnf & IMM_BIT) /* check "ignore missing media" bit */
1414
                                result = DETECTED_RJ45H; /* Yes! I don't care if I see a link pulse */
1415
                }
1416
                break;
1417
        case A_CNF_MEDIA_AUI:
1418
                result = detect_aui(dev);
1419
                if (result==DETECTED_NONE) {
1420
                        printk(KERN_WARNING "%s: 10Base-5 (AUI) has no cable\n", dev->name);
1421
                        if (lp->auto_neg_cnf & IMM_BIT) /* check "ignore missing media" bit */
1422
                                result = DETECTED_AUI; /* Yes! I don't care if I see a carrrier */
1423
                }
1424
                break;
1425
        case A_CNF_MEDIA_10B_2:
1426
                result = detect_bnc(dev);
1427
                if (result==DETECTED_NONE) {
1428
                        printk(KERN_WARNING "%s: 10Base-2 (BNC) has no cable\n", dev->name);
1429
                        if (lp->auto_neg_cnf & IMM_BIT) /* check "ignore missing media" bit */
1430
                                result = DETECTED_BNC; /* Yes! I don't care if I can xmit a packet */
1431
                }
1432
                break;
1433
        case A_CNF_MEDIA_AUTO:
1434
                writereg(dev, PP_LineCTL, lp->linectl | AUTO_AUI_10BASET);
1435
                if (lp->adapter_cnf & A_CNF_10B_T)
1436
                        if ((result = detect_tp(dev)) != DETECTED_NONE)
1437
                                break;
1438
                if (lp->adapter_cnf & A_CNF_AUI)
1439
                        if ((result = detect_aui(dev)) != DETECTED_NONE)
1440
                                break;
1441
                if (lp->adapter_cnf & A_CNF_10B_2)
1442
                        if ((result = detect_bnc(dev)) != DETECTED_NONE)
1443
                                break;
1444
                printk(KERN_ERR "%s: no media detected\n", dev->name);
1445
                goto release_irq;
1446
        }
1447
        switch(result) {
1448
        case DETECTED_NONE:
1449
                printk(KERN_ERR "%s: no network cable attached to configured media\n", dev->name);
1450
                goto release_irq;
1451
        case DETECTED_RJ45H:
1452
                printk(KERN_INFO "%s: using half-duplex 10Base-T (RJ-45)\n", dev->name);
1453
                break;
1454
        case DETECTED_RJ45F:
1455
                printk(KERN_INFO "%s: using full-duplex 10Base-T (RJ-45)\n", dev->name);
1456
                break;
1457
        case DETECTED_AUI:
1458
                printk(KERN_INFO "%s: using 10Base-5 (AUI)\n", dev->name);
1459
                break;
1460
        case DETECTED_BNC:
1461
                printk(KERN_INFO "%s: using 10Base-2 (BNC)\n", dev->name);
1462
                break;
1463
        }
1464
 
1465
        /* Turn on both receive and transmit operations */
1466
        writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) | SERIAL_RX_ON | SERIAL_TX_ON);
1467
 
1468
        /* Receive only error free packets addressed to this card */
1469
        lp->rx_mode = 0;
1470
        writereg(dev, PP_RxCTL, DEF_RX_ACCEPT);
1471
 
1472
        lp->curr_rx_cfg = RX_OK_ENBL | RX_CRC_ERROR_ENBL;
1473
 
1474
        if (lp->isa_config & STREAM_TRANSFER)
1475
                lp->curr_rx_cfg |= RX_STREAM_ENBL;
1476
#if ALLOW_DMA
1477
        set_dma_cfg(dev);
1478
#endif
1479
        writereg(dev, PP_RxCFG, lp->curr_rx_cfg);
1480
 
1481
        writereg(dev, PP_TxCFG, TX_LOST_CRS_ENBL | TX_SQE_ERROR_ENBL | TX_OK_ENBL |
1482
                TX_LATE_COL_ENBL | TX_JBR_ENBL | TX_ANY_COL_ENBL | TX_16_COL_ENBL);
1483
 
1484
        writereg(dev, PP_BufCFG, READY_FOR_TX_ENBL | RX_MISS_COUNT_OVRFLOW_ENBL |
1485
#if ALLOW_DMA
1486
                dma_bufcfg(dev) |
1487
#endif
1488
                TX_COL_COUNT_OVRFLOW_ENBL | TX_UNDERRUN_ENBL);
1489
 
1490
        /* now that we've got our act together, enable everything */
1491
        writereg(dev, PP_BusCTL, ENABLE_IRQ
1492
                 | (dev->mem_start?MEMORY_ON : 0) /* turn memory on */
1493
#if ALLOW_DMA
1494
                 | dma_busctl(dev)
1495
#endif
1496
                 );
1497
        netif_start_queue(dev);
1498
        if (net_debug > 1)
1499
                printk("cs89x0: net_open() succeeded\n");
1500
        return 0;
1501
bad_out:
1502
        return ret;
1503
}
1504
 
1505
static void net_timeout(struct net_device *dev)
1506
{
1507
        /* If we get here, some higher level has decided we are broken.
1508
           There should really be a "kick me" function call instead. */
1509
        if (net_debug > 0) printk("%s: transmit timed out, %s?\n", dev->name,
1510
                   tx_done(dev) ? "IRQ conflict ?" : "network cable problem");
1511
        /* Try to restart the adaptor. */
1512
        netif_wake_queue(dev);
1513
}
1514
 
1515
static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
1516
{
1517
        struct net_local *lp = netdev_priv(dev);
1518
 
1519
        if (net_debug > 3) {
1520
                printk("%s: sent %d byte packet of type %x\n",
1521
                        dev->name, skb->len,
1522
                        (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
1523
        }
1524
 
1525
        /* keep the upload from being interrupted, since we
1526
                  ask the chip to start transmitting before the
1527
                  whole packet has been completely uploaded. */
1528
 
1529
        spin_lock_irq(&lp->lock);
1530
        netif_stop_queue(dev);
1531
 
1532
        /* initiate a transmit sequence */
1533
        writeword(dev->base_addr, TX_CMD_PORT, lp->send_cmd);
1534
        writeword(dev->base_addr, TX_LEN_PORT, skb->len);
1535
 
1536
        /* Test to see if the chip has allocated memory for the packet */
1537
        if ((readreg(dev, PP_BusST) & READY_FOR_TX_NOW) == 0) {
1538
                /*
1539
                 * Gasp!  It hasn't.  But that shouldn't happen since
1540
                 * we're waiting for TxOk, so return 1 and requeue this packet.
1541
                 */
1542
 
1543
                spin_unlock_irq(&lp->lock);
1544
                if (net_debug) printk("cs89x0: Tx buffer not free!\n");
1545
                return 1;
1546
        }
1547
        /* Write the contents of the packet */
1548
        writewords(dev->base_addr, TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
1549
        spin_unlock_irq(&lp->lock);
1550
        lp->stats.tx_bytes += skb->len;
1551
        dev->trans_start = jiffies;
1552
        dev_kfree_skb (skb);
1553
 
1554
        /*
1555
         * We DO NOT call netif_wake_queue() here.
1556
         * We also DO NOT call netif_start_queue().
1557
         *
1558
         * Either of these would cause another bottom half run through
1559
         * net_send_packet() before this packet has fully gone out.  That causes
1560
         * us to hit the "Gasp!" above and the send is rescheduled.  it runs like
1561
         * a dog.  We just return and wait for the Tx completion interrupt handler
1562
         * to restart the netdevice layer
1563
         */
1564
 
1565
        return 0;
1566
}
1567
 
1568
/* The typical workload of the driver:
1569
   Handle the network interface interrupts. */
1570
 
1571
static irqreturn_t net_interrupt(int irq, void *dev_id)
1572
{
1573
        struct net_device *dev = dev_id;
1574
        struct net_local *lp;
1575
        int ioaddr, status;
1576
        int handled = 0;
1577
 
1578
        ioaddr = dev->base_addr;
1579
        lp = netdev_priv(dev);
1580
 
1581
        /* we MUST read all the events out of the ISQ, otherwise we'll never
1582
           get interrupted again.  As a consequence, we can't have any limit
1583
           on the number of times we loop in the interrupt handler.  The
1584
           hardware guarantees that eventually we'll run out of events.  Of
1585
           course, if you're on a slow machine, and packets are arriving
1586
           faster than you can read them off, you're screwed.  Hasta la
1587
           vista, baby!  */
1588
        while ((status = readword(dev->base_addr, ISQ_PORT))) {
1589
                if (net_debug > 4)printk("%s: event=%04x\n", dev->name, status);
1590
                handled = 1;
1591
                switch(status & ISQ_EVENT_MASK) {
1592
                case ISQ_RECEIVER_EVENT:
1593
                        /* Got a packet(s). */
1594
                        net_rx(dev);
1595
                        break;
1596
                case ISQ_TRANSMITTER_EVENT:
1597
                        lp->stats.tx_packets++;
1598
                        netif_wake_queue(dev);  /* Inform upper layers. */
1599
                        if ((status & ( TX_OK |
1600
                                        TX_LOST_CRS |
1601
                                        TX_SQE_ERROR |
1602
                                        TX_LATE_COL |
1603
                                        TX_16_COL)) != TX_OK) {
1604
                                if ((status & TX_OK) == 0) lp->stats.tx_errors++;
1605
                                if (status & TX_LOST_CRS) lp->stats.tx_carrier_errors++;
1606
                                if (status & TX_SQE_ERROR) lp->stats.tx_heartbeat_errors++;
1607
                                if (status & TX_LATE_COL) lp->stats.tx_window_errors++;
1608
                                if (status & TX_16_COL) lp->stats.tx_aborted_errors++;
1609
                        }
1610
                        break;
1611
                case ISQ_BUFFER_EVENT:
1612
                        if (status & READY_FOR_TX) {
1613
                                /* we tried to transmit a packet earlier,
1614
                                   but inexplicably ran out of buffers.
1615
                                   That shouldn't happen since we only ever
1616
                                   load one packet.  Shrug.  Do the right
1617
                                   thing anyway. */
1618
                                netif_wake_queue(dev);  /* Inform upper layers. */
1619
                        }
1620
                        if (status & TX_UNDERRUN) {
1621
                                if (net_debug > 0) printk("%s: transmit underrun\n", dev->name);
1622
                                lp->send_underrun++;
1623
                                if (lp->send_underrun == 3) lp->send_cmd = TX_AFTER_381;
1624
                                else if (lp->send_underrun == 6) lp->send_cmd = TX_AFTER_ALL;
1625
                                /* transmit cycle is done, although
1626
                                   frame wasn't transmitted - this
1627
                                   avoids having to wait for the upper
1628
                                   layers to timeout on us, in the
1629
                                   event of a tx underrun */
1630
                                netif_wake_queue(dev);  /* Inform upper layers. */
1631
                        }
1632
#if ALLOW_DMA
1633
                        if (lp->use_dma && (status & RX_DMA)) {
1634
                                int count = readreg(dev, PP_DmaFrameCnt);
1635
                                while(count) {
1636
                                        if (net_debug > 5)
1637
                                                printk("%s: receiving %d DMA frames\n", dev->name, count);
1638
                                        if (net_debug > 2 && count >1)
1639
                                                printk("%s: receiving %d DMA frames\n", dev->name, count);
1640
                                        dma_rx(dev);
1641
                                        if (--count == 0)
1642
                                                count = readreg(dev, PP_DmaFrameCnt);
1643
                                        if (net_debug > 2 && count > 0)
1644
                                                printk("%s: continuing with %d DMA frames\n", dev->name, count);
1645
                                }
1646
                        }
1647
#endif
1648
                        break;
1649
                case ISQ_RX_MISS_EVENT:
1650
                        lp->stats.rx_missed_errors += (status >>6);
1651
                        break;
1652
                case ISQ_TX_COL_EVENT:
1653
                        lp->stats.collisions += (status >>6);
1654
                        break;
1655
                }
1656
        }
1657
        return IRQ_RETVAL(handled);
1658
}
1659
 
1660
static void
1661
count_rx_errors(int status, struct net_local *lp)
1662
{
1663
        lp->stats.rx_errors++;
1664
        if (status & RX_RUNT) lp->stats.rx_length_errors++;
1665
        if (status & RX_EXTRA_DATA) lp->stats.rx_length_errors++;
1666
        if (status & RX_CRC_ERROR) if (!(status & (RX_EXTRA_DATA|RX_RUNT)))
1667
                /* per str 172 */
1668
                lp->stats.rx_crc_errors++;
1669
        if (status & RX_DRIBBLE) lp->stats.rx_frame_errors++;
1670
        return;
1671
}
1672
 
1673
/* We have a good packet(s), get it/them out of the buffers. */
1674
static void
1675
net_rx(struct net_device *dev)
1676
{
1677
        struct net_local *lp = netdev_priv(dev);
1678
        struct sk_buff *skb;
1679
        int status, length;
1680
 
1681
        int ioaddr = dev->base_addr;
1682
        status = readword(ioaddr, RX_FRAME_PORT);
1683
        length = readword(ioaddr, RX_FRAME_PORT);
1684
 
1685
        if ((status & RX_OK) == 0) {
1686
                count_rx_errors(status, lp);
1687
                return;
1688
        }
1689
 
1690
        /* Malloc up new buffer. */
1691
        skb = dev_alloc_skb(length + 2);
1692
        if (skb == NULL) {
1693
#if 0           /* Again, this seems a cruel thing to do */
1694
                printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
1695
#endif
1696
                lp->stats.rx_dropped++;
1697
                return;
1698
        }
1699
        skb_reserve(skb, 2);    /* longword align L3 header */
1700
 
1701
        readwords(ioaddr, RX_FRAME_PORT, skb_put(skb, length), length >> 1);
1702
        if (length & 1)
1703
                skb->data[length-1] = readword(ioaddr, RX_FRAME_PORT);
1704
 
1705
        if (net_debug > 3) {
1706
                printk( "%s: received %d byte packet of type %x\n",
1707
                        dev->name, length,
1708
                        (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
1709
        }
1710
 
1711
        skb->protocol=eth_type_trans(skb,dev);
1712
        netif_rx(skb);
1713
        dev->last_rx = jiffies;
1714
        lp->stats.rx_packets++;
1715
        lp->stats.rx_bytes += length;
1716
}
1717
 
1718
#if ALLOW_DMA
1719
static void release_dma_buff(struct net_local *lp)
1720
{
1721
        if (lp->dma_buff) {
1722
                free_pages((unsigned long)(lp->dma_buff), get_order(lp->dmasize * 1024));
1723
                lp->dma_buff = NULL;
1724
        }
1725
}
1726
#endif
1727
 
1728
/* The inverse routine to net_open(). */
1729
static int
1730
net_close(struct net_device *dev)
1731
{
1732
#if ALLOW_DMA
1733
        struct net_local *lp = netdev_priv(dev);
1734
#endif
1735
 
1736
        netif_stop_queue(dev);
1737
 
1738
        writereg(dev, PP_RxCFG, 0);
1739
        writereg(dev, PP_TxCFG, 0);
1740
        writereg(dev, PP_BufCFG, 0);
1741
        writereg(dev, PP_BusCTL, 0);
1742
 
1743
        free_irq(dev->irq, dev);
1744
 
1745
#if ALLOW_DMA
1746
        if (lp->use_dma && lp->dma) {
1747
                free_dma(dev->dma);
1748
                release_dma_buff(lp);
1749
        }
1750
#endif
1751
 
1752
        /* Update the statistics here. */
1753
        return 0;
1754
}
1755
 
1756
/* Get the current statistics.  This may be called with the card open or
1757
   closed. */
1758
static struct net_device_stats *
1759
net_get_stats(struct net_device *dev)
1760
{
1761
        struct net_local *lp = netdev_priv(dev);
1762
        unsigned long flags;
1763
 
1764
        spin_lock_irqsave(&lp->lock, flags);
1765
        /* Update the statistics from the device registers. */
1766
        lp->stats.rx_missed_errors += (readreg(dev, PP_RxMiss) >> 6);
1767
        lp->stats.collisions += (readreg(dev, PP_TxCol) >> 6);
1768
        spin_unlock_irqrestore(&lp->lock, flags);
1769
 
1770
        return &lp->stats;
1771
}
1772
 
1773
static void set_multicast_list(struct net_device *dev)
1774
{
1775
        struct net_local *lp = netdev_priv(dev);
1776
        unsigned long flags;
1777
 
1778
        spin_lock_irqsave(&lp->lock, flags);
1779
        if(dev->flags&IFF_PROMISC)
1780
        {
1781
                lp->rx_mode = RX_ALL_ACCEPT;
1782
        }
1783
        else if((dev->flags&IFF_ALLMULTI)||dev->mc_list)
1784
        {
1785
                /* The multicast-accept list is initialized to accept-all, and we
1786
                   rely on higher-level filtering for now. */
1787
                lp->rx_mode = RX_MULTCAST_ACCEPT;
1788
        }
1789
        else
1790
                lp->rx_mode = 0;
1791
 
1792
        writereg(dev, PP_RxCTL, DEF_RX_ACCEPT | lp->rx_mode);
1793
 
1794
        /* in promiscuous mode, we accept errored packets, so we have to enable interrupts on them also */
1795
        writereg(dev, PP_RxCFG, lp->curr_rx_cfg |
1796
             (lp->rx_mode == RX_ALL_ACCEPT? (RX_CRC_ERROR_ENBL|RX_RUNT_ENBL|RX_EXTRA_DATA_ENBL) : 0));
1797
        spin_unlock_irqrestore(&lp->lock, flags);
1798
}
1799
 
1800
 
1801
static int set_mac_address(struct net_device *dev, void *p)
1802
{
1803
        int i;
1804
        struct sockaddr *addr = p;
1805
 
1806
        if (netif_running(dev))
1807
                return -EBUSY;
1808
 
1809
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
1810
 
1811
        if (net_debug) {
1812
                DECLARE_MAC_BUF(mac);
1813
                printk("%s: Setting MAC address to %s.\n",
1814
                       dev->name, print_mac(mac, dev->dev_addr));
1815
        }
1816
        /* set the Ethernet address */
1817
        for (i=0; i < ETH_ALEN/2; i++)
1818
                writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
1819
 
1820
        return 0;
1821
}
1822
 
1823
#ifdef MODULE
1824
 
1825
static struct net_device *dev_cs89x0;
1826
 
1827
/*
1828
 * Support the 'debug' module parm even if we're compiled for non-debug to
1829
 * avoid breaking someone's startup scripts
1830
 */
1831
 
1832
static int io;
1833
static int irq;
1834
static int debug;
1835
static char media[8];
1836
static int duplex=-1;
1837
 
1838
static int use_dma;                     /* These generate unused var warnings if ALLOW_DMA = 0 */
1839
static int dma;
1840
static int dmasize=16;                  /* or 64 */
1841
 
1842
module_param(io, int, 0);
1843
module_param(irq, int, 0);
1844
module_param(debug, int, 0);
1845
module_param_string(media, media, sizeof(media), 0);
1846
module_param(duplex, int, 0);
1847
module_param(dma , int, 0);
1848
module_param(dmasize , int, 0);
1849
module_param(use_dma , int, 0);
1850
MODULE_PARM_DESC(io, "cs89x0 I/O base address");
1851
MODULE_PARM_DESC(irq, "cs89x0 IRQ number");
1852
#if DEBUGGING
1853
MODULE_PARM_DESC(debug, "cs89x0 debug level (0-6)");
1854
#else
1855
MODULE_PARM_DESC(debug, "(ignored)");
1856
#endif
1857
MODULE_PARM_DESC(media, "Set cs89x0 adapter(s) media type(s) (rj45,bnc,aui)");
1858
/* No other value than -1 for duplex seems to be currently interpreted */
1859
MODULE_PARM_DESC(duplex, "(ignored)");
1860
#if ALLOW_DMA
1861
MODULE_PARM_DESC(dma , "cs89x0 ISA DMA channel; ignored if use_dma=0");
1862
MODULE_PARM_DESC(dmasize , "cs89x0 DMA size in kB (16,64); ignored if use_dma=0");
1863
MODULE_PARM_DESC(use_dma , "cs89x0 using DMA (0-1)");
1864
#else
1865
MODULE_PARM_DESC(dma , "(ignored)");
1866
MODULE_PARM_DESC(dmasize , "(ignored)");
1867
MODULE_PARM_DESC(use_dma , "(ignored)");
1868
#endif
1869
 
1870
MODULE_AUTHOR("Mike Cruse, Russwll Nelson <nelson@crynwr.com>, Andrew Morton <andrewm@uow.edu.au>");
1871
MODULE_LICENSE("GPL");
1872
 
1873
 
1874
/*
1875
* media=t             - specify media type
1876
   or media=2
1877
   or media=aui
1878
   or medai=auto
1879
* duplex=0            - specify forced half/full/autonegotiate duplex
1880
* debug=#             - debug level
1881
 
1882
 
1883
* Default Chip Configuration:
1884
  * DMA Burst = enabled
1885
  * IOCHRDY Enabled = enabled
1886
    * UseSA = enabled
1887
    * CS8900 defaults to half-duplex if not specified on command-line
1888
    * CS8920 defaults to autoneg if not specified on command-line
1889
    * Use reset defaults for other config parameters
1890
 
1891
* Assumptions:
1892
  * media type specified is supported (circuitry is present)
1893
  * if memory address is > 1MB, then required mem decode hw is present
1894
  * if 10B-2, then agent other than driver will enable DC/DC converter
1895
    (hw or software util)
1896
 
1897
 
1898
*/
1899
 
1900
int __init init_module(void)
1901
{
1902
        struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
1903
        struct net_local *lp;
1904
        int ret = 0;
1905
 
1906
#if DEBUGGING
1907
        net_debug = debug;
1908
#else
1909
        debug = 0;
1910
#endif
1911
        if (!dev)
1912
                return -ENOMEM;
1913
 
1914
        dev->irq = irq;
1915
        dev->base_addr = io;
1916
        lp = netdev_priv(dev);
1917
 
1918
#if ALLOW_DMA
1919
        if (use_dma) {
1920
                lp->use_dma = use_dma;
1921
                lp->dma = dma;
1922
                lp->dmasize = dmasize;
1923
        }
1924
#endif
1925
 
1926
        spin_lock_init(&lp->lock);
1927
 
1928
        /* boy, they'd better get these right */
1929
        if (!strcmp(media, "rj45"))
1930
                lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;
1931
        else if (!strcmp(media, "aui"))
1932
                lp->adapter_cnf = A_CNF_MEDIA_AUI   | A_CNF_AUI;
1933
        else if (!strcmp(media, "bnc"))
1934
                lp->adapter_cnf = A_CNF_MEDIA_10B_2 | A_CNF_10B_2;
1935
        else
1936
                lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;
1937
 
1938
        if (duplex==-1)
1939
                lp->auto_neg_cnf = AUTO_NEG_ENABLE;
1940
 
1941
        if (io == 0) {
1942
                printk(KERN_ERR "cs89x0.c: Module autoprobing not allowed.\n");
1943
                printk(KERN_ERR "cs89x0.c: Append io=0xNNN\n");
1944
                ret = -EPERM;
1945
                goto out;
1946
        } else if (io <= 0x1ff) {
1947
                ret = -ENXIO;
1948
                goto out;
1949
        }
1950
 
1951
#if ALLOW_DMA
1952
        if (use_dma && dmasize != 16 && dmasize != 64) {
1953
                printk(KERN_ERR "cs89x0.c: dma size must be either 16K or 64K, not %dK\n", dmasize);
1954
                ret = -EPERM;
1955
                goto out;
1956
        }
1957
#endif
1958
        ret = cs89x0_probe1(dev, io, 1);
1959
        if (ret)
1960
                goto out;
1961
 
1962
        dev_cs89x0 = dev;
1963
        return 0;
1964
out:
1965
        free_netdev(dev);
1966
        return ret;
1967
}
1968
 
1969
void __exit
1970
cleanup_module(void)
1971
{
1972
        unregister_netdev(dev_cs89x0);
1973
        writeword(dev_cs89x0->base_addr, ADD_PORT, PP_ChipID);
1974
        release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT);
1975
        free_netdev(dev_cs89x0);
1976
}
1977
#endif /* MODULE */
1978
 
1979
/*
1980
 * Local variables:
1981
 *  version-control: t
1982
 *  kept-new-versions: 5
1983
 *  c-indent-level: 8
1984
 *  tab-width: 8
1985
 * End:
1986
 *
1987
 */

powered by: WebSVN 2.1.0

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