1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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>
48#include <linux/in.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>
54
55#include <asm/system.h>
56#include <asm/io.h>
57#include <asm/dma.h>
58
59static char version[] __initdata =
60 "at1700.c:v1.16 9/11/06 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
61
62#define DRV_NAME "at1700"
63
64
65
66
67#define MC_FILTERBREAK 64
68
69
70
71static int fmv18x_probe_list[] __initdata = {
72 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x300, 0x340, 0
73};
74
75
76
77
78
79static unsigned at1700_probe_list[] __initdata = {
80 0x260, 0x280, 0x2a0, 0x240, 0x340, 0x320, 0x380, 0x300, 0
81};
82
83
84
85
86#ifdef CONFIG_MCA_LEGACY
87static int at1700_ioaddr_pattern[] __initdata = {
88 0x00, 0x04, 0x01, 0x05, 0x02, 0x06, 0x03, 0x07
89};
90
91static int at1700_mca_probe_list[] __initdata = {
92 0x400, 0x1400, 0x2400, 0x3400, 0x4400, 0x5400, 0x6400, 0x7400, 0
93};
94
95static int at1700_irq_pattern[] __initdata = {
96 0x00, 0x00, 0x00, 0x30, 0x70, 0xb0, 0x00, 0x00,
97 0x00, 0xf0, 0x34, 0x74, 0xb4, 0x00, 0x00, 0xf4, 0x00
98};
99#endif
100
101
102#ifndef NET_DEBUG
103#define NET_DEBUG 1
104#endif
105static unsigned int net_debug = NET_DEBUG;
106
107typedef unsigned char uchar;
108
109
110struct net_local {
111 spinlock_t lock;
112 unsigned char mc_filter[8];
113 uint jumpered:1;
114 uint tx_started:1;
115 uint tx_queue_ready:1;
116 uint rx_started:1;
117 uchar tx_queue;
118 char mca_slot;
119 ushort tx_queue_len;
120};
121
122
123
124#define STATUS 0
125#define TX_STATUS 0
126#define RX_STATUS 1
127#define TX_INTR 2
128#define RX_INTR 3
129#define TX_MODE 4
130#define RX_MODE 5
131#define CONFIG_0 6
132#define CONFIG_1 7
133
134#define DATAPORT 8
135#define TX_START 10
136#define COL16CNTL 11
137#define MODE13 13
138#define RX_CTRL 14
139
140#define EEPROM_Ctrl 16
141#define EEPROM_Data 17
142#define CARDSTATUS 16
143#define CARDSTATUS1 17
144#define IOCONFIG 18
145#define IOCONFIG1 19
146#define SAPROM 20
147#define MODE24 24
148#define RESET 31
149#define AT1700_IO_EXTENT 32
150#define PORT_OFFSET(o) (o)
151
152
153#define TX_TIMEOUT (HZ/10)
154
155
156
157
158static int at1700_probe1(struct net_device *dev, int ioaddr);
159static int read_eeprom(long ioaddr, int location);
160static int net_open(struct net_device *dev);
161static netdev_tx_t net_send_packet(struct sk_buff *skb,
162 struct net_device *dev);
163static irqreturn_t net_interrupt(int irq, void *dev_id);
164static void net_rx(struct net_device *dev);
165static int net_close(struct net_device *dev);
166static void set_rx_mode(struct net_device *dev);
167static void net_tx_timeout (struct net_device *dev);
168
169
170#ifdef CONFIG_MCA_LEGACY
171struct at1720_mca_adapters_struct {
172 char* name;
173 int id;
174};
175
176
177static struct at1720_mca_adapters_struct at1720_mca_adapters[] __initdata = {
178 { "Allied Telesys AT1720AT", 0x6410 },
179 { "Allied Telesys AT1720BT", 0x6413 },
180 { "Allied Telesys AT1720T", 0x6416 },
181 { NULL, 0 },
182};
183#endif
184
185
186
187
188
189
190
191
192static int io = 0x260;
193
194static int irq;
195
196static void cleanup_card(struct net_device *dev)
197{
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);
202#endif
203 free_irq(dev->irq, NULL);
204 release_region(dev->base_addr, AT1700_IO_EXTENT);
205}
206
207struct net_device * __init at1700_probe(int unit)
208{
209 struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
210 unsigned *port;
211 int err = 0;
212
213 if (!dev)
214 return ERR_PTR(-ENODEV);
215
216 if (unit >= 0) {
217 sprintf(dev->name, "eth%d", unit);
218 netdev_boot_setup_check(dev);
219 io = dev->base_addr;
220 irq = dev->irq;
221 } else {
222 dev->base_addr = io;
223 dev->irq = irq;
224 }
225
226 if (io > 0x1ff) {
227 err = at1700_probe1(dev, io);
228 } else if (io != 0) {
229 err = -ENXIO;
230 } else {
231 for (port = at1700_probe_list; *port; port++) {
232 if (at1700_probe1(dev, *port) == 0)
233 break;
234 dev->irq = irq;
235 }
236 if (!*port)
237 err = -ENODEV;
238 }
239 if (err)
240 goto out;
241 err = register_netdev(dev);
242 if (err)
243 goto out1;
244 return dev;
245out1:
246 cleanup_card(dev);
247out:
248 free_netdev(dev);
249 return ERR_PTR(err);
250}
251
252static 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_multicast_list = 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,
261};
262
263
264
265
266
267
268
269
270
271static int __init at1700_probe1(struct net_device *dev, int ioaddr)
272{
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);
279
280 if (!request_region(ioaddr, AT1700_IO_EXTENT, DRV_NAME))
281 return -EBUSY;
282
283
284
285
286
287#ifdef notdef
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));
291#endif
292
293#ifdef CONFIG_MCA_LEGACY
294
295
296
297
298
299
300
301
302
303 if (MCA_bus) {
304 int j;
305 int l_i;
306 u_char pos3, pos4;
307
308 for (j = 0; at1720_mca_adapters[j].name != NULL; j ++) {
309 slot = 0;
310 while (slot != MCA_NOTFOUND) {
311
312 slot = mca_find_unused_adapter( at1720_mca_adapters[j].id, slot );
313 if (slot == MCA_NOTFOUND) break;
314
315
316
317
318 pos3 = mca_read_stored_pos( slot, 3 );
319 pos4 = mca_read_stored_pos( slot, 4 );
320
321 for (l_i = 0; l_i < 8; l_i++)
322 if (( pos3 & 0x07) == at1700_ioaddr_pattern[l_i])
323 break;
324 ioaddr = at1700_mca_probe_list[l_i];
325
326 for (irq = 0; irq < 0x10; irq++)
327 if (((((pos4>>4) & 0x0f) | (pos3 & 0xf0)) & 0xff) == at1700_irq_pattern[irq])
328 break;
329
330
331 if ((dev->irq && dev->irq != irq) ||
332 (dev->base_addr && dev->base_addr != ioaddr)) {
333 slot++;
334 continue;
335 }
336
337 dev->irq = irq;
338
339
340 mca_set_adapter_name( slot, at1720_mca_adapters[j].name );
341 mca_mark_as_used(slot);
342
343 goto found;
344 }
345 }
346
347 }
348#endif
349 slot = -1;
350
351
352 if (at1700_probe_list[inb(ioaddr + IOCONFIG1) & 0x07] == ioaddr &&
353 read_eeprom(ioaddr, 4) == 0x0000 &&
354 (read_eeprom(ioaddr, 5) & 0xff00) == 0xF400)
355 is_at1700 = 1;
356 else if (inb(ioaddr + SAPROM ) == 0x00 &&
357 inb(ioaddr + SAPROM + 1) == 0x00 &&
358 inb(ioaddr + SAPROM + 2) == 0x0e)
359 is_fmv18x = 1;
360 else {
361 goto err_out;
362 }
363
364#ifdef CONFIG_MCA_LEGACY
365found:
366#endif
367
368
369 outb(0, ioaddr + RESET);
370
371 if (is_at1700) {
372 irq = at1700_irqmap[(read_eeprom(ioaddr, 12)&0x04)
373 | (read_eeprom(ioaddr, 0)>>14)];
374 } else {
375
376
377 if (inb(ioaddr + CARDSTATUS1) & 0x20) {
378 irq = dev->irq;
379 for (i = 0; i < 8; i++) {
380 if (irq == fmv_irqmap_pnp[i])
381 break;
382 }
383 if (i == 8) {
384 goto err_mca;
385 }
386 } else {
387 if (fmv18x_probe_list[inb(ioaddr + IOCONFIG) & 0x07] != ioaddr)
388 goto err_mca;
389 irq = fmv_irqmap[(inb(ioaddr + IOCONFIG)>>6) & 0x03];
390 }
391 }
392
393 printk("%s: %s found at %#3x, IRQ %d, address ", dev->name,
394 is_at1700 ? "AT1700" : "FMV-18X", ioaddr, irq);
395
396 dev->base_addr = ioaddr;
397 dev->irq = irq;
398
399 if (is_at1700) {
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);
403 }
404 } else {
405 for(i = 0; i < 6; i++) {
406 unsigned char val = inb(ioaddr + SAPROM + i);
407 dev->dev_addr[i] = val;
408 }
409 }
410 printk("%pM", dev->dev_addr);
411
412
413
414
415
416
417
418 {
419 const char *porttype[] = {"auto-sense", "10baseT", "auto-sense", "10base2"};
420 if (is_at1700) {
421 ushort setup_value = read_eeprom(ioaddr, 12);
422 dev->if_port = setup_value >> 8;
423 } else {
424 ushort setup_value = inb(ioaddr + CARDSTATUS);
425 switch (setup_value & 0x07) {
426 case 0x01:
427 case 0x02:
428 dev->if_port = 0x18; break;
429 case 0x04:
430 dev->if_port = 0x08; break;
431 default:
432 dev->if_port = 0x00; break;
433 }
434 }
435 printk(" %s interface.\n", porttype[(dev->if_port>>3) & 3]);
436 }
437
438
439
440 outb(0xda, ioaddr + CONFIG_0);
441
442
443 outb(0x00, ioaddr + CONFIG_1);
444 for (i = 0; i < 6; i++)
445 outb(dev->dev_addr[i], ioaddr + PORT_OFFSET(8 + i));
446
447
448 outb(0x04, ioaddr + CONFIG_1);
449 for (i = 0; i < 8; i++)
450 outb(0x00, ioaddr + PORT_OFFSET(8 + i));
451
452
453
454
455 outb(0x08, ioaddr + CONFIG_1);
456 outb(dev->if_port, ioaddr + MODE13);
457 outb(0x00, ioaddr + COL16CNTL);
458
459 if (net_debug)
460 printk(version);
461
462 dev->netdev_ops = &at1700_netdev_ops;
463 dev->watchdog_timeo = TX_TIMEOUT;
464
465 spin_lock_init(&lp->lock);
466
467 lp->jumpered = is_fmv18x;
468 lp->mca_slot = slot;
469
470 ret = request_irq(irq, net_interrupt, 0, DRV_NAME, dev);
471 if (ret) {
472 printk(KERN_ERR "AT1700 at %#3x is unusable due to a "
473 "conflict on IRQ %d.\n",
474 ioaddr, irq);
475 goto err_mca;
476 }
477
478 return 0;
479
480err_mca:
481#ifdef CONFIG_MCA_LEGACY
482 if (slot >= 0)
483 mca_mark_as_unused(slot);
484#endif
485err_out:
486 release_region(ioaddr, AT1700_IO_EXTENT);
487 return ret;
488}
489
490
491
492#define EE_SHIFT_CLK 0x40
493#define EE_CS 0x20
494#define EE_DATA_WRITE 0x80
495#define EE_DATA_READ 0x80
496
497
498#define EE_WRITE_CMD (5 << 6)
499#define EE_READ_CMD (6 << 6)
500#define EE_ERASE_CMD (7 << 6)
501
502static int __init read_eeprom(long ioaddr, int location)
503{
504 int i;
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;
509
510
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);
516 }
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);
522 }
523
524
525 outb(EE_CS, ee_addr);
526 outb(EE_SHIFT_CLK, ee_addr);
527 outb(0, ee_addr);
528 return retval;
529}
530
531
532
533static int net_open(struct net_device *dev)
534{
535 struct net_local *lp = netdev_priv(dev);
536 int ioaddr = dev->base_addr;
537
538
539
540 outb(0x5a, ioaddr + CONFIG_0);
541
542
543 outb(0xe8, ioaddr + CONFIG_1);
544
545 lp->tx_started = 0;
546 lp->tx_queue_ready = 1;
547 lp->rx_started = 0;
548 lp->tx_queue = 0;
549 lp->tx_queue_len = 0;
550
551
552 outb(0x82, ioaddr + TX_INTR);
553 outb(0x81, ioaddr + RX_INTR);
554
555
556 if (lp->jumpered) {
557 outb(0x80, ioaddr + IOCONFIG1);
558 }
559
560 netif_start_queue(dev);
561 return 0;
562}
563
564static void net_tx_timeout (struct net_device *dev)
565{
566 struct net_local *lp = netdev_priv(dev);
567 int ioaddr = dev->base_addr;
568
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
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);
585
586 dev->trans_start = jiffies;
587
588 lp->tx_started = 0;
589 lp->tx_queue_ready = 1;
590 lp->rx_started = 0;
591 lp->tx_queue = 0;
592 lp->tx_queue_len = 0;
593
594 netif_wake_queue(dev);
595}
596
597
598static netdev_tx_t net_send_packet (struct sk_buff *skb,
599 struct net_device *dev)
600{
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];
607
608 netif_stop_queue (dev);
609
610
611
612
613
614
615 lp->tx_queue_ready = 0;
616 {
617 outw (length, ioaddr + DATAPORT);
618
619 outsw (ioaddr + DATAPORT, buf, len >> 1);
620
621 if (len & 1) {
622 outw(skb->data[skb->len-1], ioaddr + DATAPORT);
623 len++;
624 }
625
626 if (length != skb->len)
627 outsw(ioaddr + DATAPORT, pad, (length - len + 1) >> 1);
628
629 lp->tx_queue++;
630 lp->tx_queue_len += length + 2;
631 }
632 lp->tx_queue_ready = 1;
633
634 if (lp->tx_started == 0) {
635
636 outb (0x80 | lp->tx_queue, ioaddr + TX_START);
637 lp->tx_queue = 0;
638 lp->tx_queue_len = 0;
639 lp->tx_started = 1;
640 netif_start_queue (dev);
641 } else if (lp->tx_queue_len < 4096 - 1502)
642
643 netif_start_queue (dev);
644 dev_kfree_skb (skb);
645
646 return NETDEV_TX_OK;
647}
648
649
650
651static irqreturn_t net_interrupt(int irq, void *dev_id)
652{
653 struct net_device *dev = dev_id;
654 struct net_local *lp;
655 int ioaddr, status;
656 int handled = 0;
657
658 if (dev == NULL) {
659 printk ("at1700_interrupt(): irq %d for unknown device.\n", irq);
660 return IRQ_NONE;
661 }
662
663 ioaddr = dev->base_addr;
664 lp = netdev_priv(dev);
665
666 spin_lock (&lp->lock);
667
668 status = inw(ioaddr + TX_STATUS);
669 outw(status, ioaddr + TX_STATUS);
670
671 if (net_debug > 4)
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)) {
675
676
677
678
679
680
681 handled = 1;
682 lp->rx_started = 1;
683 outb(0x00, ioaddr + RX_INTR);
684 net_rx(dev);
685 outb(0x81, ioaddr + RX_INTR);
686 lp->rx_started = 0;
687 }
688 if (status & 0x00ff) {
689 handled = 1;
690 if (status & 0x02) {
691
692 if (net_debug > 4)
693 printk("%s: 16 Collision occur during Txing.\n", dev->name);
694
695 outb(0x03, ioaddr + COL16CNTL);
696 dev->stats.collisions++;
697 }
698 if (status & 0x82) {
699 dev->stats.tx_packets++;
700
701
702
703 if (lp->tx_queue && lp->tx_queue_ready) {
704 outb(0x80 | lp->tx_queue, ioaddr + TX_START);
705 lp->tx_queue = 0;
706 lp->tx_queue_len = 0;
707 dev->trans_start = jiffies;
708 netif_wake_queue (dev);
709 } else {
710 lp->tx_started = 0;
711 netif_wake_queue (dev);
712 }
713 }
714 }
715
716 spin_unlock (&lp->lock);
717 return IRQ_RETVAL(handled);
718}
719
720
721static void
722net_rx(struct net_device *dev)
723{
724 int ioaddr = dev->base_addr;
725 int boguscount = 5;
726
727 while ((inb(ioaddr + RX_MODE) & 0x40) == 0) {
728 ushort status = inw(ioaddr + DATAPORT);
729 ushort pkt_len = inw(ioaddr + DATAPORT);
730
731 if (net_debug > 4)
732 printk("%s: Rxing packet mode %02x status %04x.\n",
733 dev->name, inb(ioaddr + RX_MODE), status);
734#ifndef final_version
735 if (status == 0) {
736 outb(0x05, ioaddr + RX_CTRL);
737 break;
738 }
739#endif
740
741 if ((status & 0xF0) != 0x20) {
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++;
747 } else {
748
749 struct sk_buff *skb;
750
751 if (pkt_len > 1550) {
752 printk("%s: The AT1700 claimed a very large packet, size %d.\n",
753 dev->name, pkt_len);
754
755 inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
756 outb(0x05, ioaddr + RX_CTRL);
757 dev->stats.rx_errors++;
758 break;
759 }
760 skb = dev_alloc_skb(pkt_len+3);
761 if (skb == NULL) {
762 printk("%s: Memory squeeze, dropping packet (len %d).\n",
763 dev->name, pkt_len);
764
765 inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
766 outb(0x05, ioaddr + RX_CTRL);
767 dev->stats.rx_dropped++;
768 break;
769 }
770 skb_reserve(skb,2);
771
772 insw(ioaddr + DATAPORT, skb_put(skb,pkt_len), (pkt_len + 1) >> 1);
773 skb->protocol=eth_type_trans(skb, dev);
774 netif_rx(skb);
775 dev->stats.rx_packets++;
776 dev->stats.rx_bytes += pkt_len;
777 }
778 if (--boguscount <= 0)
779 break;
780 }
781
782
783
784
785 {
786 int i;
787 for (i = 0; i < 20; i++) {
788 if ((inb(ioaddr + RX_MODE) & 0x40) == 0x40)
789 break;
790 inw(ioaddr + DATAPORT);
791 outb(0x05, ioaddr + RX_CTRL);
792 }
793
794 if (net_debug > 5)
795 printk("%s: Exint Rx packet with mode %02x after %d ticks.\n",
796 dev->name, inb(ioaddr + RX_MODE), i);
797 }
798}
799
800
801static int net_close(struct net_device *dev)
802{
803 struct net_local *lp = netdev_priv(dev);
804 int ioaddr = dev->base_addr;
805
806 netif_stop_queue(dev);
807
808
809 outb(0xda, ioaddr + CONFIG_0);
810
811
812
813
814 if (lp->jumpered)
815 outb(0x00, ioaddr + IOCONFIG1);
816
817
818 outb(0x00, ioaddr + CONFIG_1);
819 return 0;
820}
821
822
823
824
825
826static void
827set_rx_mode(struct net_device *dev)
828{
829 int ioaddr = dev->base_addr;
830 struct net_local *lp = netdev_priv(dev);
831 unsigned char mc_filter[8];
832 unsigned long flags;
833
834 if (dev->flags & IFF_PROMISC) {
835 memset(mc_filter, 0xff, sizeof(mc_filter));
836 outb(3, ioaddr + RX_MODE);
837 } else if (netdev_mc_count(dev) > MC_FILTERBREAK ||
838 (dev->flags & IFF_ALLMULTI)) {
839
840 memset(mc_filter, 0xff, sizeof(mc_filter));
841 outb(2, ioaddr + RX_MODE);
842 } else if (netdev_mc_empty(dev)) {
843 memset(mc_filter, 0x00, sizeof(mc_filter));
844 outb(1, ioaddr + RX_MODE);
845 } else {
846 struct netdev_hw_addr *ha;
847
848 memset(mc_filter, 0, sizeof(mc_filter));
849 netdev_for_each_mc_addr(ha, dev) {
850 unsigned int bit =
851 ether_crc_le(ETH_ALEN, ha->addr) >> 26;
852 mc_filter[bit >> 3] |= (1 << bit);
853 }
854 outb(0x02, ioaddr + RX_MODE);
855 }
856
857 spin_lock_irqsave (&lp->lock, flags);
858 if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) {
859 int i;
860 int saved_bank = inw(ioaddr + CONFIG_0);
861
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);
867 }
868 spin_unlock_irqrestore (&lp->lock, flags);
869}
870
871#ifdef MODULE
872static struct net_device *dev_at1700;
873
874module_param(io, int, 0);
875module_param(irq, int, 0);
876module_param(net_debug, int, 0);
877MODULE_PARM_DESC(io, "AT1700/FMV18X I/O base address");
878MODULE_PARM_DESC(irq, "AT1700/FMV18X IRQ number");
879MODULE_PARM_DESC(net_debug, "AT1700/FMV18X debug level (0-6)");
880
881static int __init at1700_module_init(void)
882{
883 if (io == 0)
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);
888 return 0;
889}
890
891static void __exit at1700_module_exit(void)
892{
893 unregister_netdev(dev_at1700);
894 cleanup_card(dev_at1700);
895 free_netdev(dev_at1700);
896}
897module_init(at1700_module_init);
898module_exit(at1700_module_exit);
899#endif
900MODULE_LICENSE("GPL");
901