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
43
44
45
46
47
48
49
50static const char version[] =
51 "8390.c:v1.10cvs 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
52
53#include <linux/module.h>
54#include <linux/kernel.h>
55#include <linux/jiffies.h>
56#include <linux/fs.h>
57#include <linux/types.h>
58#include <linux/string.h>
59#include <asm/system.h>
60#include <asm/uaccess.h>
61#include <asm/bitops.h>
62#include <asm/io.h>
63#include <asm/irq.h>
64#include <linux/delay.h>
65#include <linux/errno.h>
66#include <linux/fcntl.h>
67#include <linux/in.h>
68#include <linux/interrupt.h>
69#include <linux/init.h>
70#include <linux/crc32.h>
71
72#include <linux/netdevice.h>
73#include <linux/etherdevice.h>
74
75#define NS8390_CORE
76#include "8390.h"
77
78#define BUG_83C690
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98#define ei_reset_8390 (ei_local->reset_8390)
99#define ei_block_output (ei_local->block_output)
100#define ei_block_input (ei_local->block_input)
101#define ei_get_8390_hdr (ei_local->get_8390_hdr)
102
103
104#ifndef ei_debug
105int ei_debug = 1;
106#endif
107
108
109static void ei_tx_intr(struct net_device *dev);
110static void ei_tx_err(struct net_device *dev);
111static void ei_tx_timeout(struct net_device *dev);
112static void ei_receive(struct net_device *dev);
113static void ei_rx_overrun(struct net_device *dev);
114
115
116static void NS8390_trigger_send(struct net_device *dev, unsigned int length,
117 int start_page);
118static void set_multicast_list(struct net_device *dev);
119static void do_set_multicast_list(struct net_device *dev);
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157int ei_open(struct net_device *dev)
158{
159 unsigned long flags;
160 struct ei_device *ei_local = (struct ei_device *) dev->priv;
161
162
163 if (ei_local == NULL)
164 {
165 printk(KERN_EMERG "%s: ei_open passed a non-existent device!\n", dev->name);
166 return -ENXIO;
167 }
168
169
170
171 if (dev->tx_timeout == NULL)
172 dev->tx_timeout = ei_tx_timeout;
173 if (dev->watchdog_timeo <= 0)
174 dev->watchdog_timeo = TX_TIMEOUT;
175
176
177
178
179
180
181 spin_lock_irqsave(&ei_local->page_lock, flags);
182 NS8390_init(dev, 1);
183
184
185 netif_start_queue(dev);
186 spin_unlock_irqrestore(&ei_local->page_lock, flags);
187 ei_local->irqlock = 0;
188 return 0;
189}
190
191
192
193
194
195
196
197int ei_close(struct net_device *dev)
198{
199 struct ei_device *ei_local = (struct ei_device *) dev->priv;
200 unsigned long flags;
201
202
203
204
205
206 spin_lock_irqsave(&ei_local->page_lock, flags);
207 NS8390_init(dev, 0);
208 spin_unlock_irqrestore(&ei_local->page_lock, flags);
209 netif_stop_queue(dev);
210 return 0;
211}
212
213
214
215
216
217
218
219
220
221void ei_tx_timeout(struct net_device *dev)
222{
223 long e8390_base = dev->base_addr;
224 struct ei_device *ei_local = (struct ei_device *) dev->priv;
225 int txsr, isr, tickssofar = jiffies - dev->trans_start;
226 unsigned long flags;
227
228 ei_local->stat.tx_errors++;
229
230 spin_lock_irqsave(&ei_local->page_lock, flags);
231 txsr = inb(e8390_base+EN0_TSR);
232 isr = inb(e8390_base+EN0_ISR);
233 spin_unlock_irqrestore(&ei_local->page_lock, flags);
234
235 printk(KERN_DEBUG "%s: Tx timed out, %s TSR=%#2x, ISR=%#2x, t=%d.\n",
236 dev->name, (txsr & ENTSR_ABT) ? "excess collisions." :
237 (isr) ? "lost interrupt?" : "cable problem?", txsr, isr, tickssofar);
238
239 if (!isr && !ei_local->stat.tx_packets)
240 {
241
242 ei_local->interface_num ^= 1;
243 }
244
245
246
247 disable_irq_nosync(dev->irq);
248 spin_lock(&ei_local->page_lock);
249
250
251 ei_reset_8390(dev);
252 NS8390_init(dev, 1);
253
254 spin_unlock(&ei_local->page_lock);
255 enable_irq(dev->irq);
256 netif_wake_queue(dev);
257}
258
259
260
261
262
263
264
265
266
267static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev)
268{
269 long e8390_base = dev->base_addr;
270 struct ei_device *ei_local = (struct ei_device *) dev->priv;
271 int length, send_length, output_page;
272 unsigned long flags;
273 char scratch[ETH_ZLEN];
274
275 length = skb->len;
276
277
278
279
280
281
282 spin_lock_irqsave(&ei_local->page_lock, flags);
283 outb_p(0x00, e8390_base + EN0_IMR);
284 spin_unlock_irqrestore(&ei_local->page_lock, flags);
285
286
287
288
289
290
291 disable_irq_nosync(dev->irq);
292
293 spin_lock(&ei_local->page_lock);
294
295 ei_local->irqlock = 1;
296
297 send_length = ETH_ZLEN < length ? length : ETH_ZLEN;
298
299#ifdef EI_PINGPONG
300
301
302
303
304
305
306
307
308
309 if (ei_local->tx1 == 0)
310 {
311 output_page = ei_local->tx_start_page;
312 ei_local->tx1 = send_length;
313 if (ei_debug && ei_local->tx2 > 0)
314 printk(KERN_DEBUG "%s: idle transmitter tx2=%d, lasttx=%d, txing=%d.\n",
315 dev->name, ei_local->tx2, ei_local->lasttx, ei_local->txing);
316 }
317 else if (ei_local->tx2 == 0)
318 {
319 output_page = ei_local->tx_start_page + TX_1X_PAGES;
320 ei_local->tx2 = send_length;
321 if (ei_debug && ei_local->tx1 > 0)
322 printk(KERN_DEBUG "%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n",
323 dev->name, ei_local->tx1, ei_local->lasttx, ei_local->txing);
324 }
325 else
326 {
327 if (ei_debug)
328 printk(KERN_DEBUG "%s: No Tx buffers free! tx1=%d tx2=%d last=%d\n",
329 dev->name, ei_local->tx1, ei_local->tx2, ei_local->lasttx);
330 ei_local->irqlock = 0;
331 netif_stop_queue(dev);
332 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
333 spin_unlock(&ei_local->page_lock);
334 enable_irq(dev->irq);
335 ei_local->stat.tx_errors++;
336 return 1;
337 }
338
339
340
341
342
343
344
345 if (length == send_length)
346 ei_block_output(dev, length, skb->data, output_page);
347 else {
348 memset(scratch, 0, ETH_ZLEN);
349 memcpy(scratch, skb->data, skb->len);
350 ei_block_output(dev, ETH_ZLEN, scratch, output_page);
351 }
352
353 if (! ei_local->txing)
354 {
355 ei_local->txing = 1;
356 NS8390_trigger_send(dev, send_length, output_page);
357 dev->trans_start = jiffies;
358 if (output_page == ei_local->tx_start_page)
359 {
360 ei_local->tx1 = -1;
361 ei_local->lasttx = -1;
362 }
363 else
364 {
365 ei_local->tx2 = -1;
366 ei_local->lasttx = -2;
367 }
368 }
369 else ei_local->txqueue++;
370
371 if (ei_local->tx1 && ei_local->tx2)
372 netif_stop_queue(dev);
373 else
374 netif_start_queue(dev);
375
376#else
377
378
379
380
381
382
383
384 if (length == send_length)
385 ei_block_output(dev, length, skb->data, ei_local->tx_start_page);
386 else {
387 memset(scratch, 0, ETH_ZLEN);
388 memcpy(scratch, skb->data, skb->len);
389 ei_block_output(dev, ETH_ZLEN, scratch, ei_local->tx_start_page);
390 }
391 ei_local->txing = 1;
392 NS8390_trigger_send(dev, send_length, ei_local->tx_start_page);
393 dev->trans_start = jiffies;
394 netif_stop_queue(dev);
395
396#endif
397
398
399 ei_local->irqlock = 0;
400 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
401
402 spin_unlock(&ei_local->page_lock);
403 enable_irq(dev->irq);
404
405 dev_kfree_skb (skb);
406 ei_local->stat.tx_bytes += send_length;
407
408 return 0;
409}
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424irqreturn_t ei_interrupt(int irq, void *dev_id, struct pt_regs * regs)
425{
426 struct net_device *dev = dev_id;
427 long e8390_base;
428 int interrupts, nr_serviced = 0;
429 struct ei_device *ei_local;
430
431 if (dev == NULL)
432 {
433 printk ("net_interrupt(): irq %d for unknown device.\n", irq);
434 return IRQ_NONE;
435 }
436
437 e8390_base = dev->base_addr;
438 ei_local = (struct ei_device *) dev->priv;
439
440
441
442
443
444 spin_lock(&ei_local->page_lock);
445
446 if (ei_local->irqlock)
447 {
448#if 1
449
450 printk(ei_local->irqlock
451 ? "%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.\n"
452 : "%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.\n",
453 dev->name, inb_p(e8390_base + EN0_ISR),
454 inb_p(e8390_base + EN0_IMR));
455#endif
456 spin_unlock(&ei_local->page_lock);
457 return IRQ_NONE;
458 }
459
460
461 outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD);
462 if (ei_debug > 3)
463 printk(KERN_DEBUG "%s: interrupt(isr=%#2.2x).\n", dev->name,
464 inb_p(e8390_base + EN0_ISR));
465
466
467 while ((interrupts = inb_p(e8390_base + EN0_ISR)) != 0
468 && ++nr_serviced < MAX_SERVICE)
469 {
470 if (!netif_running(dev)) {
471 printk(KERN_WARNING "%s: interrupt from stopped card\n", dev->name);
472
473 outb_p(interrupts, e8390_base + EN0_ISR);
474 interrupts = 0;
475 break;
476 }
477 if (interrupts & ENISR_OVER)
478 ei_rx_overrun(dev);
479 else if (interrupts & (ENISR_RX+ENISR_RX_ERR))
480 {
481
482 ei_receive(dev);
483 }
484
485 if (interrupts & ENISR_TX)
486 ei_tx_intr(dev);
487 else if (interrupts & ENISR_TX_ERR)
488 ei_tx_err(dev);
489
490 if (interrupts & ENISR_COUNTERS)
491 {
492 ei_local->stat.rx_frame_errors += inb_p(e8390_base + EN0_COUNTER0);
493 ei_local->stat.rx_crc_errors += inb_p(e8390_base + EN0_COUNTER1);
494 ei_local->stat.rx_missed_errors+= inb_p(e8390_base + EN0_COUNTER2);
495 outb_p(ENISR_COUNTERS, e8390_base + EN0_ISR);
496 }
497
498
499 if (interrupts & ENISR_RDC)
500 {
501 outb_p(ENISR_RDC, e8390_base + EN0_ISR);
502 }
503
504 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD);
505 }
506
507 if (interrupts && ei_debug)
508 {
509 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD);
510 if (nr_serviced >= MAX_SERVICE)
511 {
512
513 if(interrupts!=0xFF)
514 printk(KERN_WARNING "%s: Too much work at interrupt, status %#2.2x\n",
515 dev->name, interrupts);
516 outb_p(ENISR_ALL, e8390_base + EN0_ISR);
517 } else {
518 printk(KERN_WARNING "%s: unknown interrupt %#2x\n", dev->name, interrupts);
519 outb_p(0xff, e8390_base + EN0_ISR);
520 }
521 }
522 spin_unlock(&ei_local->page_lock);
523 return IRQ_HANDLED;
524}
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540static void ei_tx_err(struct net_device *dev)
541{
542 long e8390_base = dev->base_addr;
543 struct ei_device *ei_local = (struct ei_device *) dev->priv;
544 unsigned char txsr = inb_p(e8390_base+EN0_TSR);
545 unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU);
546
547#ifdef VERBOSE_ERROR_DUMP
548 printk(KERN_DEBUG "%s: transmitter error (%#2x): ", dev->name, txsr);
549 if (txsr & ENTSR_ABT)
550 printk("excess-collisions ");
551 if (txsr & ENTSR_ND)
552 printk("non-deferral ");
553 if (txsr & ENTSR_CRS)
554 printk("lost-carrier ");
555 if (txsr & ENTSR_FU)
556 printk("FIFO-underrun ");
557 if (txsr & ENTSR_CDH)
558 printk("lost-heartbeat ");
559 printk("\n");
560#endif
561
562 outb_p(ENISR_TX_ERR, e8390_base + EN0_ISR);
563
564 if (tx_was_aborted)
565 ei_tx_intr(dev);
566 else
567 {
568 ei_local->stat.tx_errors++;
569 if (txsr & ENTSR_CRS) ei_local->stat.tx_carrier_errors++;
570 if (txsr & ENTSR_CDH) ei_local->stat.tx_heartbeat_errors++;
571 if (txsr & ENTSR_OWC) ei_local->stat.tx_window_errors++;
572 }
573}
574
575
576
577
578
579
580
581
582
583static void ei_tx_intr(struct net_device *dev)
584{
585 long e8390_base = dev->base_addr;
586 struct ei_device *ei_local = (struct ei_device *) dev->priv;
587 int status = inb(e8390_base + EN0_TSR);
588
589 outb_p(ENISR_TX, e8390_base + EN0_ISR);
590
591#ifdef EI_PINGPONG
592
593
594
595
596
597 ei_local->txqueue--;
598
599 if (ei_local->tx1 < 0)
600 {
601 if (ei_local->lasttx != 1 && ei_local->lasttx != -1)
602 printk(KERN_ERR "%s: bogus last_tx_buffer %d, tx1=%d.\n",
603 ei_local->name, ei_local->lasttx, ei_local->tx1);
604 ei_local->tx1 = 0;
605 if (ei_local->tx2 > 0)
606 {
607 ei_local->txing = 1;
608 NS8390_trigger_send(dev, ei_local->tx2, ei_local->tx_start_page + 6);
609 dev->trans_start = jiffies;
610 ei_local->tx2 = -1,
611 ei_local->lasttx = 2;
612 }
613 else ei_local->lasttx = 20, ei_local->txing = 0;
614 }
615 else if (ei_local->tx2 < 0)
616 {
617 if (ei_local->lasttx != 2 && ei_local->lasttx != -2)
618 printk("%s: bogus last_tx_buffer %d, tx2=%d.\n",
619 ei_local->name, ei_local->lasttx, ei_local->tx2);
620 ei_local->tx2 = 0;
621 if (ei_local->tx1 > 0)
622 {
623 ei_local->txing = 1;
624 NS8390_trigger_send(dev, ei_local->tx1, ei_local->tx_start_page);
625 dev->trans_start = jiffies;
626 ei_local->tx1 = -1;
627 ei_local->lasttx = 1;
628 }
629 else
630 ei_local->lasttx = 10, ei_local->txing = 0;
631 }
632
633
634
635#else
636
637
638
639 ei_local->txing = 0;
640#endif
641
642
643 if (status & ENTSR_COL)
644 ei_local->stat.collisions++;
645 if (status & ENTSR_PTX)
646 ei_local->stat.tx_packets++;
647 else
648 {
649 ei_local->stat.tx_errors++;
650 if (status & ENTSR_ABT)
651 {
652 ei_local->stat.tx_aborted_errors++;
653 ei_local->stat.collisions += 16;
654 }
655 if (status & ENTSR_CRS)
656 ei_local->stat.tx_carrier_errors++;
657 if (status & ENTSR_FU)
658 ei_local->stat.tx_fifo_errors++;
659 if (status & ENTSR_CDH)
660 ei_local->stat.tx_heartbeat_errors++;
661 if (status & ENTSR_OWC)
662 ei_local->stat.tx_window_errors++;
663 }
664 netif_wake_queue(dev);
665}
666
667
668
669
670
671
672
673
674
675static void ei_receive(struct net_device *dev)
676{
677 long e8390_base = dev->base_addr;
678 struct ei_device *ei_local = (struct ei_device *) dev->priv;
679 unsigned char rxing_page, this_frame, next_frame;
680 unsigned short current_offset;
681 int rx_pkt_count = 0;
682 struct e8390_pkt_hdr rx_frame;
683 int num_rx_pages = ei_local->stop_page-ei_local->rx_start_page;
684
685 while (++rx_pkt_count < 10)
686 {
687 int pkt_len, pkt_stat;
688
689
690 outb_p(E8390_NODMA+E8390_PAGE1, e8390_base + E8390_CMD);
691 rxing_page = inb_p(e8390_base + EN1_CURPAG);
692 outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD);
693
694
695 this_frame = inb_p(e8390_base + EN0_BOUNDARY) + 1;
696 if (this_frame >= ei_local->stop_page)
697 this_frame = ei_local->rx_start_page;
698
699
700
701
702
703
704
705 if (ei_debug > 0 && this_frame != ei_local->current_page && (this_frame!=0x0 || rxing_page!=0xFF))
706 printk(KERN_ERR "%s: mismatched read page pointers %2x vs %2x.\n",
707 dev->name, this_frame, ei_local->current_page);
708
709 if (this_frame == rxing_page)
710 break;
711
712 current_offset = this_frame << 8;
713 ei_get_8390_hdr(dev, &rx_frame, this_frame);
714
715 pkt_len = rx_frame.count - sizeof(struct e8390_pkt_hdr);
716 pkt_stat = rx_frame.status;
717
718 next_frame = this_frame + 1 + ((pkt_len+4)>>8);
719
720
721
722
723 if (rx_frame.next != next_frame
724 && rx_frame.next != next_frame + 1
725 && rx_frame.next != next_frame - num_rx_pages
726 && rx_frame.next != next_frame + 1 - num_rx_pages) {
727 ei_local->current_page = rxing_page;
728 outb(ei_local->current_page-1, e8390_base+EN0_BOUNDARY);
729 ei_local->stat.rx_errors++;
730 continue;
731 }
732
733 if (pkt_len < 60 || pkt_len > 1518)
734 {
735 if (ei_debug)
736 printk(KERN_DEBUG "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n",
737 dev->name, rx_frame.count, rx_frame.status,
738 rx_frame.next);
739 ei_local->stat.rx_errors++;
740 ei_local->stat.rx_length_errors++;
741 }
742 else if ((pkt_stat & 0x0F) == ENRSR_RXOK)
743 {
744 struct sk_buff *skb;
745
746 skb = dev_alloc_skb(pkt_len+2);
747 if (skb == NULL)
748 {
749 if (ei_debug > 1)
750 printk(KERN_DEBUG "%s: Couldn't allocate a sk_buff of size %d.\n",
751 dev->name, pkt_len);
752 ei_local->stat.rx_dropped++;
753 break;
754 }
755 else
756 {
757 skb_reserve(skb,2);
758 skb->dev = dev;
759 skb_put(skb, pkt_len);
760 ei_block_input(dev, pkt_len, skb, current_offset + sizeof(rx_frame));
761 skb->protocol=eth_type_trans(skb,dev);
762 netif_rx(skb);
763 dev->last_rx = jiffies;
764 ei_local->stat.rx_packets++;
765 ei_local->stat.rx_bytes += pkt_len;
766 if (pkt_stat & ENRSR_PHY)
767 ei_local->stat.multicast++;
768 }
769 }
770 else
771 {
772 if (ei_debug)
773 printk(KERN_DEBUG "%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n",
774 dev->name, rx_frame.status, rx_frame.next,
775 rx_frame.count);
776 ei_local->stat.rx_errors++;
777
778 if (pkt_stat & ENRSR_FO)
779 ei_local->stat.rx_fifo_errors++;
780 }
781 next_frame = rx_frame.next;
782
783
784 if (next_frame >= ei_local->stop_page) {
785 printk("%s: next frame inconsistency, %#2x\n", dev->name,
786 next_frame);
787 next_frame = ei_local->rx_start_page;
788 }
789 ei_local->current_page = next_frame;
790 outb_p(next_frame-1, e8390_base+EN0_BOUNDARY);
791 }
792
793
794
795 outb_p(ENISR_RX+ENISR_RX_ERR, e8390_base+EN0_ISR);
796 return;
797}
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812static void ei_rx_overrun(struct net_device *dev)
813{
814 long e8390_base = dev->base_addr;
815 unsigned char was_txing, must_resend = 0;
816 struct ei_device *ei_local = (struct ei_device *) dev->priv;
817
818
819
820
821
822 was_txing = inb_p(e8390_base+E8390_CMD) & E8390_TRANS;
823 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
824
825 if (ei_debug > 1)
826 printk(KERN_DEBUG "%s: Receiver overrun.\n", dev->name);
827 ei_local->stat.rx_over_errors++;
828
829
830
831
832
833
834
835
836 udelay(10*1000);
837
838
839
840
841 outb_p(0x00, e8390_base+EN0_RCNTLO);
842 outb_p(0x00, e8390_base+EN0_RCNTHI);
843
844
845
846
847
848
849 if (was_txing)
850 {
851 unsigned char tx_completed = inb_p(e8390_base+EN0_ISR) & (ENISR_TX+ENISR_TX_ERR);
852 if (!tx_completed)
853 must_resend = 1;
854 }
855
856
857
858
859
860 outb_p(E8390_TXOFF, e8390_base + EN0_TXCR);
861 outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START, e8390_base + E8390_CMD);
862
863
864
865
866 ei_receive(dev);
867 outb_p(ENISR_OVER, e8390_base+EN0_ISR);
868
869
870
871
872 outb_p(E8390_TXCONFIG, e8390_base + EN0_TXCR);
873 if (must_resend)
874 outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START + E8390_TRANS, e8390_base + E8390_CMD);
875}
876
877
878
879
880
881static struct net_device_stats *get_stats(struct net_device *dev)
882{
883 long ioaddr = dev->base_addr;
884 struct ei_device *ei_local = (struct ei_device *) dev->priv;
885 unsigned long flags;
886
887
888 if (!netif_running(dev))
889 return &ei_local->stat;
890
891 spin_lock_irqsave(&ei_local->page_lock,flags);
892
893 ei_local->stat.rx_frame_errors += inb_p(ioaddr + EN0_COUNTER0);
894 ei_local->stat.rx_crc_errors += inb_p(ioaddr + EN0_COUNTER1);
895 ei_local->stat.rx_missed_errors+= inb_p(ioaddr + EN0_COUNTER2);
896 spin_unlock_irqrestore(&ei_local->page_lock, flags);
897
898 return &ei_local->stat;
899}
900
901
902
903
904
905
906static inline void make_mc_bits(u8 *bits, struct net_device *dev)
907{
908 struct dev_mc_list *dmi;
909
910 for (dmi=dev->mc_list; dmi; dmi=dmi->next)
911 {
912 u32 crc;
913 if (dmi->dmi_addrlen != ETH_ALEN)
914 {
915 printk(KERN_INFO "%s: invalid multicast address length given.\n", dev->name);
916 continue;
917 }
918 crc = ether_crc(ETH_ALEN, dmi->dmi_addr);
919
920
921
922
923 bits[crc>>29] |= (1<<((crc>>26)&7));
924 }
925}
926
927
928
929
930
931
932
933
934
935static void do_set_multicast_list(struct net_device *dev)
936{
937 long e8390_base = dev->base_addr;
938 int i;
939 struct ei_device *ei_local = (struct ei_device*)dev->priv;
940
941 if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI)))
942 {
943 memset(ei_local->mcfilter, 0, 8);
944 if (dev->mc_list)
945 make_mc_bits(ei_local->mcfilter, dev);
946 }
947 else
948 memset(ei_local->mcfilter, 0xFF, 8);
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963 if (netif_running(dev))
964 outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);
965 outb_p(E8390_NODMA + E8390_PAGE1, e8390_base + E8390_CMD);
966 for(i = 0; i < 8; i++)
967 {
968 outb_p(ei_local->mcfilter[i], e8390_base + EN1_MULT_SHIFT(i));
969#ifndef BUG_83C690
970 if(inb_p(e8390_base + EN1_MULT_SHIFT(i))!=ei_local->mcfilter[i])
971 printk(KERN_ERR "Multicast filter read/write mismap %d\n",i);
972#endif
973 }
974 outb_p(E8390_NODMA + E8390_PAGE0, e8390_base + E8390_CMD);
975
976 if(dev->flags&IFF_PROMISC)
977 outb_p(E8390_RXCONFIG | 0x18, e8390_base + EN0_RXCR);
978 else if(dev->flags&IFF_ALLMULTI || dev->mc_list)
979 outb_p(E8390_RXCONFIG | 0x08, e8390_base + EN0_RXCR);
980 else
981 outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);
982 }
983
984
985
986
987
988
989
990static void set_multicast_list(struct net_device *dev)
991{
992 unsigned long flags;
993 struct ei_device *ei_local = (struct ei_device*)dev->priv;
994
995 spin_lock_irqsave(&ei_local->page_lock, flags);
996 do_set_multicast_list(dev);
997 spin_unlock_irqrestore(&ei_local->page_lock, flags);
998}
999
1000static inline void ei_device_init(struct ei_device *ei_local)
1001{
1002 spin_lock_init(&ei_local->page_lock);
1003}
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013int ethdev_init(struct net_device *dev)
1014{
1015 if (ei_debug > 1)
1016 printk(version);
1017
1018 if (dev->priv == NULL)
1019 {
1020 dev->priv = kmalloc(sizeof(struct ei_device), GFP_KERNEL);
1021 if (dev->priv == NULL)
1022 return -ENOMEM;
1023 memset(dev->priv, 0, sizeof(struct ei_device));
1024 ei_device_init(dev->priv);
1025 }
1026
1027 dev->hard_start_xmit = &ei_start_xmit;
1028 dev->get_stats = get_stats;
1029 dev->set_multicast_list = &set_multicast_list;
1030
1031 ether_setup(dev);
1032
1033 return 0;
1034}
1035
1036
1037static void __ethdev_init(struct net_device *dev)
1038{
1039 ethdev_init(dev);
1040}
1041
1042
1043
1044
1045
1046
1047struct net_device *alloc_ei_netdev(void)
1048{
1049 struct net_device *dev;
1050
1051 dev = alloc_netdev(sizeof(struct ei_device), "eth%d", __ethdev_init);
1052 if (dev)
1053 ei_device_init(dev->priv);
1054
1055 return dev;
1056}
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072void NS8390_init(struct net_device *dev, int startp)
1073{
1074 long e8390_base = dev->base_addr;
1075 struct ei_device *ei_local = (struct ei_device *) dev->priv;
1076 int i;
1077 int endcfg = ei_local->word16
1078 ? (0x48 | ENDCFG_WTS | (ei_local->bigendian ? ENDCFG_BOS : 0))
1079 : 0x48;
1080
1081 if(sizeof(struct e8390_pkt_hdr)!=4)
1082 panic("8390.c: header struct mispacked\n");
1083
1084 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1085 outb_p(endcfg, e8390_base + EN0_DCFG);
1086
1087 outb_p(0x00, e8390_base + EN0_RCNTLO);
1088 outb_p(0x00, e8390_base + EN0_RCNTHI);
1089
1090 outb_p(E8390_RXOFF, e8390_base + EN0_RXCR);
1091 outb_p(E8390_TXOFF, e8390_base + EN0_TXCR);
1092
1093 outb_p(ei_local->tx_start_page, e8390_base + EN0_TPSR);
1094 ei_local->tx1 = ei_local->tx2 = 0;
1095 outb_p(ei_local->rx_start_page, e8390_base + EN0_STARTPG);
1096 outb_p(ei_local->stop_page-1, e8390_base + EN0_BOUNDARY);
1097 ei_local->current_page = ei_local->rx_start_page;
1098 outb_p(ei_local->stop_page, e8390_base + EN0_STOPPG);
1099
1100 outb_p(0xFF, e8390_base + EN0_ISR);
1101 outb_p(0x00, e8390_base + EN0_IMR);
1102
1103
1104
1105 outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP, e8390_base+E8390_CMD);
1106 for(i = 0; i < 6; i++)
1107 {
1108 outb_p(dev->dev_addr[i], e8390_base + EN1_PHYS_SHIFT(i));
1109 if(inb_p(e8390_base + EN1_PHYS_SHIFT(i))!=dev->dev_addr[i])
1110 printk(KERN_ERR "Hw. address read/write mismap %d\n",i);
1111 }
1112
1113 outb_p(ei_local->rx_start_page, e8390_base + EN1_CURPAG);
1114 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1115
1116 netif_start_queue(dev);
1117 ei_local->tx1 = ei_local->tx2 = 0;
1118 ei_local->txing = 0;
1119
1120 if (startp)
1121 {
1122 outb_p(0xff, e8390_base + EN0_ISR);
1123 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1124 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base+E8390_CMD);
1125 outb_p(E8390_TXCONFIG, e8390_base + EN0_TXCR);
1126
1127 outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);
1128 do_set_multicast_list(dev);
1129 }
1130}
1131
1132
1133
1134
1135static void NS8390_trigger_send(struct net_device *dev, unsigned int length,
1136 int start_page)
1137{
1138 long e8390_base = dev->base_addr;
1139 struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) dev->priv;
1140
1141 outb_p(E8390_NODMA+E8390_PAGE0, e8390_base+E8390_CMD);
1142
1143 if (inb_p(e8390_base) & E8390_TRANS)
1144 {
1145 printk(KERN_WARNING "%s: trigger_send() called with the transmitter busy.\n",
1146 dev->name);
1147 return;
1148 }
1149 outb_p(length & 0xff, e8390_base + EN0_TCNTLO);
1150 outb_p(length >> 8, e8390_base + EN0_TCNTHI);
1151 outb_p(start_page, e8390_base + EN0_TPSR);
1152 outb_p(E8390_NODMA+E8390_TRANS+E8390_START, e8390_base+E8390_CMD);
1153}
1154
1155EXPORT_SYMBOL(ei_open);
1156EXPORT_SYMBOL(ei_close);
1157EXPORT_SYMBOL(ei_interrupt);
1158EXPORT_SYMBOL(ei_tx_timeout);
1159EXPORT_SYMBOL(ethdev_init);
1160EXPORT_SYMBOL(NS8390_init);
1161EXPORT_SYMBOL(alloc_ei_netdev);
1162
1163#if defined(MODULE)
1164
1165int init_module(void)
1166{
1167 return 0;
1168}
1169
1170void cleanup_module(void)
1171{
1172}
1173
1174#endif
1175MODULE_LICENSE("GPL");
1176