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
50
51
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 <linux/bitops.h>
60#include <asm/system.h>
61#include <asm/uaccess.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);
111void 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 do_set_multicast_list(struct net_device *dev);
119static void __NS8390_init(struct net_device *dev, int startp);
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203static int __ei_open(struct net_device *dev)
204{
205 unsigned long flags;
206 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
207
208 if (dev->watchdog_timeo <= 0)
209 dev->watchdog_timeo = TX_TIMEOUT;
210
211
212
213
214
215
216 spin_lock_irqsave(&ei_local->page_lock, flags);
217 __NS8390_init(dev, 1);
218
219
220 netif_start_queue(dev);
221 spin_unlock_irqrestore(&ei_local->page_lock, flags);
222 ei_local->irqlock = 0;
223 return 0;
224}
225
226
227
228
229
230
231
232static int __ei_close(struct net_device *dev)
233{
234 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
235 unsigned long flags;
236
237
238
239
240
241 spin_lock_irqsave(&ei_local->page_lock, flags);
242 __NS8390_init(dev, 0);
243 spin_unlock_irqrestore(&ei_local->page_lock, flags);
244 netif_stop_queue(dev);
245 return 0;
246}
247
248
249
250
251
252
253
254
255
256static void __ei_tx_timeout(struct net_device *dev)
257{
258 unsigned long e8390_base = dev->base_addr;
259 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
260 int txsr, isr, tickssofar = jiffies - dev->trans_start;
261 unsigned long flags;
262
263 dev->stats.tx_errors++;
264
265 spin_lock_irqsave(&ei_local->page_lock, flags);
266 txsr = ei_inb(e8390_base+EN0_TSR);
267 isr = ei_inb(e8390_base+EN0_ISR);
268 spin_unlock_irqrestore(&ei_local->page_lock, flags);
269
270 printk(KERN_DEBUG "%s: Tx timed out, %s TSR=%#2x, ISR=%#2x, t=%d.\n",
271 dev->name, (txsr & ENTSR_ABT) ? "excess collisions." :
272 (isr) ? "lost interrupt?" : "cable problem?", txsr, isr, tickssofar);
273
274 if (!isr && !dev->stats.tx_packets)
275 {
276
277 ei_local->interface_num ^= 1;
278 }
279
280
281
282 disable_irq_nosync_lockdep(dev->irq);
283 spin_lock(&ei_local->page_lock);
284
285
286 ei_reset_8390(dev);
287 __NS8390_init(dev, 1);
288
289 spin_unlock(&ei_local->page_lock);
290 enable_irq_lockdep(dev->irq);
291 netif_wake_queue(dev);
292}
293
294
295
296
297
298
299
300
301
302static netdev_tx_t __ei_start_xmit(struct sk_buff *skb,
303 struct net_device *dev)
304{
305 unsigned long e8390_base = dev->base_addr;
306 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
307 int send_length = skb->len, output_page;
308 unsigned long flags;
309 char buf[ETH_ZLEN];
310 char *data = skb->data;
311
312 if (skb->len < ETH_ZLEN) {
313 memset(buf, 0, ETH_ZLEN);
314 memcpy(buf, data, skb->len);
315 send_length = ETH_ZLEN;
316 data = buf;
317 }
318
319
320
321
322
323
324 spin_lock_irqsave(&ei_local->page_lock, flags);
325 ei_outb_p(0x00, e8390_base + EN0_IMR);
326 spin_unlock_irqrestore(&ei_local->page_lock, flags);
327
328
329
330
331
332
333 disable_irq_nosync_lockdep_irqsave(dev->irq, &flags);
334
335 spin_lock(&ei_local->page_lock);
336
337 ei_local->irqlock = 1;
338
339
340
341
342
343
344
345
346
347 if (ei_local->tx1 == 0)
348 {
349 output_page = ei_local->tx_start_page;
350 ei_local->tx1 = send_length;
351 if (ei_debug && ei_local->tx2 > 0)
352 printk(KERN_DEBUG "%s: idle transmitter tx2=%d, lasttx=%d, txing=%d.\n",
353 dev->name, ei_local->tx2, ei_local->lasttx, ei_local->txing);
354 }
355 else if (ei_local->tx2 == 0)
356 {
357 output_page = ei_local->tx_start_page + TX_PAGES/2;
358 ei_local->tx2 = send_length;
359 if (ei_debug && ei_local->tx1 > 0)
360 printk(KERN_DEBUG "%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n",
361 dev->name, ei_local->tx1, ei_local->lasttx, ei_local->txing);
362 }
363 else
364 {
365 if (ei_debug)
366 printk(KERN_DEBUG "%s: No Tx buffers free! tx1=%d tx2=%d last=%d\n",
367 dev->name, ei_local->tx1, ei_local->tx2, ei_local->lasttx);
368 ei_local->irqlock = 0;
369 netif_stop_queue(dev);
370 ei_outb_p(ENISR_ALL, e8390_base + EN0_IMR);
371 spin_unlock(&ei_local->page_lock);
372 enable_irq_lockdep_irqrestore(dev->irq, &flags);
373 dev->stats.tx_errors++;
374 return NETDEV_TX_BUSY;
375 }
376
377
378
379
380
381
382
383 ei_block_output(dev, send_length, data, output_page);
384
385 if (! ei_local->txing)
386 {
387 ei_local->txing = 1;
388 NS8390_trigger_send(dev, send_length, output_page);
389 dev->trans_start = jiffies;
390 if (output_page == ei_local->tx_start_page)
391 {
392 ei_local->tx1 = -1;
393 ei_local->lasttx = -1;
394 }
395 else
396 {
397 ei_local->tx2 = -1;
398 ei_local->lasttx = -2;
399 }
400 }
401 else ei_local->txqueue++;
402
403 if (ei_local->tx1 && ei_local->tx2)
404 netif_stop_queue(dev);
405 else
406 netif_start_queue(dev);
407
408
409 ei_local->irqlock = 0;
410 ei_outb_p(ENISR_ALL, e8390_base + EN0_IMR);
411
412 spin_unlock(&ei_local->page_lock);
413 enable_irq_lockdep_irqrestore(dev->irq, &flags);
414
415 dev_kfree_skb (skb);
416 dev->stats.tx_bytes += send_length;
417
418 return NETDEV_TX_OK;
419}
420
421
422
423
424
425
426
427
428
429
430
431
432
433static irqreturn_t __ei_interrupt(int irq, void *dev_id)
434{
435 struct net_device *dev = dev_id;
436 unsigned long e8390_base = dev->base_addr;
437 int interrupts, nr_serviced = 0;
438 struct ei_device *ei_local = netdev_priv(dev);
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, ei_inb_p(e8390_base + EN0_ISR),
454 ei_inb_p(e8390_base + EN0_IMR));
455#endif
456 spin_unlock(&ei_local->page_lock);
457 return IRQ_NONE;
458 }
459
460
461 ei_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 ei_inb_p(e8390_base + EN0_ISR));
465
466
467 while ((interrupts = ei_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 ei_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 dev->stats.rx_frame_errors += ei_inb_p(e8390_base + EN0_COUNTER0);
493 dev->stats.rx_crc_errors += ei_inb_p(e8390_base + EN0_COUNTER1);
494 dev->stats.rx_missed_errors+= ei_inb_p(e8390_base + EN0_COUNTER2);
495 ei_outb_p(ENISR_COUNTERS, e8390_base + EN0_ISR);
496 }
497
498
499 if (interrupts & ENISR_RDC)
500 {
501 ei_outb_p(ENISR_RDC, e8390_base + EN0_ISR);
502 }
503
504 ei_outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD);
505 }
506
507 if (interrupts && ei_debug)
508 {
509 ei_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 ei_outb_p(ENISR_ALL, e8390_base + EN0_ISR);
517 } else {
518 printk(KERN_WARNING "%s: unknown interrupt %#2x\n", dev->name, interrupts);
519 ei_outb_p(0xff, e8390_base + EN0_ISR);
520 }
521 }
522 spin_unlock(&ei_local->page_lock);
523 return IRQ_RETVAL(nr_serviced > 0);
524}
525
526#ifdef CONFIG_NET_POLL_CONTROLLER
527static void __ei_poll(struct net_device *dev)
528{
529 disable_irq(dev->irq);
530 __ei_interrupt(dev->irq, dev);
531 enable_irq(dev->irq);
532}
533#endif
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549static void ei_tx_err(struct net_device *dev)
550{
551 unsigned long e8390_base = dev->base_addr;
552
553 struct ei_device *ei_local __maybe_unused = netdev_priv(dev);
554 unsigned char txsr = ei_inb_p(e8390_base+EN0_TSR);
555 unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU);
556
557#ifdef VERBOSE_ERROR_DUMP
558 printk(KERN_DEBUG "%s: transmitter error (%#2x): ", dev->name, txsr);
559 if (txsr & ENTSR_ABT)
560 printk("excess-collisions ");
561 if (txsr & ENTSR_ND)
562 printk("non-deferral ");
563 if (txsr & ENTSR_CRS)
564 printk("lost-carrier ");
565 if (txsr & ENTSR_FU)
566 printk("FIFO-underrun ");
567 if (txsr & ENTSR_CDH)
568 printk("lost-heartbeat ");
569 printk("\n");
570#endif
571
572 ei_outb_p(ENISR_TX_ERR, e8390_base + EN0_ISR);
573
574 if (tx_was_aborted)
575 ei_tx_intr(dev);
576 else
577 {
578 dev->stats.tx_errors++;
579 if (txsr & ENTSR_CRS) dev->stats.tx_carrier_errors++;
580 if (txsr & ENTSR_CDH) dev->stats.tx_heartbeat_errors++;
581 if (txsr & ENTSR_OWC) dev->stats.tx_window_errors++;
582 }
583}
584
585
586
587
588
589
590
591
592
593static void ei_tx_intr(struct net_device *dev)
594{
595 unsigned long e8390_base = dev->base_addr;
596 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
597 int status = ei_inb(e8390_base + EN0_TSR);
598
599 ei_outb_p(ENISR_TX, e8390_base + EN0_ISR);
600
601
602
603
604
605 ei_local->txqueue--;
606
607 if (ei_local->tx1 < 0)
608 {
609 if (ei_local->lasttx != 1 && ei_local->lasttx != -1)
610 printk(KERN_ERR "%s: bogus last_tx_buffer %d, tx1=%d.\n",
611 ei_local->name, ei_local->lasttx, ei_local->tx1);
612 ei_local->tx1 = 0;
613 if (ei_local->tx2 > 0)
614 {
615 ei_local->txing = 1;
616 NS8390_trigger_send(dev, ei_local->tx2, ei_local->tx_start_page + 6);
617 dev->trans_start = jiffies;
618 ei_local->tx2 = -1,
619 ei_local->lasttx = 2;
620 }
621 else ei_local->lasttx = 20, ei_local->txing = 0;
622 }
623 else if (ei_local->tx2 < 0)
624 {
625 if (ei_local->lasttx != 2 && ei_local->lasttx != -2)
626 printk("%s: bogus last_tx_buffer %d, tx2=%d.\n",
627 ei_local->name, ei_local->lasttx, ei_local->tx2);
628 ei_local->tx2 = 0;
629 if (ei_local->tx1 > 0)
630 {
631 ei_local->txing = 1;
632 NS8390_trigger_send(dev, ei_local->tx1, ei_local->tx_start_page);
633 dev->trans_start = jiffies;
634 ei_local->tx1 = -1;
635 ei_local->lasttx = 1;
636 }
637 else
638 ei_local->lasttx = 10, ei_local->txing = 0;
639 }
640
641
642
643
644 if (status & ENTSR_COL)
645 dev->stats.collisions++;
646 if (status & ENTSR_PTX)
647 dev->stats.tx_packets++;
648 else
649 {
650 dev->stats.tx_errors++;
651 if (status & ENTSR_ABT)
652 {
653 dev->stats.tx_aborted_errors++;
654 dev->stats.collisions += 16;
655 }
656 if (status & ENTSR_CRS)
657 dev->stats.tx_carrier_errors++;
658 if (status & ENTSR_FU)
659 dev->stats.tx_fifo_errors++;
660 if (status & ENTSR_CDH)
661 dev->stats.tx_heartbeat_errors++;
662 if (status & ENTSR_OWC)
663 dev->stats.tx_window_errors++;
664 }
665 netif_wake_queue(dev);
666}
667
668
669
670
671
672
673
674
675
676static void ei_receive(struct net_device *dev)
677{
678 unsigned long e8390_base = dev->base_addr;
679 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
680 unsigned char rxing_page, this_frame, next_frame;
681 unsigned short current_offset;
682 int rx_pkt_count = 0;
683 struct e8390_pkt_hdr rx_frame;
684 int num_rx_pages = ei_local->stop_page-ei_local->rx_start_page;
685
686 while (++rx_pkt_count < 10)
687 {
688 int pkt_len, pkt_stat;
689
690
691 ei_outb_p(E8390_NODMA+E8390_PAGE1, e8390_base + E8390_CMD);
692 rxing_page = ei_inb_p(e8390_base + EN1_CURPAG);
693 ei_outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD);
694
695
696 this_frame = ei_inb_p(e8390_base + EN0_BOUNDARY) + 1;
697 if (this_frame >= ei_local->stop_page)
698 this_frame = ei_local->rx_start_page;
699
700
701
702
703
704
705
706 if (ei_debug > 0 && this_frame != ei_local->current_page && (this_frame!=0x0 || rxing_page!=0xFF))
707 printk(KERN_ERR "%s: mismatched read page pointers %2x vs %2x.\n",
708 dev->name, this_frame, ei_local->current_page);
709
710 if (this_frame == rxing_page)
711 break;
712
713 current_offset = this_frame << 8;
714 ei_get_8390_hdr(dev, &rx_frame, this_frame);
715
716 pkt_len = rx_frame.count - sizeof(struct e8390_pkt_hdr);
717 pkt_stat = rx_frame.status;
718
719 next_frame = this_frame + 1 + ((pkt_len+4)>>8);
720
721
722
723
724 if (rx_frame.next != next_frame
725 && rx_frame.next != next_frame + 1
726 && rx_frame.next != next_frame - num_rx_pages
727 && rx_frame.next != next_frame + 1 - num_rx_pages) {
728 ei_local->current_page = rxing_page;
729 ei_outb(ei_local->current_page-1, e8390_base+EN0_BOUNDARY);
730 dev->stats.rx_errors++;
731 continue;
732 }
733
734 if (pkt_len < 60 || pkt_len > 1518)
735 {
736 if (ei_debug)
737 printk(KERN_DEBUG "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n",
738 dev->name, rx_frame.count, rx_frame.status,
739 rx_frame.next);
740 dev->stats.rx_errors++;
741 dev->stats.rx_length_errors++;
742 }
743 else if ((pkt_stat & 0x0F) == ENRSR_RXOK)
744 {
745 struct sk_buff *skb;
746
747 skb = dev_alloc_skb(pkt_len+2);
748 if (skb == NULL)
749 {
750 if (ei_debug > 1)
751 printk(KERN_DEBUG "%s: Couldn't allocate a sk_buff of size %d.\n",
752 dev->name, pkt_len);
753 dev->stats.rx_dropped++;
754 break;
755 }
756 else
757 {
758 skb_reserve(skb,2);
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->stats.rx_packets++;
764 dev->stats.rx_bytes += pkt_len;
765 if (pkt_stat & ENRSR_PHY)
766 dev->stats.multicast++;
767 }
768 }
769 else
770 {
771 if (ei_debug)
772 printk(KERN_DEBUG "%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n",
773 dev->name, rx_frame.status, rx_frame.next,
774 rx_frame.count);
775 dev->stats.rx_errors++;
776
777 if (pkt_stat & ENRSR_FO)
778 dev->stats.rx_fifo_errors++;
779 }
780 next_frame = rx_frame.next;
781
782
783 if (next_frame >= ei_local->stop_page) {
784 printk("%s: next frame inconsistency, %#2x\n", dev->name,
785 next_frame);
786 next_frame = ei_local->rx_start_page;
787 }
788 ei_local->current_page = next_frame;
789 ei_outb_p(next_frame-1, e8390_base+EN0_BOUNDARY);
790 }
791
792
793
794 ei_outb_p(ENISR_RX+ENISR_RX_ERR, e8390_base+EN0_ISR);
795 return;
796}
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811static void ei_rx_overrun(struct net_device *dev)
812{
813 unsigned long e8390_base = dev->base_addr;
814 unsigned char was_txing, must_resend = 0;
815
816 struct ei_device *ei_local __maybe_unused = netdev_priv(dev);
817
818
819
820
821
822 was_txing = ei_inb_p(e8390_base+E8390_CMD) & E8390_TRANS;
823 ei_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 dev->stats.rx_over_errors++;
828
829
830
831
832
833
834
835
836 mdelay(10);
837
838
839
840
841 ei_outb_p(0x00, e8390_base+EN0_RCNTLO);
842 ei_outb_p(0x00, e8390_base+EN0_RCNTHI);
843
844
845
846
847
848
849 if (was_txing)
850 {
851 unsigned char tx_completed = ei_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 ei_outb_p(E8390_TXOFF, e8390_base + EN0_TXCR);
861 ei_outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START, e8390_base + E8390_CMD);
862
863
864
865
866 ei_receive(dev);
867 ei_outb_p(ENISR_OVER, e8390_base+EN0_ISR);
868
869
870
871
872 ei_outb_p(E8390_TXCONFIG, e8390_base + EN0_TXCR);
873 if (must_resend)
874 ei_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 *__ei_get_stats(struct net_device *dev)
882{
883 unsigned long ioaddr = dev->base_addr;
884 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
885 unsigned long flags;
886
887
888 if (!netif_running(dev))
889 return &dev->stats;
890
891 spin_lock_irqsave(&ei_local->page_lock,flags);
892
893 dev->stats.rx_frame_errors += ei_inb_p(ioaddr + EN0_COUNTER0);
894 dev->stats.rx_crc_errors += ei_inb_p(ioaddr + EN0_COUNTER1);
895 dev->stats.rx_missed_errors+= ei_inb_p(ioaddr + EN0_COUNTER2);
896 spin_unlock_irqrestore(&ei_local->page_lock, flags);
897
898 return &dev->stats;
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 unsigned long e8390_base = dev->base_addr;
938 int i;
939 struct ei_device *ei_local = (struct ei_device*)netdev_priv(dev);
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 ei_outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);
965 ei_outb_p(E8390_NODMA + E8390_PAGE1, e8390_base + E8390_CMD);
966 for(i = 0; i < 8; i++)
967 {
968 ei_outb_p(ei_local->mcfilter[i], e8390_base + EN1_MULT_SHIFT(i));
969#ifndef BUG_83C690
970 if(ei_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 ei_outb_p(E8390_NODMA + E8390_PAGE0, e8390_base + E8390_CMD);
975
976 if(dev->flags&IFF_PROMISC)
977 ei_outb_p(E8390_RXCONFIG | 0x18, e8390_base + EN0_RXCR);
978 else if(dev->flags&IFF_ALLMULTI || dev->mc_list)
979 ei_outb_p(E8390_RXCONFIG | 0x08, e8390_base + EN0_RXCR);
980 else
981 ei_outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);
982 }
983
984
985
986
987
988
989
990static void __ei_set_multicast_list(struct net_device *dev)
991{
992 unsigned long flags;
993 struct ei_device *ei_local = (struct ei_device*)netdev_priv(dev);
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
1000
1001
1002
1003
1004
1005
1006
1007
1008static void ethdev_setup(struct net_device *dev)
1009{
1010 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1011 if (ei_debug > 1)
1012 printk(version);
1013
1014 ether_setup(dev);
1015
1016 spin_lock_init(&ei_local->page_lock);
1017}
1018
1019
1020
1021
1022
1023
1024
1025static struct net_device *____alloc_ei_netdev(int size)
1026{
1027 return alloc_netdev(sizeof(struct ei_device) + size, "eth%d",
1028 ethdev_setup);
1029}
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045static void __NS8390_init(struct net_device *dev, int startp)
1046{
1047 unsigned long e8390_base = dev->base_addr;
1048 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1049 int i;
1050 int endcfg = ei_local->word16
1051 ? (0x48 | ENDCFG_WTS | (ei_local->bigendian ? ENDCFG_BOS : 0))
1052 : 0x48;
1053
1054 if(sizeof(struct e8390_pkt_hdr)!=4)
1055 panic("8390.c: header struct mispacked\n");
1056
1057 ei_outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1058 ei_outb_p(endcfg, e8390_base + EN0_DCFG);
1059
1060 ei_outb_p(0x00, e8390_base + EN0_RCNTLO);
1061 ei_outb_p(0x00, e8390_base + EN0_RCNTHI);
1062
1063 ei_outb_p(E8390_RXOFF, e8390_base + EN0_RXCR);
1064 ei_outb_p(E8390_TXOFF, e8390_base + EN0_TXCR);
1065
1066 ei_outb_p(ei_local->tx_start_page, e8390_base + EN0_TPSR);
1067 ei_local->tx1 = ei_local->tx2 = 0;
1068 ei_outb_p(ei_local->rx_start_page, e8390_base + EN0_STARTPG);
1069 ei_outb_p(ei_local->stop_page-1, e8390_base + EN0_BOUNDARY);
1070 ei_local->current_page = ei_local->rx_start_page;
1071 ei_outb_p(ei_local->stop_page, e8390_base + EN0_STOPPG);
1072
1073 ei_outb_p(0xFF, e8390_base + EN0_ISR);
1074 ei_outb_p(0x00, e8390_base + EN0_IMR);
1075
1076
1077
1078 ei_outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP, e8390_base+E8390_CMD);
1079 for(i = 0; i < 6; i++)
1080 {
1081 ei_outb_p(dev->dev_addr[i], e8390_base + EN1_PHYS_SHIFT(i));
1082 if (ei_debug > 1 && ei_inb_p(e8390_base + EN1_PHYS_SHIFT(i))!=dev->dev_addr[i])
1083 printk(KERN_ERR "Hw. address read/write mismap %d\n",i);
1084 }
1085
1086 ei_outb_p(ei_local->rx_start_page, e8390_base + EN1_CURPAG);
1087 ei_outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1088
1089 netif_start_queue(dev);
1090 ei_local->tx1 = ei_local->tx2 = 0;
1091 ei_local->txing = 0;
1092
1093 if (startp)
1094 {
1095 ei_outb_p(0xff, e8390_base + EN0_ISR);
1096 ei_outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1097 ei_outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base+E8390_CMD);
1098 ei_outb_p(E8390_TXCONFIG, e8390_base + EN0_TXCR);
1099
1100 ei_outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);
1101 do_set_multicast_list(dev);
1102 }
1103}
1104
1105
1106
1107
1108static void NS8390_trigger_send(struct net_device *dev, unsigned int length,
1109 int start_page)
1110{
1111 unsigned long e8390_base = dev->base_addr;
1112 struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) netdev_priv(dev);
1113
1114 ei_outb_p(E8390_NODMA+E8390_PAGE0, e8390_base+E8390_CMD);
1115
1116 if (ei_inb_p(e8390_base + E8390_CMD) & E8390_TRANS)
1117 {
1118 printk(KERN_WARNING "%s: trigger_send() called with the transmitter busy.\n",
1119 dev->name);
1120 return;
1121 }
1122 ei_outb_p(length & 0xff, e8390_base + EN0_TCNTLO);
1123 ei_outb_p(length >> 8, e8390_base + EN0_TCNTHI);
1124 ei_outb_p(start_page, e8390_base + EN0_TPSR);
1125 ei_outb_p(E8390_NODMA+E8390_TRANS+E8390_START, e8390_base+E8390_CMD);
1126}
1127