1
/* at1700.c: A network device driver for the Allied Telesis AT1700.
3
Written 1993-98 by Donald Becker.
5
Copyright 1993 United States Government as represented by the
6
Director, National Security Agency.
8
This software may be used and distributed according to the terms
9
of the GNU General Public License, incorporated herein by reference.
11
The author may be reached as becker@scyld.com, or C/O
12
Scyld Computing Corporation
13
410 Severn Ave., Suite 210
16
This is a device driver for the Allied Telesis AT1700, and
17
Fujitsu FMV-181/182/181A/182A/183/184/183A/184A, which are
18
straight-forward Fujitsu MB86965 implementations.
20
Modification for Fujitsu FMV-18X cards is done by Yutaka Tamiya
21
(tamy@flab.fujitsu.co.jp).
24
The Fujitsu MB86965 datasheet.
26
After the initial version of this driver was written Gerry Sawkins of
27
ATI provided their EEPROM configuration code header file.
28
Thanks to NIIBE Yutaka <gniibe@mri.co.jp> for bug fixes.
30
MCA bus (AT1720) support by Rene Schmit <rene@bss.lu>
33
The MB86965 has a design flaw that makes all probes unreliable. Not
34
only is it difficult to detect, it also moves around in I/O space in
35
response to inb()s from other device probes!
38
#include <linux/errno.h>
39
#include <linux/netdevice.h>
40
#include <linux/etherdevice.h>
41
#include <linux/mca-legacy.h>
42
#include <linux/module.h>
43
#include <linux/kernel.h>
44
#include <linux/types.h>
45
#include <linux/fcntl.h>
46
#include <linux/interrupt.h>
47
#include <linux/ioport.h>
49
#include <linux/skbuff.h>
50
#include <linux/string.h>
51
#include <linux/init.h>
52
#include <linux/crc32.h>
53
#include <linux/bitops.h>
55
#include <asm/system.h>
59
static char version[] __initdata =
60
"at1700.c:v1.16 9/11/06 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
62
#define DRV_NAME "at1700"
64
/* Tunable parameters. */
66
/* When to switch from the 64-entry multicast filter to Rx-all-multicast. */
67
#define MC_FILTERBREAK 64
69
/* These unusual address orders are used to verify the CONFIG register. */
71
static int fmv18x_probe_list[] __initdata = {
72
0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x300, 0x340, 0
79
static unsigned at1700_probe_list[] __initdata = {
80
0x260, 0x280, 0x2a0, 0x240, 0x340, 0x320, 0x380, 0x300, 0
86
#ifdef CONFIG_MCA_LEGACY
87
static int at1700_ioaddr_pattern[] __initdata = {
88
0x00, 0x04, 0x01, 0x05, 0x02, 0x06, 0x03, 0x07
91
static int at1700_mca_probe_list[] __initdata = {
92
0x400, 0x1400, 0x2400, 0x3400, 0x4400, 0x5400, 0x6400, 0x7400, 0
95
static int at1700_irq_pattern[] __initdata = {
96
0x00, 0x00, 0x00, 0x30, 0x70, 0xb0, 0x00, 0x00,
97
0x00, 0xf0, 0x34, 0x74, 0xb4, 0x00, 0x00, 0xf4, 0x00
101
/* use 0 for production, 1 for verification, >2 for debug */
105
static unsigned int net_debug = NET_DEBUG;
107
typedef unsigned char uchar;
109
/* Information that need to be kept for each board. */
112
unsigned char mc_filter[8];
113
uint jumpered:1; /* Set iff the board has jumper config. */
114
uint tx_started:1; /* Packets are on the Tx queue. */
115
uint tx_queue_ready:1; /* Tx queue is ready to be sent. */
116
uint rx_started:1; /* Packets are Rxing. */
117
uchar tx_queue; /* Number of packet on the Tx queue. */
118
char mca_slot; /* -1 means ISA */
119
ushort tx_queue_len; /* Current length of the Tx queue. */
123
/* Offsets from the base address. */
127
#define TX_INTR 2 /* Bit-mapped interrupt enable registers. */
131
#define CONFIG_0 6 /* Misc. configuration settings. */
133
/* Run-time register bank 2 definitions. */
134
#define DATAPORT 8 /* Word-wide DMA or programmed-I/O dataport. */
136
#define COL16CNTL 11 /* Control Reg for 16 collisions */
139
/* Configuration registers only on the '865A/B chips. */
140
#define EEPROM_Ctrl 16
141
#define EEPROM_Data 17
142
#define CARDSTATUS 16 /* FMV-18x Card Status */
143
#define CARDSTATUS1 17 /* FMV-18x Card Status */
144
#define IOCONFIG 18 /* Either read the jumper, or move the I/O. */
146
#define SAPROM 20 /* The station address PROM, if no EEPROM. */
148
#define RESET 31 /* Write to reset some parts of the chip. */
149
#define AT1700_IO_EXTENT 32
150
#define PORT_OFFSET(o) (o)
153
#define TX_TIMEOUT (HZ/10)
156
/* Index to functions, as function prototypes. */
158
static int at1700_probe1(struct net_device *dev, int ioaddr);
159
static int read_eeprom(long ioaddr, int location);
160
static int net_open(struct net_device *dev);
161
static netdev_tx_t net_send_packet(struct sk_buff *skb,
162
struct net_device *dev);
163
static irqreturn_t net_interrupt(int irq, void *dev_id);
164
static void net_rx(struct net_device *dev);
165
static int net_close(struct net_device *dev);
166
static void set_rx_mode(struct net_device *dev);
167
static void net_tx_timeout (struct net_device *dev);
170
#ifdef CONFIG_MCA_LEGACY
171
struct at1720_mca_adapters_struct {
175
/* rEnE : maybe there are others I don't know off... */
177
static struct at1720_mca_adapters_struct at1720_mca_adapters[] __initdata = {
178
{ "Allied Telesys AT1720AT", 0x6410 },
179
{ "Allied Telesys AT1720BT", 0x6413 },
180
{ "Allied Telesys AT1720T", 0x6416 },
185
/* Check for a network adaptor of this type, and return '0' iff one exists.
186
If dev->base_addr == 0, probe all likely locations.
187
If dev->base_addr == 1, always return failure.
188
If dev->base_addr == 2, allocate space for the device and return success
189
(detachable devices only).
192
static int io = 0x260;
196
static void cleanup_card(struct net_device *dev)
198
#ifdef CONFIG_MCA_LEGACY
199
struct net_local *lp = netdev_priv(dev);
200
if (lp->mca_slot >= 0)
201
mca_mark_as_unused(lp->mca_slot);
203
free_irq(dev->irq, NULL);
204
release_region(dev->base_addr, AT1700_IO_EXTENT);
207
struct net_device * __init at1700_probe(int unit)
209
struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
214
return ERR_PTR(-ENODEV);
217
sprintf(dev->name, "eth%d", unit);
218
netdev_boot_setup_check(dev);
226
if (io > 0x1ff) { /* Check a single specified location. */
227
err = at1700_probe1(dev, io);
228
} else if (io != 0) { /* Don't probe at all. */
231
for (port = at1700_probe_list; *port; port++) {
232
if (at1700_probe1(dev, *port) == 0)
241
err = register_netdev(dev);
252
static const struct net_device_ops at1700_netdev_ops = {
253
.ndo_open = net_open,
254
.ndo_stop = net_close,
255
.ndo_start_xmit = net_send_packet,
256
.ndo_set_rx_mode = set_rx_mode,
257
.ndo_tx_timeout = net_tx_timeout,
258
.ndo_change_mtu = eth_change_mtu,
259
.ndo_set_mac_address = eth_mac_addr,
260
.ndo_validate_addr = eth_validate_addr,
263
/* The Fujitsu datasheet suggests that the NIC be probed for by checking its
264
"signature", the default bit pattern after a reset. This *doesn't* work --
265
there is no way to reset the bus interface without a complete power-cycle!
267
It turns out that ATI came to the same conclusion I did: the only thing
268
that can be done is checking a few bits and then diving right into an
271
static int __init at1700_probe1(struct net_device *dev, int ioaddr)
273
static const char fmv_irqmap[4] = {3, 7, 10, 15};
274
static const char fmv_irqmap_pnp[8] = {3, 4, 5, 7, 9, 10, 11, 15};
275
static const char at1700_irqmap[8] = {3, 4, 5, 9, 10, 11, 14, 15};
276
unsigned int i, irq, is_fmv18x = 0, is_at1700 = 0;
277
int slot, ret = -ENODEV;
278
struct net_local *lp = netdev_priv(dev);
280
if (!request_region(ioaddr, AT1700_IO_EXTENT, DRV_NAME))
283
/* Resetting the chip doesn't reset the ISA interface, so don't bother.
284
That means we have to be careful with the register values we probe
288
printk("at1700 probe at %#x, eeprom is %4.4x %4.4x %4.4x ctrl %4.4x.\n",
289
ioaddr, read_eeprom(ioaddr, 4), read_eeprom(ioaddr, 5),
290
read_eeprom(ioaddr, 6), inw(ioaddr + EEPROM_Ctrl));
293
#ifdef CONFIG_MCA_LEGACY
294
/* rEnE (rene@bss.lu): got this from 3c509 driver source , adapted for AT1720 */
296
/* Based on Erik Nygren's (nygren@mit.edu) 3c529 patch, heavily
297
modified by Chris Beauregard (cpbeaure@csclub.uwaterloo.ca)
298
to support standard MCA probing. */
300
/* redone for multi-card detection by ZP Gu (zpg@castle.net) */
301
/* now works as a module */
308
for (j = 0; at1720_mca_adapters[j].name != NULL; j ++) {
310
while (slot != MCA_NOTFOUND) {
312
slot = mca_find_unused_adapter( at1720_mca_adapters[j].id, slot );
313
if (slot == MCA_NOTFOUND) break;
315
/* if we get this far, an adapter has been detected and is
318
pos3 = mca_read_stored_pos( slot, 3 );
319
pos4 = mca_read_stored_pos( slot, 4 );
321
for (l_i = 0; l_i < 8; l_i++)
322
if (( pos3 & 0x07) == at1700_ioaddr_pattern[l_i])
324
ioaddr = at1700_mca_probe_list[l_i];
326
for (irq = 0; irq < 0x10; irq++)
327
if (((((pos4>>4) & 0x0f) | (pos3 & 0xf0)) & 0xff) == at1700_irq_pattern[irq])
330
/* probing for a card at a particular IO/IRQ */
331
if ((dev->irq && dev->irq != irq) ||
332
(dev->base_addr && dev->base_addr != ioaddr)) {
333
slot++; /* probing next slot */
340
mca_set_adapter_name( slot, at1720_mca_adapters[j].name );
341
mca_mark_as_used(slot);
346
/* if we get here, we didn't find an MCA adapter - try ISA */
350
/* We must check for the EEPROM-config boards first, else accessing
351
IOCONFIG0 will move the board! */
352
if (at1700_probe_list[inb(ioaddr + IOCONFIG1) & 0x07] == ioaddr &&
353
read_eeprom(ioaddr, 4) == 0x0000 &&
354
(read_eeprom(ioaddr, 5) & 0xff00) == 0xF400)
356
else if (inb(ioaddr + SAPROM ) == 0x00 &&
357
inb(ioaddr + SAPROM + 1) == 0x00 &&
358
inb(ioaddr + SAPROM + 2) == 0x0e)
364
#ifdef CONFIG_MCA_LEGACY
368
/* Reset the internal state machines. */
369
outb(0, ioaddr + RESET);
372
irq = at1700_irqmap[(read_eeprom(ioaddr, 12)&0x04)
373
| (read_eeprom(ioaddr, 0)>>14)];
375
/* Check PnP mode for FMV-183/184/183A/184A. */
376
/* This PnP routine is very poor. IO and IRQ should be known. */
377
if (inb(ioaddr + CARDSTATUS1) & 0x20) {
379
for (i = 0; i < 8; i++) {
380
if (irq == fmv_irqmap_pnp[i])
387
if (fmv18x_probe_list[inb(ioaddr + IOCONFIG) & 0x07] != ioaddr)
389
irq = fmv_irqmap[(inb(ioaddr + IOCONFIG)>>6) & 0x03];
393
printk("%s: %s found at %#3x, IRQ %d, address ", dev->name,
394
is_at1700 ? "AT1700" : "FMV-18X", ioaddr, irq);
396
dev->base_addr = ioaddr;
400
for(i = 0; i < 3; i++) {
401
unsigned short eeprom_val = read_eeprom(ioaddr, 4+i);
402
((unsigned short *)dev->dev_addr)[i] = ntohs(eeprom_val);
405
for(i = 0; i < 6; i++) {
406
unsigned char val = inb(ioaddr + SAPROM + i);
407
dev->dev_addr[i] = val;
410
printk("%pM", dev->dev_addr);
412
/* The EEPROM word 12 bit 0x0400 means use regular 100 ohm 10baseT signals,
413
rather than 150 ohm shielded twisted pair compensation.
414
0x0000 == auto-sense the interface
415
0x0800 == use TP interface
416
0x1800 == use coax interface
419
const char *porttype[] = {"auto-sense", "10baseT", "auto-sense", "10base2"};
421
ushort setup_value = read_eeprom(ioaddr, 12);
422
dev->if_port = setup_value >> 8;
424
ushort setup_value = inb(ioaddr + CARDSTATUS);
425
switch (setup_value & 0x07) {
426
case 0x01: /* 10base5 */
427
case 0x02: /* 10base2 */
428
dev->if_port = 0x18; break;
429
case 0x04: /* 10baseT */
430
dev->if_port = 0x08; break;
431
default: /* auto-sense */
432
dev->if_port = 0x00; break;
435
printk(" %s interface.\n", porttype[(dev->if_port>>3) & 3]);
438
/* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
439
bus access, two 4K Tx queues, and disabled Tx and Rx. */
440
outb(0xda, ioaddr + CONFIG_0);
442
/* Set the station address in bank zero. */
443
outb(0x00, ioaddr + CONFIG_1);
444
for (i = 0; i < 6; i++)
445
outb(dev->dev_addr[i], ioaddr + PORT_OFFSET(8 + i));
447
/* Switch to bank 1 and set the multicast table to accept none. */
448
outb(0x04, ioaddr + CONFIG_1);
449
for (i = 0; i < 8; i++)
450
outb(0x00, ioaddr + PORT_OFFSET(8 + i));
453
/* Switch to bank 2 */
454
/* Lock our I/O address, and set manual processing mode for 16 collisions. */
455
outb(0x08, ioaddr + CONFIG_1);
456
outb(dev->if_port, ioaddr + MODE13);
457
outb(0x00, ioaddr + COL16CNTL);
462
dev->netdev_ops = &at1700_netdev_ops;
463
dev->watchdog_timeo = TX_TIMEOUT;
465
spin_lock_init(&lp->lock);
467
lp->jumpered = is_fmv18x;
469
/* Snarf the interrupt vector now. */
470
ret = request_irq(irq, net_interrupt, 0, DRV_NAME, dev);
472
printk(KERN_ERR "AT1700 at %#3x is unusable due to a "
473
"conflict on IRQ %d.\n",
481
#ifdef CONFIG_MCA_LEGACY
483
mca_mark_as_unused(slot);
486
release_region(ioaddr, AT1700_IO_EXTENT);
491
/* EEPROM_Ctrl bits. */
492
#define EE_SHIFT_CLK 0x40 /* EEPROM shift clock, in reg. 16. */
493
#define EE_CS 0x20 /* EEPROM chip select, in reg. 16. */
494
#define EE_DATA_WRITE 0x80 /* EEPROM chip data in, in reg. 17. */
495
#define EE_DATA_READ 0x80 /* EEPROM chip data out, in reg. 17. */
497
/* The EEPROM commands include the alway-set leading bit. */
498
#define EE_WRITE_CMD (5 << 6)
499
#define EE_READ_CMD (6 << 6)
500
#define EE_ERASE_CMD (7 << 6)
502
static int __init read_eeprom(long ioaddr, int location)
505
unsigned short retval = 0;
506
long ee_addr = ioaddr + EEPROM_Ctrl;
507
long ee_daddr = ioaddr + EEPROM_Data;
508
int read_cmd = location | EE_READ_CMD;
510
/* Shift the read command bits out. */
511
for (i = 9; i >= 0; i--) {
512
short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
513
outb(EE_CS, ee_addr);
514
outb(dataval, ee_daddr);
515
outb(EE_CS | EE_SHIFT_CLK, ee_addr); /* EEPROM clock tick. */
517
outb(EE_DATA_WRITE, ee_daddr);
518
for (i = 16; i > 0; i--) {
519
outb(EE_CS, ee_addr);
520
outb(EE_CS | EE_SHIFT_CLK, ee_addr);
521
retval = (retval << 1) | ((inb(ee_daddr) & EE_DATA_READ) ? 1 : 0);
524
/* Terminate the EEPROM access. */
525
outb(EE_CS, ee_addr);
526
outb(EE_SHIFT_CLK, ee_addr);
533
static int net_open(struct net_device *dev)
535
struct net_local *lp = netdev_priv(dev);
536
int ioaddr = dev->base_addr;
538
/* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
539
bus access, and two 4K Tx queues. */
540
outb(0x5a, ioaddr + CONFIG_0);
542
/* Powerup, switch to register bank 2, and enable the Rx and Tx. */
543
outb(0xe8, ioaddr + CONFIG_1);
546
lp->tx_queue_ready = 1;
549
lp->tx_queue_len = 0;
551
/* Turn on hardware Tx and Rx interrupts. */
552
outb(0x82, ioaddr + TX_INTR);
553
outb(0x81, ioaddr + RX_INTR);
555
/* Enable the IRQ on boards of fmv18x it is feasible. */
557
outb(0x80, ioaddr + IOCONFIG1);
560
netif_start_queue(dev);
564
static void net_tx_timeout (struct net_device *dev)
566
struct net_local *lp = netdev_priv(dev);
567
int ioaddr = dev->base_addr;
569
printk ("%s: transmit timed out with status %04x, %s?\n", dev->name,
570
inw (ioaddr + STATUS), inb (ioaddr + TX_STATUS) & 0x80
571
? "IRQ conflict" : "network cable problem");
572
printk ("%s: timeout registers: %04x %04x %04x %04x %04x %04x %04x %04x.\n",
573
dev->name, inw(ioaddr + TX_STATUS), inw(ioaddr + TX_INTR), inw(ioaddr + TX_MODE),
574
inw(ioaddr + CONFIG_0), inw(ioaddr + DATAPORT), inw(ioaddr + TX_START),
575
inw(ioaddr + MODE13 - 1), inw(ioaddr + RX_CTRL));
576
dev->stats.tx_errors++;
577
/* ToDo: We should try to restart the adaptor... */
578
outw(0xffff, ioaddr + MODE24);
579
outw (0xffff, ioaddr + TX_STATUS);
580
outb (0x5a, ioaddr + CONFIG_0);
581
outb (0xe8, ioaddr + CONFIG_1);
582
outw (0x8182, ioaddr + TX_INTR);
583
outb (0x00, ioaddr + TX_START);
584
outb (0x03, ioaddr + COL16CNTL);
586
dev->trans_start = jiffies; /* prevent tx timeout */
589
lp->tx_queue_ready = 1;
592
lp->tx_queue_len = 0;
594
netif_wake_queue(dev);
598
static netdev_tx_t net_send_packet (struct sk_buff *skb,
599
struct net_device *dev)
601
struct net_local *lp = netdev_priv(dev);
602
int ioaddr = dev->base_addr;
603
short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
604
short len = skb->len;
605
unsigned char *buf = skb->data;
606
static u8 pad[ETH_ZLEN];
608
netif_stop_queue (dev);
610
/* We may not start transmitting unless we finish transferring
611
a packet into the Tx queue. During executing the following
612
codes we possibly catch a Tx interrupt. Thus we flag off
613
tx_queue_ready, so that we prevent the interrupt routine
614
(net_interrupt) to start transmitting. */
615
lp->tx_queue_ready = 0;
617
outw (length, ioaddr + DATAPORT);
619
outsw (ioaddr + DATAPORT, buf, len >> 1);
620
/* Check for dribble byte */
622
outw(skb->data[skb->len-1], ioaddr + DATAPORT);
625
/* Check for packet padding */
626
if (length != skb->len)
627
outsw(ioaddr + DATAPORT, pad, (length - len + 1) >> 1);
630
lp->tx_queue_len += length + 2;
632
lp->tx_queue_ready = 1;
634
if (lp->tx_started == 0) {
635
/* If the Tx is idle, always trigger a transmit. */
636
outb (0x80 | lp->tx_queue, ioaddr + TX_START);
638
lp->tx_queue_len = 0;
640
netif_start_queue (dev);
641
} else if (lp->tx_queue_len < 4096 - 1502)
642
/* Yes, there is room for one more packet. */
643
netif_start_queue (dev);
649
/* The typical workload of the driver:
650
Handle the network interface interrupts. */
651
static irqreturn_t net_interrupt(int irq, void *dev_id)
653
struct net_device *dev = dev_id;
654
struct net_local *lp;
659
printk ("at1700_interrupt(): irq %d for unknown device.\n", irq);
663
ioaddr = dev->base_addr;
664
lp = netdev_priv(dev);
666
spin_lock (&lp->lock);
668
status = inw(ioaddr + TX_STATUS);
669
outw(status, ioaddr + TX_STATUS);
672
printk("%s: Interrupt with status %04x.\n", dev->name, status);
673
if (lp->rx_started == 0 &&
674
(status & 0xff00 || (inb(ioaddr + RX_MODE) & 0x40) == 0)) {
676
We cannot execute net_rx more than once at the same time for
677
the same device. During executing net_rx, we possibly catch a
678
Tx interrupt. Thus we flag on rx_started, so that we prevent
679
the interrupt routine (net_interrupt) to dive into net_rx
683
outb(0x00, ioaddr + RX_INTR); /* Disable RX intr. */
685
outb(0x81, ioaddr + RX_INTR); /* Enable RX intr. */
688
if (status & 0x00ff) {
691
/* More than 16 collisions occurred */
693
printk("%s: 16 Collision occur during Txing.\n", dev->name);
694
/* Cancel sending a packet. */
695
outb(0x03, ioaddr + COL16CNTL);
696
dev->stats.collisions++;
699
dev->stats.tx_packets++;
700
/* The Tx queue has any packets and is not being
701
transferred a packet from the host, start
703
if (lp->tx_queue && lp->tx_queue_ready) {
704
outb(0x80 | lp->tx_queue, ioaddr + TX_START);
706
lp->tx_queue_len = 0;
707
dev->trans_start = jiffies;
708
netif_wake_queue (dev);
711
netif_wake_queue (dev);
716
spin_unlock (&lp->lock);
717
return IRQ_RETVAL(handled);
720
/* We have a good packet(s), get it/them out of the buffers. */
722
net_rx(struct net_device *dev)
724
int ioaddr = dev->base_addr;
727
while ((inb(ioaddr + RX_MODE) & 0x40) == 0) {
728
ushort status = inw(ioaddr + DATAPORT);
729
ushort pkt_len = inw(ioaddr + DATAPORT);
732
printk("%s: Rxing packet mode %02x status %04x.\n",
733
dev->name, inb(ioaddr + RX_MODE), status);
734
#ifndef final_version
736
outb(0x05, ioaddr + RX_CTRL);
741
if ((status & 0xF0) != 0x20) { /* There was an error. */
742
dev->stats.rx_errors++;
743
if (status & 0x08) dev->stats.rx_length_errors++;
744
if (status & 0x04) dev->stats.rx_frame_errors++;
745
if (status & 0x02) dev->stats.rx_crc_errors++;
746
if (status & 0x01) dev->stats.rx_over_errors++;
748
/* Malloc up new buffer. */
751
if (pkt_len > 1550) {
752
printk("%s: The AT1700 claimed a very large packet, size %d.\n",
754
/* Prime the FIFO and then flush the packet. */
755
inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
756
outb(0x05, ioaddr + RX_CTRL);
757
dev->stats.rx_errors++;
760
skb = dev_alloc_skb(pkt_len+3);
762
printk("%s: Memory squeeze, dropping packet (len %d).\n",
764
/* Prime the FIFO and then flush the packet. */
765
inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
766
outb(0x05, ioaddr + RX_CTRL);
767
dev->stats.rx_dropped++;
772
insw(ioaddr + DATAPORT, skb_put(skb,pkt_len), (pkt_len + 1) >> 1);
773
skb->protocol=eth_type_trans(skb, dev);
775
dev->stats.rx_packets++;
776
dev->stats.rx_bytes += pkt_len;
778
if (--boguscount <= 0)
782
/* If any worth-while packets have been received, dev_rint()
783
has done a mark_bh(NET_BH) for us and will work on them
784
when we get to the bottom-half routine. */
787
for (i = 0; i < 20; i++) {
788
if ((inb(ioaddr + RX_MODE) & 0x40) == 0x40)
790
inw(ioaddr + DATAPORT); /* dummy status read */
791
outb(0x05, ioaddr + RX_CTRL);
795
printk("%s: Exint Rx packet with mode %02x after %d ticks.\n",
796
dev->name, inb(ioaddr + RX_MODE), i);
800
/* The inverse routine to net_open(). */
801
static int net_close(struct net_device *dev)
803
struct net_local *lp = netdev_priv(dev);
804
int ioaddr = dev->base_addr;
806
netif_stop_queue(dev);
808
/* Set configuration register 0 to disable Tx and Rx. */
809
outb(0xda, ioaddr + CONFIG_0);
811
/* No statistic counters on the chip to update. */
813
/* Disable the IRQ on boards of fmv18x where it is feasible. */
815
outb(0x00, ioaddr + IOCONFIG1);
817
/* Power-down the chip. Green, green, green! */
818
outb(0x00, ioaddr + CONFIG_1);
823
Set the multicast/promiscuous mode for this adaptor.
827
set_rx_mode(struct net_device *dev)
829
int ioaddr = dev->base_addr;
830
struct net_local *lp = netdev_priv(dev);
831
unsigned char mc_filter[8]; /* Multicast hash filter */
834
if (dev->flags & IFF_PROMISC) {
835
memset(mc_filter, 0xff, sizeof(mc_filter));
836
outb(3, ioaddr + RX_MODE); /* Enable promiscuous mode */
837
} else if (netdev_mc_count(dev) > MC_FILTERBREAK ||
838
(dev->flags & IFF_ALLMULTI)) {
839
/* Too many to filter perfectly -- accept all multicasts. */
840
memset(mc_filter, 0xff, sizeof(mc_filter));
841
outb(2, ioaddr + RX_MODE); /* Use normal mode. */
842
} else if (netdev_mc_empty(dev)) {
843
memset(mc_filter, 0x00, sizeof(mc_filter));
844
outb(1, ioaddr + RX_MODE); /* Ignore almost all multicasts. */
846
struct netdev_hw_addr *ha;
848
memset(mc_filter, 0, sizeof(mc_filter));
849
netdev_for_each_mc_addr(ha, dev) {
851
ether_crc_le(ETH_ALEN, ha->addr) >> 26;
852
mc_filter[bit >> 3] |= (1 << bit);
854
outb(0x02, ioaddr + RX_MODE); /* Use normal mode. */
857
spin_lock_irqsave (&lp->lock, flags);
858
if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) {
860
int saved_bank = inw(ioaddr + CONFIG_0);
861
/* Switch to bank 1 and set the multicast table. */
862
outw((saved_bank & ~0x0C00) | 0x0480, ioaddr + CONFIG_0);
863
for (i = 0; i < 8; i++)
864
outb(mc_filter[i], ioaddr + PORT_OFFSET(8 + i));
865
memcpy(lp->mc_filter, mc_filter, sizeof(mc_filter));
866
outw(saved_bank, ioaddr + CONFIG_0);
868
spin_unlock_irqrestore (&lp->lock, flags);
872
static struct net_device *dev_at1700;
874
module_param(io, int, 0);
875
module_param(irq, int, 0);
876
module_param(net_debug, int, 0);
877
MODULE_PARM_DESC(io, "AT1700/FMV18X I/O base address");
878
MODULE_PARM_DESC(irq, "AT1700/FMV18X IRQ number");
879
MODULE_PARM_DESC(net_debug, "AT1700/FMV18X debug level (0-6)");
881
static int __init at1700_module_init(void)
884
printk("at1700: You should not use auto-probing with insmod!\n");
885
dev_at1700 = at1700_probe(-1);
886
if (IS_ERR(dev_at1700))
887
return PTR_ERR(dev_at1700);
891
static void __exit at1700_module_exit(void)
893
unregister_netdev(dev_at1700);
894
cleanup_card(dev_at1700);
895
free_netdev(dev_at1700);
897
module_init(at1700_module_init);
898
module_exit(at1700_module_exit);
900
MODULE_LICENSE("GPL");