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
39
40
41
42#include <linux/config.h>
43#include <linux/errno.h>
44#include <linux/netdevice.h>
45#include <linux/etherdevice.h>
46#include <linux/mca-legacy.h>
47#include <linux/module.h>
48#include <linux/kernel.h>
49#include <linux/types.h>
50#include <linux/fcntl.h>
51#include <linux/interrupt.h>
52#include <linux/ioport.h>
53#include <linux/in.h>
54#include <linux/skbuff.h>
55#include <linux/slab.h>
56#include <linux/string.h>
57#include <linux/init.h>
58#include <linux/crc32.h>
59
60#include <asm/system.h>
61#include <asm/bitops.h>
62#include <asm/io.h>
63#include <asm/dma.h>
64
65static char version[] __initdata =
66 "at1700.c:v1.15 4/7/98 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
67
68
69
70
71#define MC_FILTERBREAK 64
72
73
74
75static int fmv18x_probe_list[] __initdata = {
76 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x300, 0x340, 0
77};
78
79
80
81
82
83#ifndef CONFIG_X86_PC9800
84static int at1700_probe_list[] __initdata = {
85 0x260, 0x280, 0x2a0, 0x240, 0x340, 0x320, 0x380, 0x300, 0
86};
87
88#else
89static int at1700_probe_list[] __initdata = {
90 0x1d6, 0x1d8, 0x1da, 0x1d4, 0xd4, 0xd2, 0xd8, 0xd0, 0
91};
92
93#endif
94
95
96
97#ifdef CONFIG_MCA
98static int at1700_ioaddr_pattern[] __initdata = {
99 0x00, 0x04, 0x01, 0x05, 0x02, 0x06, 0x03, 0x07
100};
101
102static int at1700_mca_probe_list[] __initdata = {
103 0x400, 0x1400, 0x2400, 0x3400, 0x4400, 0x5400, 0x6400, 0x7400, 0
104};
105
106static int at1700_irq_pattern[] __initdata = {
107 0x00, 0x00, 0x00, 0x30, 0x70, 0xb0, 0x00, 0x00,
108 0x00, 0xf0, 0x34, 0x74, 0xb4, 0x00, 0x00, 0xf4, 0x00
109};
110#endif
111
112
113#ifndef NET_DEBUG
114#define NET_DEBUG 1
115#endif
116static unsigned int net_debug = NET_DEBUG;
117
118typedef unsigned char uchar;
119
120
121struct net_local {
122 struct net_device_stats stats;
123 spinlock_t lock;
124 unsigned char mc_filter[8];
125 uint jumpered:1;
126 uint tx_started:1;
127 uint tx_queue_ready:1;
128 uint rx_started:1;
129 uchar tx_queue;
130 char mca_slot;
131 ushort tx_queue_len;
132};
133
134
135
136#ifndef CONFIG_X86_PC9800
137#define STATUS 0
138#define TX_STATUS 0
139#define RX_STATUS 1
140#define TX_INTR 2
141#define RX_INTR 3
142#define TX_MODE 4
143#define RX_MODE 5
144#define CONFIG_0 6
145#define CONFIG_1 7
146
147#define DATAPORT 8
148#define TX_START 10
149#define COL16CNTL 11
150#define MODE13 13
151#define RX_CTRL 14
152
153#define EEPROM_Ctrl 16
154#define EEPROM_Data 17
155#define CARDSTATUS 16
156#define CARDSTATUS1 17
157#define IOCONFIG 18
158#define IOCONFIG1 19
159#define SAPROM 20
160#define MODE24 24
161#define RESET 31
162#define AT1700_IO_EXTENT 32
163#define PORT_OFFSET(o) (o)
164#else
165#define STATUS (0x0000)
166#define TX_STATUS (0x0000)
167#define RX_STATUS (0x0001)
168#define TX_INTR (0x0200)
169#define RX_INTR (0x0201)
170#define TX_MODE (0x0400)
171#define RX_MODE (0x0401)
172#define CONFIG_0 (0x0600)
173#define CONFIG_1 (0x0601)
174
175#define DATAPORT (0x0800)
176#define TX_START (0x0a00)
177#define COL16CNTL (0x0a01)
178#define MODE13 (0x0c01)
179#define RX_CTRL (0x0e00)
180
181#define EEPROM_Ctrl (0x1000)
182#define EEPROM_Data (0x1200)
183#define CARDSTATUS 16
184#define CARDSTATUS1 17
185#define IOCONFIG (0x1400)
186#define IOCONFIG1 (0x1600)
187#define SAPROM 20
188#define MODE24 (0x1800)
189#define RESET (0x1e01)
190#define PORT_OFFSET(o) ({ int _o_ = (o); (_o_ & ~1) * 0x100 + (_o_ & 1); })
191#endif
192
193
194#define TX_TIMEOUT 10
195
196
197
198
199extern int at1700_probe(struct net_device *dev);
200
201static int at1700_probe1(struct net_device *dev, int ioaddr);
202static int read_eeprom(long ioaddr, int location);
203static int net_open(struct net_device *dev);
204static int net_send_packet(struct sk_buff *skb, struct net_device *dev);
205static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs *regs);
206static void net_rx(struct net_device *dev);
207static int net_close(struct net_device *dev);
208static struct net_device_stats *net_get_stats(struct net_device *dev);
209static void set_rx_mode(struct net_device *dev);
210static void net_tx_timeout (struct net_device *dev);
211
212
213#ifdef CONFIG_MCA
214struct at1720_mca_adapters_struct {
215 char* name;
216 int id;
217};
218
219
220static struct at1720_mca_adapters_struct at1720_mca_adapters[] __initdata = {
221 { "Allied Telesys AT1720AT", 0x6410 },
222 { "Allied Telesys AT1720BT", 0x6413 },
223 { "Allied Telesys AT1720T", 0x6416 },
224 { NULL, 0 },
225};
226#endif
227
228
229
230
231
232
233
234
235int __init at1700_probe(struct net_device *dev)
236{
237 int i;
238 int base_addr = dev->base_addr;
239
240 SET_MODULE_OWNER(dev);
241
242 if (base_addr > 0x1ff)
243 return at1700_probe1(dev, base_addr);
244 else if (base_addr != 0)
245 return -ENXIO;
246
247 for (i = 0; at1700_probe_list[i]; i++) {
248 int ioaddr = at1700_probe_list[i];
249 if (at1700_probe1(dev, ioaddr) == 0)
250 return 0;
251 }
252 return -ENODEV;
253}
254
255
256
257
258
259
260
261
262
263static int __init at1700_probe1(struct net_device *dev, int ioaddr)
264{
265 char fmv_irqmap[4] = {3, 7, 10, 15};
266 char fmv_irqmap_pnp[8] = {3, 4, 5, 7, 9, 10, 11, 15};
267 char at1700_irqmap[8] = {3, 4, 5, 9, 10, 11, 14, 15};
268 unsigned int i, irq, is_fmv18x = 0, is_at1700 = 0;
269 int slot, ret = -ENODEV;
270 struct net_local *lp;
271
272#ifndef CONFIG_X86_PC9800
273 if (!request_region(ioaddr, AT1700_IO_EXTENT, dev->name))
274 return -EBUSY;
275#else
276 for (i = 0; i < 0x2000; i += 0x0200) {
277 if (!request_region(ioaddr + i, 2, dev->name)) {
278 while (i > 0) {
279 i -= 0x0200;
280 release_region(ioaddr + i, 2);
281 }
282 return -EBUSY;
283 }
284 }
285#endif
286
287
288
289
290#ifdef notdef
291 printk("at1700 probe at %#x, eeprom is %4.4x %4.4x %4.4x ctrl %4.4x.\n",
292 ioaddr, read_eeprom(ioaddr, 4), read_eeprom(ioaddr, 5),
293 read_eeprom(ioaddr, 6), inw(ioaddr + EEPROM_Ctrl));
294#endif
295
296#ifdef CONFIG_MCA
297
298
299
300
301
302
303
304
305
306 if (MCA_bus) {
307 int j;
308 int l_i;
309 u_char pos3, pos4;
310
311 for (j = 0; at1720_mca_adapters[j].name != NULL; j ++) {
312 slot = 0;
313 while (slot != MCA_NOTFOUND) {
314
315 slot = mca_find_unused_adapter( at1720_mca_adapters[j].id, slot );
316 if (slot == MCA_NOTFOUND) break;
317
318
319
320
321 pos3 = mca_read_stored_pos( slot, 3 );
322 pos4 = mca_read_stored_pos( slot, 4 );
323
324 for (l_i = 0; l_i < 0x09; l_i++)
325 if (( pos3 & 0x07) == at1700_ioaddr_pattern[l_i])
326 break;
327 ioaddr = at1700_mca_probe_list[l_i];
328
329 for (irq = 0; irq < 0x10; irq++)
330 if (((((pos4>>4) & 0x0f) | (pos3 & 0xf0)) & 0xff) == at1700_irq_pattern[irq])
331 break;
332
333
334 if (dev &&
335 ((dev->irq && dev->irq != irq) ||
336 (dev->base_addr && dev->base_addr != ioaddr))) {
337 slot++;
338 continue;
339 }
340
341 if (dev)
342 dev->irq = irq;
343
344
345 mca_set_adapter_name( slot, at1720_mca_adapters[j].name );
346 mca_mark_as_used(slot);
347
348 goto found;
349 }
350 }
351
352 }
353#endif
354 slot = -1;
355
356
357 if (at1700_probe_list[inb(ioaddr + IOCONFIG1) & 0x07] == ioaddr
358 && read_eeprom(ioaddr, 4) == 0x0000
359 && (read_eeprom(ioaddr, 5) & 0xff00) == 0xF400)
360 is_at1700 = 1;
361 else if (inb(ioaddr + SAPROM ) == 0x00
362 && inb(ioaddr + SAPROM + 1) == 0x00
363 && inb(ioaddr + SAPROM + 2) == 0x0e)
364 is_fmv18x = 1;
365 else {
366 goto err_out;
367 }
368
369#ifdef CONFIG_MCA
370found:
371#endif
372
373
374 outb(0, ioaddr + RESET);
375
376 if (is_at1700) {
377#ifndef CONFIG_X86_PC9800
378 irq = at1700_irqmap[(read_eeprom(ioaddr, 12)&0x04)
379 | (read_eeprom(ioaddr, 0)>>14)];
380#else
381 {
382 char re1000plus_irqmap[4] = {3, 5, 6, 12};
383 irq = re1000plus_irqmap[inb(ioaddr + IOCONFIG1) >> 6];
384 }
385#endif
386 } else {
387
388
389 if (inb(ioaddr + CARDSTATUS1) & 0x20) {
390 irq = dev->irq;
391 for (i = 0; i < 8; i++) {
392 if (irq == fmv_irqmap_pnp[i])
393 break;
394 }
395 if (i == 8) {
396 goto err_out;
397 }
398 } else {
399 if (fmv18x_probe_list[inb(ioaddr + IOCONFIG) & 0x07] != ioaddr)
400 goto err_out;
401 irq = fmv_irqmap[(inb(ioaddr + IOCONFIG)>>6) & 0x03];
402 }
403 }
404
405 printk("%s: %s found at %#3x, IRQ %d, address ", dev->name,
406 is_at1700 ? "AT1700" : "FMV-18X", ioaddr, irq);
407
408 dev->base_addr = ioaddr;
409 dev->irq = irq;
410
411 if (is_at1700) {
412 for(i = 0; i < 3; i++) {
413 unsigned short eeprom_val = read_eeprom(ioaddr, 4+i);
414 printk("%04x", eeprom_val);
415 ((unsigned short *)dev->dev_addr)[i] = ntohs(eeprom_val);
416 }
417 } else {
418 for(i = 0; i < 6; i++) {
419 unsigned char val = inb(ioaddr + SAPROM + i);
420 printk("%02x", val);
421 dev->dev_addr[i] = val;
422 }
423 }
424
425
426
427
428
429
430
431 {
432 const char *porttype[] = {"auto-sense", "10baseT", "auto-sense", "10base2"};
433 if (is_at1700) {
434 ushort setup_value = read_eeprom(ioaddr, 12);
435 dev->if_port = setup_value >> 8;
436 } else {
437 ushort setup_value = inb(ioaddr + CARDSTATUS);
438 switch (setup_value & 0x07) {
439 case 0x01:
440 case 0x02:
441 dev->if_port = 0x18; break;
442 case 0x04:
443 dev->if_port = 0x08; break;
444 default:
445 dev->if_port = 0x00; break;
446 }
447 }
448 printk(" %s interface.\n", porttype[(dev->if_port>>3) & 3]);
449 }
450
451
452
453 outb(0xda, ioaddr + CONFIG_0);
454
455
456 outb(0x00, ioaddr + CONFIG_1);
457 for (i = 0; i < 6; i++)
458 outb(dev->dev_addr[i], ioaddr + PORT_OFFSET(8 + i));
459
460
461 outb(0x04, ioaddr + CONFIG_1);
462 for (i = 0; i < 8; i++)
463 outb(0x00, ioaddr + PORT_OFFSET(8 + i));
464
465
466
467
468 outb(0x08, ioaddr + CONFIG_1);
469#ifndef CONFIG_X86_PC9800
470 outb(dev->if_port, ioaddr + MODE13);
471#else
472 outb(0, ioaddr + MODE13);
473#endif
474 outb(0x00, ioaddr + COL16CNTL);
475
476 if (net_debug)
477 printk(version);
478
479
480 dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
481 if (dev->priv == NULL) {
482 ret = -ENOMEM;
483 goto err_out;
484 }
485 memset(dev->priv, 0, sizeof(struct net_local));
486
487 dev->open = net_open;
488 dev->stop = net_close;
489 dev->hard_start_xmit = net_send_packet;
490 dev->get_stats = net_get_stats;
491 dev->set_multicast_list = &set_rx_mode;
492 dev->tx_timeout = net_tx_timeout;
493 dev->watchdog_timeo = TX_TIMEOUT;
494
495 lp = (struct net_local *)dev->priv;
496 lp->lock = SPIN_LOCK_UNLOCKED;
497
498
499 ether_setup(dev);
500
501 lp->jumpered = is_fmv18x;
502 lp->mca_slot = slot;
503
504 ret = request_irq(irq, &net_interrupt, 0, dev->name, dev);
505 if (ret) {
506 printk (" AT1700 at %#3x is unusable due to a conflict on"
507 "IRQ %d.\n", ioaddr, irq);
508 goto err_out_priv;
509 }
510
511 return 0;
512
513err_out_priv:
514 kfree(dev->priv);
515 dev->priv = NULL;
516err_out:
517#ifndef CONFIG_X86_PC9800
518 release_region(ioaddr, AT1700_IO_EXTENT);
519#else
520 for (i = 0; i < 0x2000; i += 0x0200)
521 release_region(ioaddr + i, 2);
522#endif
523 return ret;
524}
525
526
527
528#define EE_SHIFT_CLK 0x40
529#define EE_CS 0x20
530#define EE_DATA_WRITE 0x80
531#define EE_DATA_READ 0x80
532
533
534#ifndef CONFIG_X86_PC9800
535#define eeprom_delay() do { } while (0)
536#else
537#define eeprom_delay() __asm__ ("out%B0 %%al,%0" :: "N"(0x5f))
538#endif
539
540
541#define EE_WRITE_CMD (5 << 6)
542#define EE_READ_CMD (6 << 6)
543#define EE_ERASE_CMD (7 << 6)
544
545static int __init read_eeprom(long ioaddr, int location)
546{
547 int i;
548 unsigned short retval = 0;
549 long ee_addr = ioaddr + EEPROM_Ctrl;
550 long ee_daddr = ioaddr + EEPROM_Data;
551 int read_cmd = location | EE_READ_CMD;
552
553
554 for (i = 9; i >= 0; i--) {
555 short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
556 outb(EE_CS, ee_addr);
557 outb(dataval, ee_daddr);
558 eeprom_delay();
559 outb(EE_CS | EE_SHIFT_CLK, ee_addr);
560 eeprom_delay();
561 }
562 outb(EE_DATA_WRITE, ee_daddr);
563 for (i = 16; i > 0; i--) {
564 outb(EE_CS, ee_addr);
565 eeprom_delay();
566 outb(EE_CS | EE_SHIFT_CLK, ee_addr);
567 eeprom_delay();
568 retval = (retval << 1) | ((inb(ee_daddr) & EE_DATA_READ) ? 1 : 0);
569 }
570
571
572 outb(EE_CS, ee_addr);
573 eeprom_delay();
574 outb(EE_SHIFT_CLK, ee_addr);
575 outb(0, ee_addr);
576 return retval;
577}
578
579
580
581static int net_open(struct net_device *dev)
582{
583 struct net_local *lp = (struct net_local *)dev->priv;
584 int ioaddr = dev->base_addr;
585
586
587
588 outb(0x5a, ioaddr + CONFIG_0);
589
590
591 outb(0xe8, ioaddr + CONFIG_1);
592
593 lp->tx_started = 0;
594 lp->tx_queue_ready = 1;
595 lp->rx_started = 0;
596 lp->tx_queue = 0;
597 lp->tx_queue_len = 0;
598
599
600 outb(0x82, ioaddr + TX_INTR);
601 outb(0x81, ioaddr + RX_INTR);
602
603
604 if (lp->jumpered) {
605 outb(0x80, ioaddr + IOCONFIG1);
606 }
607
608 netif_start_queue(dev);
609 return 0;
610}
611
612static void net_tx_timeout (struct net_device *dev)
613{
614 struct net_local *lp = (struct net_local *)dev->priv;
615 int ioaddr = dev->base_addr;
616
617 printk ("%s: transmit timed out with status %04x, %s?\n", dev->name,
618 inw (ioaddr + STATUS), inb (ioaddr + TX_STATUS) & 0x80
619 ? "IRQ conflict" : "network cable problem");
620 printk ("%s: timeout registers: %04x %04x %04x %04x %04x %04x %04x %04x.\n",
621 dev->name, inw(ioaddr + TX_STATUS), inw(ioaddr + TX_INTR), inw(ioaddr + TX_MODE),
622 inw(ioaddr + CONFIG_0), inw(ioaddr + DATAPORT), inw(ioaddr + TX_START),
623 inw(ioaddr + MODE13 - 1), inw(ioaddr + RX_CTRL));
624 lp->stats.tx_errors++;
625
626 outw(0xffff, ioaddr + MODE24);
627 outw (0xffff, ioaddr + TX_STATUS);
628 outb (0x5a, ioaddr + CONFIG_0);
629 outb (0xe8, ioaddr + CONFIG_1);
630 outw (0x8182, ioaddr + TX_INTR);
631 outb (0x00, ioaddr + TX_START);
632 outb (0x03, ioaddr + COL16CNTL);
633
634 dev->trans_start = jiffies;
635
636 lp->tx_started = 0;
637 lp->tx_queue_ready = 1;
638 lp->rx_started = 0;
639 lp->tx_queue = 0;
640 lp->tx_queue_len = 0;
641
642 netif_wake_queue(dev);
643}
644
645
646static int net_send_packet (struct sk_buff *skb, struct net_device *dev)
647{
648 struct net_local *lp = (struct net_local *) dev->priv;
649 int ioaddr = dev->base_addr;
650 short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
651 short len = skb->len;
652 unsigned char *buf = skb->data;
653 static u8 pad[ETH_ZLEN];
654
655 netif_stop_queue (dev);
656
657
658
659
660
661
662 lp->tx_queue_ready = 0;
663 {
664 outw (length, ioaddr + DATAPORT);
665
666 outsw (ioaddr + DATAPORT, buf, len >> 1);
667
668 if (len & 1) {
669 outw(skb->data[skb->len-1], ioaddr + DATAPORT);
670 len++;
671 }
672
673 if (length != skb->len)
674 outsw(ioaddr + DATAPORT, pad, (length - len + 1) >> 1);
675
676 lp->tx_queue++;
677 lp->tx_queue_len += length + 2;
678 }
679 lp->tx_queue_ready = 1;
680
681 if (lp->tx_started == 0) {
682
683 outb (0x80 | lp->tx_queue, ioaddr + TX_START);
684 lp->tx_queue = 0;
685 lp->tx_queue_len = 0;
686 dev->trans_start = jiffies;
687 lp->tx_started = 1;
688 netif_start_queue (dev);
689 } else if (lp->tx_queue_len < 4096 - 1502)
690
691 netif_start_queue (dev);
692 dev_kfree_skb (skb);
693
694 return 0;
695}
696
697
698
699static irqreturn_t
700net_interrupt(int irq, void *dev_id, struct pt_regs *regs)
701{
702 struct net_device *dev = dev_id;
703 struct net_local *lp;
704 int ioaddr, status;
705 int handled = 0;
706
707 if (dev == NULL) {
708 printk ("at1700_interrupt(): irq %d for unknown device.\n", irq);
709 return IRQ_NONE;
710 }
711
712 ioaddr = dev->base_addr;
713 lp = (struct net_local *)dev->priv;
714
715 spin_lock (&lp->lock);
716
717 status = inw(ioaddr + TX_STATUS);
718 outw(status, ioaddr + TX_STATUS);
719
720 if (net_debug > 4)
721 printk("%s: Interrupt with status %04x.\n", dev->name, status);
722 if (lp->rx_started == 0 &&
723 (status & 0xff00 || (inb(ioaddr + RX_MODE) & 0x40) == 0)) {
724
725
726
727
728
729
730 handled = 1;
731 lp->rx_started = 1;
732 outb(0x00, ioaddr + RX_INTR);
733 net_rx(dev);
734 outb(0x81, ioaddr + RX_INTR);
735 lp->rx_started = 0;
736 }
737 if (status & 0x00ff) {
738 handled = 1;
739 if (status & 0x02) {
740
741 if (net_debug > 4)
742 printk("%s: 16 Collision occur during Txing.\n", dev->name);
743
744 outb(0x03, ioaddr + COL16CNTL);
745 lp->stats.collisions++;
746 }
747 if (status & 0x82) {
748 lp->stats.tx_packets++;
749
750
751
752 if (lp->tx_queue && lp->tx_queue_ready) {
753 outb(0x80 | lp->tx_queue, ioaddr + TX_START);
754 lp->tx_queue = 0;
755 lp->tx_queue_len = 0;
756 dev->trans_start = jiffies;
757 netif_wake_queue (dev);
758 } else {
759 lp->tx_started = 0;
760 netif_wake_queue (dev);
761 }
762 }
763 }
764
765 spin_unlock (&lp->lock);
766 return IRQ_RETVAL(handled);
767}
768
769
770static void
771net_rx(struct net_device *dev)
772{
773 struct net_local *lp = (struct net_local *)dev->priv;
774 int ioaddr = dev->base_addr;
775 int boguscount = 5;
776
777 while ((inb(ioaddr + RX_MODE) & 0x40) == 0) {
778 ushort status = inw(ioaddr + DATAPORT);
779 ushort pkt_len = inw(ioaddr + DATAPORT);
780
781 if (net_debug > 4)
782 printk("%s: Rxing packet mode %02x status %04x.\n",
783 dev->name, inb(ioaddr + RX_MODE), status);
784#ifndef final_version
785 if (status == 0) {
786 outb(0x05, ioaddr + RX_CTRL);
787 break;
788 }
789#endif
790
791 if ((status & 0xF0) != 0x20) {
792 lp->stats.rx_errors++;
793 if (status & 0x08) lp->stats.rx_length_errors++;
794 if (status & 0x04) lp->stats.rx_frame_errors++;
795 if (status & 0x02) lp->stats.rx_crc_errors++;
796 if (status & 0x01) lp->stats.rx_over_errors++;
797 } else {
798
799 struct sk_buff *skb;
800
801 if (pkt_len > 1550) {
802 printk("%s: The AT1700 claimed a very large packet, size %d.\n",
803 dev->name, pkt_len);
804
805 inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
806 outb(0x05, ioaddr + RX_CTRL);
807 lp->stats.rx_errors++;
808 break;
809 }
810 skb = dev_alloc_skb(pkt_len+3);
811 if (skb == NULL) {
812 printk("%s: Memory squeeze, dropping packet (len %d).\n",
813 dev->name, pkt_len);
814
815 inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
816 outb(0x05, ioaddr + RX_CTRL);
817 lp->stats.rx_dropped++;
818 break;
819 }
820 skb->dev = dev;
821 skb_reserve(skb,2);
822
823 insw(ioaddr + DATAPORT, skb_put(skb,pkt_len), (pkt_len + 1) >> 1);
824 skb->protocol=eth_type_trans(skb, dev);
825 netif_rx(skb);
826 dev->last_rx = jiffies;
827 lp->stats.rx_packets++;
828 lp->stats.rx_bytes += pkt_len;
829 }
830 if (--boguscount <= 0)
831 break;
832 }
833
834
835
836
837 {
838 int i;
839 for (i = 0; i < 20; i++) {
840 if ((inb(ioaddr + RX_MODE) & 0x40) == 0x40)
841 break;
842 inw(ioaddr + DATAPORT);
843 outb(0x05, ioaddr + RX_CTRL);
844 }
845
846 if (net_debug > 5)
847 printk("%s: Exint Rx packet with mode %02x after %d ticks.\n",
848 dev->name, inb(ioaddr + RX_MODE), i);
849 }
850 return;
851}
852
853
854static int net_close(struct net_device *dev)
855{
856 struct net_local *lp = (struct net_local *)dev->priv;
857 int ioaddr = dev->base_addr;
858
859 netif_stop_queue(dev);
860
861
862 outb(0xda, ioaddr + CONFIG_0);
863
864
865
866
867 if (lp->jumpered) {
868 outb(0x00, ioaddr + IOCONFIG1);
869 free_irq(dev->irq, dev);
870 }
871
872
873 outb(0x00, ioaddr + CONFIG_1);
874 return 0;
875}
876
877
878
879
880
881static struct net_device_stats *
882net_get_stats(struct net_device *dev)
883{
884 struct net_local *lp = (struct net_local *)dev->priv;
885 return &lp->stats;
886}
887
888
889
890
891
892static void
893set_rx_mode(struct net_device *dev)
894{
895 int ioaddr = dev->base_addr;
896 struct net_local *lp = (struct net_local *)dev->priv;
897 unsigned char mc_filter[8];
898 unsigned long flags;
899 int i;
900
901 if (dev->flags & IFF_PROMISC) {
902
903 printk("%s: Promiscuous mode enabled.\n", dev->name);
904 memset(mc_filter, 0xff, sizeof(mc_filter));
905 outb(3, ioaddr + RX_MODE);
906 } else if (dev->mc_count > MC_FILTERBREAK
907 || (dev->flags & IFF_ALLMULTI)) {
908
909 memset(mc_filter, 0xff, sizeof(mc_filter));
910 outb(2, ioaddr + RX_MODE);
911 } else if (dev->mc_count == 0) {
912 memset(mc_filter, 0x00, sizeof(mc_filter));
913 outb(1, ioaddr + RX_MODE);
914 } else {
915 struct dev_mc_list *mclist;
916 int i;
917
918 memset(mc_filter, 0, sizeof(mc_filter));
919 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
920 i++, mclist = mclist->next) {
921 unsigned int bit =
922 ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26;
923 mc_filter[bit >> 3] |= (1 << bit);
924 }
925 outb(0x02, ioaddr + RX_MODE);
926 }
927
928 spin_lock_irqsave (&lp->lock, flags);
929 if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) {
930 int saved_bank = inw(ioaddr + CONFIG_0);
931
932 outw((saved_bank & ~0x0C00) | 0x0480, ioaddr + CONFIG_0);
933 for (i = 0; i < 8; i++)
934 outb(mc_filter[i], ioaddr + PORT_OFFSET(8 + i));
935 memcpy(lp->mc_filter, mc_filter, sizeof(mc_filter));
936 outw(saved_bank, ioaddr + CONFIG_0);
937 }
938 spin_unlock_irqrestore (&lp->lock, flags);
939 return;
940}
941
942#ifdef MODULE
943static struct net_device dev_at1700;
944#ifndef CONFIG_X86_PC9800
945static int io = 0x260;
946#else
947static int io = 0xd0;
948#endif
949
950static int irq;
951
952MODULE_PARM(io, "i");
953MODULE_PARM(irq, "i");
954MODULE_PARM(net_debug, "i");
955MODULE_PARM_DESC(io, "AT1700/FMV18X I/O base address");
956MODULE_PARM_DESC(irq, "AT1700/FMV18X IRQ number");
957MODULE_PARM_DESC(net_debug, "AT1700/FMV18X debug level (0-6)");
958
959int init_module(void)
960{
961 if (io == 0)
962 printk("at1700: You should not use auto-probing with insmod!\n");
963 dev_at1700.base_addr = io;
964 dev_at1700.irq = irq;
965 dev_at1700.init = at1700_probe;
966 if (register_netdev(&dev_at1700) != 0) {
967 printk("at1700: register_netdev() returned non-zero.\n");
968 return -EIO;
969 }
970 return 0;
971}
972
973void
974cleanup_module(void)
975{
976#ifdef CONFIG_MCA
977 struct net_local *lp = dev_at1700.priv;
978 if(lp->mca_slot)
979 {
980 mca_mark_as_unused(lp->mca_slot);
981 }
982#endif
983 unregister_netdev(&dev_at1700);
984 kfree(dev_at1700.priv);
985 dev_at1700.priv = NULL;
986
987
988 free_irq(dev_at1700.irq, NULL);
989#ifndef CONFIG_X86_PC9800
990 release_region(dev_at1700.base_addr, AT1700_IO_EXTENT);
991#else
992 {
993 int i;
994 for (i = 0; i < 0x2000; i += 0x200)
995 release_region(dev_at1700.base_addr + i, 2);
996 }
997#endif
998}
999#endif
1000MODULE_LICENSE("GPL");
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013