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

Subversion Repositories test_project

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/* 3c501.c: A 3Com 3c501 Ethernet driver for Linux. */
2
/*
3
    Written 1992,1993,1994  Donald Becker
4
 
5
    Copyright 1993 United States Government as represented by the
6
    Director, National Security Agency.  This software may be used and
7
    distributed according to the terms of the GNU General Public License,
8
    incorporated herein by reference.
9
 
10
    This is a device driver for the 3Com Etherlink 3c501.
11
    Do not purchase this card, even as a joke.  It's performance is horrible,
12
    and it breaks in many ways.
13
 
14
    The original author may be reached as becker@scyld.com, or C/O
15
        Scyld Computing Corporation
16
        410 Severn Ave., Suite 210
17
        Annapolis MD 21403
18
 
19
    Fixed (again!) the missing interrupt locking on TX/RX shifting.
20
                Alan Cox <Alan.Cox@linux.org>
21
 
22
    Removed calls to init_etherdev since they are no longer needed, and
23
    cleaned up modularization just a bit. The driver still allows only
24
    the default address for cards when loaded as a module, but that's
25
    really less braindead than anyone using a 3c501 board. :)
26
                    19950208 (invid@msen.com)
27
 
28
    Added traps for interrupts hitting the window as we clear and TX load
29
    the board. Now getting 150K/second FTP with a 3c501 card. Still playing
30
    with a TX-TX optimisation to see if we can touch 180-200K/second as seems
31
    theoretically maximum.
32
                19950402 Alan Cox <Alan.Cox@linux.org>
33
 
34
    Cleaned up for 2.3.x because we broke SMP now.
35
                20000208 Alan Cox <alan@redhat.com>
36
 
37
    Check up pass for 2.5. Nothing significant changed
38
                20021009 Alan Cox <alan@redhat.com>
39
 
40
    Fixed zero fill corner case
41
                20030104 Alan Cox <alan@redhat.com>
42
 
43
 
44
   For the avoidance of doubt the "preferred form" of this code is one which
45
   is in an open non patent encumbered format. Where cryptographic key signing
46
   forms part of the process of creating an executable the information
47
   including keys needed to generate an equivalently functional executable
48
   are deemed to be part of the source code.
49
 
50
*/
51
 
52
 
53
/**
54
 * DOC: 3c501 Card Notes
55
 *
56
 *  Some notes on this thing if you have to hack it.  [Alan]
57
 *
58
 *  Some documentation is available from 3Com. Due to the boards age
59
 *  standard responses when you ask for this will range from 'be serious'
60
 *  to 'give it to a museum'. The documentation is incomplete and mostly
61
 *  of historical interest anyway.
62
 *
63
 *  The basic system is a single buffer which can be used to receive or
64
 *  transmit a packet. A third command mode exists when you are setting
65
 *  things up.
66
 *
67
 *  If it's transmitting it's not receiving and vice versa. In fact the
68
 *  time to get the board back into useful state after an operation is
69
 *  quite large.
70
 *
71
 *  The driver works by keeping the board in receive mode waiting for a
72
 *  packet to arrive. When one arrives it is copied out of the buffer
73
 *  and delivered to the kernel. The card is reloaded and off we go.
74
 *
75
 *  When transmitting lp->txing is set and the card is reset (from
76
 *  receive mode) [possibly losing a packet just received] to command
77
 *  mode. A packet is loaded and transmit mode triggered. The interrupt
78
 *  handler runs different code for transmit interrupts and can handle
79
 *  returning to receive mode or retransmissions (yes you have to help
80
 *  out with those too).
81
 *
82
 * DOC: Problems
83
 *
84
 *  There are a wide variety of undocumented error returns from the card
85
 *  and you basically have to kick the board and pray if they turn up. Most
86
 *  only occur under extreme load or if you do something the board doesn't
87
 *  like (eg touching a register at the wrong time).
88
 *
89
 *  The driver is less efficient than it could be. It switches through
90
 *  receive mode even if more transmits are queued. If this worries you buy
91
 *  a real Ethernet card.
92
 *
93
 *  The combination of slow receive restart and no real multicast
94
 *  filter makes the board unusable with a kernel compiled for IP
95
 *  multicasting in a real multicast environment. That's down to the board,
96
 *  but even with no multicast programs running a multicast IP kernel is
97
 *  in group 224.0.0.1 and you will therefore be listening to all multicasts.
98
 *  One nv conference running over that Ethernet and you can give up.
99
 *
100
 */
101
 
102
#define DRV_NAME        "3c501"
103
#define DRV_VERSION     "2002/10/09"
104
 
105
 
106
static const char version[] =
107
        DRV_NAME ".c: " DRV_VERSION " Alan Cox (alan@redhat.com).\n";
108
 
109
/*
110
 *      Braindamage remaining:
111
 *      The 3c501 board.
112
 */
113
 
114
#include <linux/module.h>
115
 
116
#include <linux/kernel.h>
117
#include <linux/fcntl.h>
118
#include <linux/ioport.h>
119
#include <linux/interrupt.h>
120
#include <linux/slab.h>
121
#include <linux/string.h>
122
#include <linux/errno.h>
123
#include <linux/spinlock.h>
124
#include <linux/ethtool.h>
125
#include <linux/delay.h>
126
#include <linux/bitops.h>
127
 
128
#include <asm/uaccess.h>
129
#include <asm/io.h>
130
 
131
#include <linux/netdevice.h>
132
#include <linux/etherdevice.h>
133
#include <linux/skbuff.h>
134
#include <linux/init.h>
135
 
136
#include "3c501.h"
137
 
138
/*
139
 *      The boilerplate probe code.
140
 */
141
 
142
static int io=0x280;
143
static int irq=5;
144
static int mem_start;
145
 
146
/**
147
 * el1_probe:           -       probe for a 3c501
148
 * @dev: The device structure passed in to probe.
149
 *
150
 * This can be called from two places. The network layer will probe using
151
 * a device structure passed in with the probe information completed. For a
152
 * modular driver we use #init_module to fill in our own structure and probe
153
 * for it.
154
 *
155
 * Returns 0 on success. ENXIO if asked not to probe and ENODEV if asked to
156
 * probe and failing to find anything.
157
 */
158
 
159
struct net_device * __init el1_probe(int unit)
160
{
161
        struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
162
        static unsigned ports[] = { 0x280, 0x300, 0};
163
        unsigned *port;
164
        int err = 0;
165
 
166
        if (!dev)
167
                return ERR_PTR(-ENOMEM);
168
 
169
        if (unit >= 0) {
170
                sprintf(dev->name, "eth%d", unit);
171
                netdev_boot_setup_check(dev);
172
                io = dev->base_addr;
173
                irq = dev->irq;
174
                mem_start = dev->mem_start & 7;
175
        }
176
 
177
        if (io > 0x1ff) {       /* Check a single specified location. */
178
                err = el1_probe1(dev, io);
179
        } else if (io != 0) {
180
                err = -ENXIO;           /* Don't probe at all. */
181
        } else {
182
                for (port = ports; *port && el1_probe1(dev, *port); port++)
183
                        ;
184
                if (!*port)
185
                        err = -ENODEV;
186
        }
187
        if (err)
188
                goto out;
189
        err = register_netdev(dev);
190
        if (err)
191
                goto out1;
192
        return dev;
193
out1:
194
        release_region(dev->base_addr, EL1_IO_EXTENT);
195
out:
196
        free_netdev(dev);
197
        return ERR_PTR(err);
198
}
199
 
200
/**
201
 *      el1_probe1:
202
 *      @dev: The device structure to use
203
 *      @ioaddr: An I/O address to probe at.
204
 *
205
 *      The actual probe. This is iterated over by #el1_probe in order to
206
 *      check all the applicable device locations.
207
 *
208
 *      Returns 0 for a success, in which case the device is activated,
209
 *      EAGAIN if the IRQ is in use by another driver, and ENODEV if the
210
 *      board cannot be found.
211
 */
212
 
213
static int __init el1_probe1(struct net_device *dev, int ioaddr)
214
{
215
        struct net_local *lp;
216
        const char *mname;              /* Vendor name */
217
        unsigned char station_addr[6];
218
        int autoirq = 0;
219
        int i;
220
 
221
        /*
222
         *      Reserve I/O resource for exclusive use by this driver
223
         */
224
 
225
        if (!request_region(ioaddr, EL1_IO_EXTENT, DRV_NAME))
226
                return -ENODEV;
227
 
228
        /*
229
         *      Read the station address PROM data from the special port.
230
         */
231
 
232
        for (i = 0; i < 6; i++)
233
        {
234
                outw(i, ioaddr + EL1_DATAPTR);
235
                station_addr[i] = inb(ioaddr + EL1_SAPROM);
236
        }
237
        /*
238
         *      Check the first three octets of the S.A. for 3Com's prefix, or
239
         *      for the Sager NP943 prefix.
240
         */
241
 
242
        if (station_addr[0] == 0x02  &&  station_addr[1] == 0x60
243
                && station_addr[2] == 0x8c)
244
        {
245
                mname = "3c501";
246
        } else if (station_addr[0] == 0x00  &&  station_addr[1] == 0x80
247
        && station_addr[2] == 0xC8)
248
        {
249
                mname = "NP943";
250
        }
251
        else {
252
                release_region(ioaddr, EL1_IO_EXTENT);
253
                return -ENODEV;
254
        }
255
 
256
        /*
257
         *      We auto-IRQ by shutting off the interrupt line and letting it float
258
         *      high.
259
         */
260
 
261
        dev->irq = irq;
262
 
263
        if (dev->irq < 2)
264
        {
265
                unsigned long irq_mask;
266
 
267
                irq_mask = probe_irq_on();
268
                inb(RX_STATUS);         /* Clear pending interrupts. */
269
                inb(TX_STATUS);
270
                outb(AX_LOOP + 1, AX_CMD);
271
 
272
                outb(0x00, AX_CMD);
273
 
274
                mdelay(20);
275
                autoirq = probe_irq_off(irq_mask);
276
 
277
                if (autoirq == 0)
278
                {
279
                        printk(KERN_WARNING "%s probe at %#x failed to detect IRQ line.\n",
280
                                mname, ioaddr);
281
                        release_region(ioaddr, EL1_IO_EXTENT);
282
                        return -EAGAIN;
283
                }
284
        }
285
 
286
        outb(AX_RESET+AX_LOOP, AX_CMD);                 /* Loopback mode. */
287
        dev->base_addr = ioaddr;
288
        memcpy(dev->dev_addr, station_addr, ETH_ALEN);
289
 
290
        if (mem_start & 0xf)
291
                el_debug = mem_start & 0x7;
292
        if (autoirq)
293
                dev->irq = autoirq;
294
 
295
        printk(KERN_INFO "%s: %s EtherLink at %#lx, using %sIRQ %d.\n", dev->name, mname, dev->base_addr,
296
                        autoirq ? "auto":"assigned ", dev->irq);
297
 
298
#ifdef CONFIG_IP_MULTICAST
299
        printk(KERN_WARNING "WARNING: Use of the 3c501 in a multicast kernel is NOT recommended.\n");
300
#endif
301
 
302
        if (el_debug)
303
                printk(KERN_DEBUG "%s", version);
304
 
305
        memset(dev->priv, 0, sizeof(struct net_local));
306
        lp = netdev_priv(dev);
307
        spin_lock_init(&lp->lock);
308
 
309
        /*
310
         *      The EL1-specific entries in the device structure.
311
         */
312
 
313
        dev->open = &el_open;
314
        dev->hard_start_xmit = &el_start_xmit;
315
        dev->tx_timeout = &el_timeout;
316
        dev->watchdog_timeo = HZ;
317
        dev->stop = &el1_close;
318
        dev->set_multicast_list = &set_multicast_list;
319
        dev->ethtool_ops = &netdev_ethtool_ops;
320
        return 0;
321
}
322
 
323
/**
324
 *      el1_open:
325
 *      @dev: device that is being opened
326
 *
327
 *      When an ifconfig is issued which changes the device flags to include
328
 *      IFF_UP this function is called. It is only called when the change
329
 *      occurs, not when the interface remains up. #el1_close will be called
330
 *      when it goes down.
331
 *
332
 *      Returns 0 for a successful open, or -EAGAIN if someone has run off
333
 *      with our interrupt line.
334
 */
335
 
336
static int el_open(struct net_device *dev)
337
{
338
        int retval;
339
        int ioaddr = dev->base_addr;
340
        struct net_local *lp = netdev_priv(dev);
341
        unsigned long flags;
342
 
343
        if (el_debug > 2)
344
                printk(KERN_DEBUG "%s: Doing el_open()...", dev->name);
345
 
346
        if ((retval = request_irq(dev->irq, &el_interrupt, 0, dev->name, dev)))
347
                return retval;
348
 
349
        spin_lock_irqsave(&lp->lock, flags);
350
        el_reset(dev);
351
        spin_unlock_irqrestore(&lp->lock, flags);
352
 
353
        lp->txing = 0;           /* Board in RX mode */
354
        outb(AX_RX, AX_CMD);    /* Aux control, irq and receive enabled */
355
        netif_start_queue(dev);
356
        return 0;
357
}
358
 
359
/**
360
 * el_timeout:
361
 * @dev: The 3c501 card that has timed out
362
 *
363
 * Attempt to restart the board. This is basically a mixture of extreme
364
 * violence and prayer
365
 *
366
 */
367
 
368
static void el_timeout(struct net_device *dev)
369
{
370
        struct net_local *lp = netdev_priv(dev);
371
        int ioaddr = dev->base_addr;
372
 
373
        if (el_debug)
374
                printk (KERN_DEBUG "%s: transmit timed out, txsr %#2x axsr=%02x rxsr=%02x.\n",
375
                        dev->name, inb(TX_STATUS), inb(AX_STATUS), inb(RX_STATUS));
376
        dev->stats.tx_errors++;
377
        outb(TX_NORM, TX_CMD);
378
        outb(RX_NORM, RX_CMD);
379
        outb(AX_OFF, AX_CMD);   /* Just trigger a false interrupt. */
380
        outb(AX_RX, AX_CMD);    /* Aux control, irq and receive enabled */
381
        lp->txing = 0;           /* Ripped back in to RX */
382
        netif_wake_queue(dev);
383
}
384
 
385
 
386
/**
387
 * el_start_xmit:
388
 * @skb: The packet that is queued to be sent
389
 * @dev: The 3c501 card we want to throw it down
390
 *
391
 * Attempt to send a packet to a 3c501 card. There are some interesting
392
 * catches here because the 3c501 is an extremely old and therefore
393
 * stupid piece of technology.
394
 *
395
 * If we are handling an interrupt on the other CPU we cannot load a packet
396
 * as we may still be attempting to retrieve the last RX packet buffer.
397
 *
398
 * When a transmit times out we dump the card into control mode and just
399
 * start again. It happens enough that it isnt worth logging.
400
 *
401
 * We avoid holding the spin locks when doing the packet load to the board.
402
 * The device is very slow, and its DMA mode is even slower. If we held the
403
 * lock while loading 1500 bytes onto the controller we would drop a lot of
404
 * serial port characters. This requires we do extra locking, but we have
405
 * no real choice.
406
 */
407
 
408
static int el_start_xmit(struct sk_buff *skb, struct net_device *dev)
409
{
410
        struct net_local *lp = netdev_priv(dev);
411
        int ioaddr = dev->base_addr;
412
        unsigned long flags;
413
 
414
        /*
415
         *      Avoid incoming interrupts between us flipping txing and flipping
416
         *      mode as the driver assumes txing is a faithful indicator of card
417
         *      state
418
         */
419
 
420
        spin_lock_irqsave(&lp->lock, flags);
421
 
422
        /*
423
         *      Avoid timer-based retransmission conflicts.
424
         */
425
 
426
        netif_stop_queue(dev);
427
 
428
        do
429
        {
430
                int len = skb->len;
431
                int pad = 0;
432
                int gp_start;
433
                unsigned char *buf = skb->data;
434
 
435
                if (len < ETH_ZLEN)
436
                        pad = ETH_ZLEN - len;
437
 
438
                gp_start = 0x800 - ( len + pad );
439
 
440
                lp->tx_pkt_start = gp_start;
441
                lp->collisions = 0;
442
 
443
                dev->stats.tx_bytes += skb->len;
444
 
445
                /*
446
                 *      Command mode with status cleared should [in theory]
447
                 *      mean no more interrupts can be pending on the card.
448
                 */
449
 
450
                outb_p(AX_SYS, AX_CMD);
451
                inb_p(RX_STATUS);
452
                inb_p(TX_STATUS);
453
 
454
                lp->loading = 1;
455
                lp->txing = 1;
456
 
457
                /*
458
                 *      Turn interrupts back on while we spend a pleasant afternoon
459
                 *      loading bytes into the board
460
                 */
461
 
462
                spin_unlock_irqrestore(&lp->lock, flags);
463
 
464
                outw(0x00, RX_BUF_CLR);         /* Set rx packet area to 0. */
465
                outw(gp_start, GP_LOW);         /* aim - packet will be loaded into buffer start */
466
                outsb(DATAPORT,buf,len);        /* load buffer (usual thing each byte increments the pointer) */
467
                if (pad) {
468
                        while(pad--)            /* Zero fill buffer tail */
469
                                outb(0, DATAPORT);
470
                }
471
                outw(gp_start, GP_LOW);         /* the board reuses the same register */
472
 
473
                if(lp->loading != 2)
474
                {
475
                        outb(AX_XMIT, AX_CMD);          /* fire ... Trigger xmit.  */
476
                        lp->loading=0;
477
                        dev->trans_start = jiffies;
478
                        if (el_debug > 2)
479
                                printk(KERN_DEBUG " queued xmit.\n");
480
                        dev_kfree_skb (skb);
481
                        return 0;
482
                }
483
                /* A receive upset our load, despite our best efforts */
484
                if(el_debug>2)
485
                        printk(KERN_DEBUG "%s: burped during tx load.\n", dev->name);
486
                spin_lock_irqsave(&lp->lock, flags);
487
        }
488
        while(1);
489
 
490
}
491
 
492
/**
493
 * el_interrupt:
494
 * @irq: Interrupt number
495
 * @dev_id: The 3c501 that burped
496
 *
497
 * Handle the ether interface interrupts. The 3c501 needs a lot more
498
 * hand holding than most cards. In particular we get a transmit interrupt
499
 * with a collision error because the board firmware isnt capable of rewinding
500
 * its own transmit buffer pointers. It can however count to 16 for us.
501
 *
502
 * On the receive side the card is also very dumb. It has no buffering to
503
 * speak of. We simply pull the packet out of its PIO buffer (which is slow)
504
 * and queue it for the kernel. Then we reset the card for the next packet.
505
 *
506
 * We sometimes get surprise interrupts late both because the SMP IRQ delivery
507
 * is message passing and because the card sometimes seems to deliver late. I
508
 * think if it is part way through a receive and the mode is changed it carries
509
 * on receiving and sends us an interrupt. We have to band aid all these cases
510
 * to get a sensible 150kBytes/second performance. Even then you want a small
511
 * TCP window.
512
 */
513
 
514
static irqreturn_t el_interrupt(int irq, void *dev_id)
515
{
516
        struct net_device *dev = dev_id;
517
        struct net_local *lp;
518
        int ioaddr;
519
        int axsr;                       /* Aux. status reg. */
520
 
521
        ioaddr = dev->base_addr;
522
        lp = netdev_priv(dev);
523
 
524
        spin_lock(&lp->lock);
525
 
526
        /*
527
         *      What happened ?
528
         */
529
 
530
        axsr = inb(AX_STATUS);
531
 
532
        /*
533
         *      Log it
534
         */
535
 
536
        if (el_debug > 3)
537
                printk(KERN_DEBUG "%s: el_interrupt() aux=%#02x", dev->name, axsr);
538
 
539
        if(lp->loading==1 && !lp->txing)
540
                printk(KERN_WARNING "%s: Inconsistent state loading while not in tx\n",
541
                        dev->name);
542
 
543
        if (lp->txing)
544
        {
545
 
546
                /*
547
                 *      Board in transmit mode. May be loading. If we are
548
                 *      loading we shouldn't have got this.
549
                 */
550
 
551
                int txsr = inb(TX_STATUS);
552
 
553
                if(lp->loading==1)
554
                {
555
                        if(el_debug > 2)
556
                        {
557
                                printk(KERN_DEBUG "%s: Interrupt while loading [", dev->name);
558
                                printk(KERN_DEBUG " txsr=%02x gp=%04x rp=%04x]\n", txsr, inw(GP_LOW),inw(RX_LOW));
559
                        }
560
                        lp->loading=2;          /* Force a reload */
561
                        spin_unlock(&lp->lock);
562
                        goto out;
563
                }
564
 
565
                if (el_debug > 6)
566
                        printk(KERN_DEBUG " txsr=%02x gp=%04x rp=%04x", txsr, inw(GP_LOW),inw(RX_LOW));
567
 
568
                if ((axsr & 0x80) && (txsr & TX_READY) == 0)
569
                {
570
                        /*
571
                         *      FIXME: is there a logic to whether to keep on trying or
572
                         *      reset immediately ?
573
                         */
574
                        if(el_debug>1)
575
                                printk(KERN_DEBUG "%s: Unusual interrupt during Tx, txsr=%02x axsr=%02x"
576
                                        " gp=%03x rp=%03x.\n", dev->name, txsr, axsr,
577
                        inw(ioaddr + EL1_DATAPTR), inw(ioaddr + EL1_RXPTR));
578
                        lp->txing = 0;
579
                        netif_wake_queue(dev);
580
                }
581
                else if (txsr & TX_16COLLISIONS)
582
                {
583
                        /*
584
                         *      Timed out
585
                         */
586
                        if (el_debug)
587
                                printk (KERN_DEBUG "%s: Transmit failed 16 times, Ethernet jammed?\n",dev->name);
588
                        outb(AX_SYS, AX_CMD);
589
                        lp->txing = 0;
590
                        dev->stats.tx_aborted_errors++;
591
                        netif_wake_queue(dev);
592
                }
593
                else if (txsr & TX_COLLISION)
594
                {
595
                        /*
596
                         *      Retrigger xmit.
597
                         */
598
 
599
                        if (el_debug > 6)
600
                                printk(KERN_DEBUG " retransmitting after a collision.\n");
601
                        /*
602
                         *      Poor little chip can't reset its own start pointer
603
                         */
604
 
605
                        outb(AX_SYS, AX_CMD);
606
                        outw(lp->tx_pkt_start, GP_LOW);
607
                        outb(AX_XMIT, AX_CMD);
608
                        dev->stats.collisions++;
609
                        spin_unlock(&lp->lock);
610
                        goto out;
611
                }
612
                else
613
                {
614
                        /*
615
                         *      It worked.. we will now fall through and receive
616
                         */
617
                        dev->stats.tx_packets++;
618
                        if (el_debug > 6)
619
                                printk(KERN_DEBUG " Tx succeeded %s\n",
620
                                        (txsr & TX_RDY) ? "." : "but tx is busy!");
621
                        /*
622
                         *      This is safe the interrupt is atomic WRT itself.
623
                         */
624
 
625
                        lp->txing = 0;
626
                        netif_wake_queue(dev);  /* In case more to transmit */
627
                }
628
        }
629
        else
630
        {
631
                /*
632
                 *      In receive mode.
633
                 */
634
 
635
                int rxsr = inb(RX_STATUS);
636
                if (el_debug > 5)
637
                        printk(KERN_DEBUG " rxsr=%02x txsr=%02x rp=%04x", rxsr, inb(TX_STATUS),inw(RX_LOW));
638
                /*
639
                 *      Just reading rx_status fixes most errors.
640
                 */
641
                if (rxsr & RX_MISSED)
642
                        dev->stats.rx_missed_errors++;
643
                else if (rxsr & RX_RUNT)
644
                {       /* Handled to avoid board lock-up. */
645
                        dev->stats.rx_length_errors++;
646
                        if (el_debug > 5)
647
                                printk(KERN_DEBUG " runt.\n");
648
                }
649
                else if (rxsr & RX_GOOD)
650
                {
651
                        /*
652
                         *      Receive worked.
653
                         */
654
                        el_receive(dev);
655
                }
656
                else
657
                {
658
                        /*
659
                         *      Nothing?  Something is broken!
660
                         */
661
                        if (el_debug > 2)
662
                                printk(KERN_DEBUG "%s: No packet seen, rxsr=%02x **resetting 3c501***\n",
663
                                        dev->name, rxsr);
664
                        el_reset(dev);
665
                }
666
                if (el_debug > 3)
667
                        printk(KERN_DEBUG ".\n");
668
        }
669
 
670
        /*
671
         *      Move into receive mode
672
         */
673
 
674
        outb(AX_RX, AX_CMD);
675
        outw(0x00, RX_BUF_CLR);
676
        inb(RX_STATUS);         /* Be certain that interrupts are cleared. */
677
        inb(TX_STATUS);
678
        spin_unlock(&lp->lock);
679
out:
680
        return IRQ_HANDLED;
681
}
682
 
683
 
684
/**
685
 * el_receive:
686
 * @dev: Device to pull the packets from
687
 *
688
 * We have a good packet. Well, not really "good", just mostly not broken.
689
 * We must check everything to see if it is good. In particular we occasionally
690
 * get wild packet sizes from the card. If the packet seems sane we PIO it
691
 * off the card and queue it for the protocol layers.
692
 */
693
 
694
static void el_receive(struct net_device *dev)
695
{
696
        int ioaddr = dev->base_addr;
697
        int pkt_len;
698
        struct sk_buff *skb;
699
 
700
        pkt_len = inw(RX_LOW);
701
 
702
        if (el_debug > 4)
703
                printk(KERN_DEBUG " el_receive %d.\n", pkt_len);
704
 
705
        if ((pkt_len < 60)  ||  (pkt_len > 1536))
706
        {
707
                if (el_debug)
708
                        printk(KERN_DEBUG "%s: bogus packet, length=%d\n", dev->name, pkt_len);
709
                dev->stats.rx_over_errors++;
710
                return;
711
        }
712
 
713
        /*
714
         *      Command mode so we can empty the buffer
715
         */
716
 
717
        outb(AX_SYS, AX_CMD);
718
        skb = dev_alloc_skb(pkt_len+2);
719
 
720
        /*
721
         *      Start of frame
722
         */
723
 
724
        outw(0x00, GP_LOW);
725
        if (skb == NULL)
726
        {
727
                printk(KERN_INFO "%s: Memory squeeze, dropping packet.\n", dev->name);
728
                dev->stats.rx_dropped++;
729
                return;
730
        }
731
        else
732
        {
733
                skb_reserve(skb,2);     /* Force 16 byte alignment */
734
                /*
735
                 *      The read increments through the bytes. The interrupt
736
                 *      handler will fix the pointer when it returns to
737
                 *      receive mode.
738
                 */
739
                insb(DATAPORT, skb_put(skb,pkt_len), pkt_len);
740
                skb->protocol=eth_type_trans(skb,dev);
741
                netif_rx(skb);
742
                dev->last_rx = jiffies;
743
                dev->stats.rx_packets++;
744
                dev->stats.rx_bytes+=pkt_len;
745
        }
746
        return;
747
}
748
 
749
/**
750
 * el_reset: Reset a 3c501 card
751
 * @dev: The 3c501 card about to get zapped
752
 *
753
 * Even resetting a 3c501 isnt simple. When you activate reset it loses all
754
 * its configuration. You must hold the lock when doing this. The function
755
 * cannot take the lock itself as it is callable from the irq handler.
756
 */
757
 
758
static void  el_reset(struct net_device *dev)
759
{
760
        struct net_local *lp = netdev_priv(dev);
761
        int ioaddr = dev->base_addr;
762
 
763
        if (el_debug> 2)
764
                printk(KERN_INFO "3c501 reset...");
765
        outb(AX_RESET, AX_CMD);         /* Reset the chip */
766
        outb(AX_LOOP, AX_CMD);          /* Aux control, irq and loopback enabled */
767
        {
768
                int i;
769
                for (i = 0; i < 6; i++)  /* Set the station address. */
770
                        outb(dev->dev_addr[i], ioaddr + i);
771
        }
772
 
773
        outw(0, RX_BUF_CLR);             /* Set rx packet area to 0. */
774
        outb(TX_NORM, TX_CMD);          /* tx irq on done, collision */
775
        outb(RX_NORM, RX_CMD);          /* Set Rx commands. */
776
        inb(RX_STATUS);                 /* Clear status. */
777
        inb(TX_STATUS);
778
        lp->txing = 0;
779
}
780
 
781
/**
782
 * el1_close:
783
 * @dev: 3c501 card to shut down
784
 *
785
 * Close a 3c501 card. The IFF_UP flag has been cleared by the user via
786
 * the SIOCSIFFLAGS ioctl. We stop any further transmissions being queued,
787
 * and then disable the interrupts. Finally we reset the chip. The effects
788
 * of the rest will be cleaned up by #el1_open. Always returns 0 indicating
789
 * a success.
790
 */
791
 
792
static int el1_close(struct net_device *dev)
793
{
794
        int ioaddr = dev->base_addr;
795
 
796
        if (el_debug > 2)
797
                printk(KERN_INFO "%s: Shutting down Ethernet card at %#x.\n", dev->name, ioaddr);
798
 
799
        netif_stop_queue(dev);
800
 
801
        /*
802
         *      Free and disable the IRQ.
803
         */
804
 
805
        free_irq(dev->irq, dev);
806
        outb(AX_RESET, AX_CMD);         /* Reset the chip */
807
 
808
        return 0;
809
}
810
 
811
/**
812
 * set_multicast_list:
813
 * @dev: The device to adjust
814
 *
815
 * Set or clear the multicast filter for this adaptor to use the best-effort
816
 * filtering supported. The 3c501 supports only three modes of filtering.
817
 * It always receives broadcasts and packets for itself. You can choose to
818
 * optionally receive all packets, or all multicast packets on top of this.
819
 */
820
 
821
static void set_multicast_list(struct net_device *dev)
822
{
823
        int ioaddr = dev->base_addr;
824
 
825
        if(dev->flags&IFF_PROMISC)
826
        {
827
                outb(RX_PROM, RX_CMD);
828
                inb(RX_STATUS);
829
        }
830
        else if (dev->mc_list || dev->flags&IFF_ALLMULTI)
831
        {
832
                outb(RX_MULT, RX_CMD);  /* Multicast or all multicast is the same */
833
                inb(RX_STATUS);         /* Clear status. */
834
        }
835
        else
836
        {
837
                outb(RX_NORM, RX_CMD);
838
                inb(RX_STATUS);
839
        }
840
}
841
 
842
 
843
static void netdev_get_drvinfo(struct net_device *dev,
844
                               struct ethtool_drvinfo *info)
845
{
846
        strcpy(info->driver, DRV_NAME);
847
        strcpy(info->version, DRV_VERSION);
848
        sprintf(info->bus_info, "ISA 0x%lx", dev->base_addr);
849
}
850
 
851
static u32 netdev_get_msglevel(struct net_device *dev)
852
{
853
        return debug;
854
}
855
 
856
static void netdev_set_msglevel(struct net_device *dev, u32 level)
857
{
858
        debug = level;
859
}
860
 
861
static const struct ethtool_ops netdev_ethtool_ops = {
862
        .get_drvinfo            = netdev_get_drvinfo,
863
        .get_msglevel           = netdev_get_msglevel,
864
        .set_msglevel           = netdev_set_msglevel,
865
};
866
 
867
#ifdef MODULE
868
 
869
static struct net_device *dev_3c501;
870
 
871
module_param(io, int, 0);
872
module_param(irq, int, 0);
873
MODULE_PARM_DESC(io, "EtherLink I/O base address");
874
MODULE_PARM_DESC(irq, "EtherLink IRQ number");
875
 
876
/**
877
 * init_module:
878
 *
879
 * When the driver is loaded as a module this function is called. We fake up
880
 * a device structure with the base I/O and interrupt set as if it were being
881
 * called from Space.c. This minimises the extra code that would otherwise
882
 * be required.
883
 *
884
 * Returns 0 for success or -EIO if a card is not found. Returning an error
885
 * here also causes the module to be unloaded
886
 */
887
 
888
int __init init_module(void)
889
{
890
        dev_3c501 = el1_probe(-1);
891
        if (IS_ERR(dev_3c501))
892
                return PTR_ERR(dev_3c501);
893
        return 0;
894
}
895
 
896
/**
897
 * cleanup_module:
898
 *
899
 * The module is being unloaded. We unhook our network device from the system
900
 * and then free up the resources we took when the card was found.
901
 */
902
 
903
void __exit cleanup_module(void)
904
{
905
        struct net_device *dev = dev_3c501;
906
        unregister_netdev(dev);
907
        release_region(dev->base_addr, EL1_IO_EXTENT);
908
        free_netdev(dev);
909
}
910
 
911
#endif /* MODULE */
912
 
913
MODULE_AUTHOR("Donald Becker, Alan Cox");
914
MODULE_DESCRIPTION("Support for the ancient 3Com 3c501 ethernet card");
915
MODULE_LICENSE("GPL");
916
 

powered by: WebSVN 2.1.0

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