This source file includes following definitions.
- ei_open
- ei_start_xmit
- ei_interrupt
- ei_tx_intr
- ei_receive
- ei_rx_overrun
- get_stats
- set_multicast_list
- ethdev_init
- NS8390_init
- NS8390_trigger_send
- init_module
- cleanup_module
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 static char *version =
26 "8390.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
27
28
29
30
31
32
33
34
35
36
37 #ifdef MODULE
38 #include <linux/module.h>
39 #include <linux/version.h>
40 #endif
41
42 #include <linux/kernel.h>
43 #include <linux/sched.h>
44 #include <linux/fs.h>
45 #include <linux/types.h>
46 #include <linux/ptrace.h>
47 #include <linux/string.h>
48 #include <asm/system.h>
49 #include <asm/segment.h>
50 #include <asm/bitops.h>
51 #include <asm/io.h>
52 #include <linux/errno.h>
53 #include <linux/fcntl.h>
54 #include <linux/in.h>
55 #include <linux/interrupt.h>
56
57 #include <linux/netdevice.h>
58 #include <linux/etherdevice.h>
59 #include <linux/skbuff.h>
60
61 #include "8390.h"
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 #define ei_reset_8390 (ei_local->reset_8390)
80 #define ei_block_output (ei_local->block_output)
81 #define ei_block_input (ei_local->block_input)
82
83
84 #ifdef EI_DEBUG
85 int ei_debug = EI_DEBUG;
86 #else
87 int ei_debug = 1;
88 #endif
89
90
91
92 static int high_water_mark = 0;
93
94
95 static void ei_tx_intr(struct device *dev);
96 static void ei_receive(struct device *dev);
97 static void ei_rx_overrun(struct device *dev);
98
99
100 static void NS8390_trigger_send(struct device *dev, unsigned int length,
101 int start_page);
102 #ifdef HAVE_MULTICAST
103 static void set_multicast_list(struct device *dev, int num_addrs, void *addrs);
104 #endif
105
106
107
108
109
110
111 int ei_open(struct device *dev)
112 {
113 struct ei_device *ei_local = (struct ei_device *) dev->priv;
114
115 if ( ! ei_local) {
116 printk("%s: Opening a non-existent physical device\n", dev->name);
117 return ENXIO;
118 }
119
120 irq2dev_map[dev->irq] = dev;
121 NS8390_init(dev, 1);
122 dev->start = 1;
123 ei_local->irqlock = 0;
124 return 0;
125 }
126
127 static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
128 {
129 int e8390_base = dev->base_addr;
130 struct ei_device *ei_local = (struct ei_device *) dev->priv;
131 int length, send_length;
132 unsigned long flags;
133
134
135
136
137
138
139
140 if (dev->tbusy) {
141 int txsr = inb(e8390_base+EN0_TSR), isr;
142 int tickssofar = jiffies - dev->trans_start;
143 if (tickssofar < TX_TIMEOUT || (tickssofar < (TX_TIMEOUT+5) && ! (txsr & ENTSR_PTX))) {
144 return 1;
145 }
146 isr = inb(e8390_base+EN0_ISR);
147 if (dev->start == 0) {
148 printk("%s: xmit on stopped card\n", dev->name);
149 return 1;
150 }
151 printk(KERN_DEBUG "%s: transmit timed out, TX status %#2x, ISR %#2x.\n",
152 dev->name, txsr, isr);
153
154 if (isr)
155 printk(KERN_DEBUG "%s: Possible IRQ conflict on IRQ%d?\n", dev->name, dev->irq);
156 else {
157
158 printk(KERN_DEBUG "%s: Possible network cable problem?\n", dev->name);
159 if(ei_local->stat.tx_packets==0)
160 ei_local->interface_num ^= 1;
161 }
162
163 ei_reset_8390(dev);
164 NS8390_init(dev, 1);
165 dev->trans_start = jiffies;
166 }
167
168
169
170
171 if (skb == NULL) {
172 dev_tint(dev);
173 return 0;
174 }
175
176 length = skb->len;
177 if (skb->len <= 0)
178 return 0;
179
180 save_flags(flags);
181 cli();
182
183
184 if ((set_bit(0, (void*)&dev->tbusy) != 0) || ei_local->irqlock) {
185 printk("%s: Tx access conflict. irq=%d lock=%d tx1=%d tx2=%d last=%d\n",
186 dev->name, dev->interrupt, ei_local->irqlock, ei_local->tx1,
187 ei_local->tx2, ei_local->lasttx);
188 restore_flags(flags);
189 return 1;
190 }
191
192
193 outb(0x00, e8390_base + EN0_IMR);
194 ei_local->irqlock = 1;
195 restore_flags(flags);
196
197 send_length = ETH_ZLEN < length ? length : ETH_ZLEN;
198
199 if (ei_local->pingpong) {
200 int output_page;
201 if (ei_local->tx1 == 0) {
202 output_page = ei_local->tx_start_page;
203 ei_local->tx1 = send_length;
204 if (ei_debug && ei_local->tx2 > 0)
205 printk("%s: idle transmitter tx2=%d, lasttx=%d, txing=%d.\n",
206 dev->name, ei_local->tx2, ei_local->lasttx,
207 ei_local->txing);
208 } else if (ei_local->tx2 == 0) {
209 output_page = ei_local->tx_start_page + 6;
210 ei_local->tx2 = send_length;
211 if (ei_debug && ei_local->tx1 > 0)
212 printk("%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n",
213 dev->name, ei_local->tx1, ei_local->lasttx,
214 ei_local->txing);
215 } else {
216 if (ei_debug)
217 printk("%s: No Tx buffers free. irq=%d tx1=%d tx2=%d last=%d\n",
218 dev->name, dev->interrupt, ei_local->tx1,
219 ei_local->tx2, ei_local->lasttx);
220 ei_local->irqlock = 0;
221 dev->tbusy = 1;
222 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
223 return 1;
224 }
225 ei_block_output(dev, length, skb->data, output_page);
226 if (! ei_local->txing) {
227 ei_local->txing = 1;
228 NS8390_trigger_send(dev, send_length, output_page);
229 dev->trans_start = jiffies;
230 if (output_page == ei_local->tx_start_page)
231 ei_local->tx1 = -1, ei_local->lasttx = -1;
232 else
233 ei_local->tx2 = -1, ei_local->lasttx = -2;
234 } else
235 ei_local->txqueue++;
236
237 dev->tbusy = (ei_local->tx1 && ei_local->tx2);
238 } else {
239 ei_block_output(dev, length, skb->data, ei_local->tx_start_page);
240 ei_local->txing = 1;
241 NS8390_trigger_send(dev, send_length, ei_local->tx_start_page);
242 dev->trans_start = jiffies;
243 dev->tbusy = 1;
244 }
245
246
247 ei_local->irqlock = 0;
248 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
249
250 dev_kfree_skb (skb, FREE_WRITE);
251
252 return 0;
253 }
254
255
256
257 void ei_interrupt(int irq, struct pt_regs * regs)
258 {
259 struct device *dev = (struct device *)(irq2dev_map[irq]);
260 int e8390_base;
261 int interrupts, nr_serviced = 0;
262 struct ei_device *ei_local;
263
264 if (dev == NULL) {
265 printk ("net_interrupt(): irq %d for unknown device.\n", irq);
266 return;
267 }
268 e8390_base = dev->base_addr;
269 ei_local = (struct ei_device *) dev->priv;
270 if (dev->interrupt || ei_local->irqlock) {
271
272 printk(ei_local->irqlock
273 ? "%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.\n"
274 : "%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.\n",
275 dev->name, inb_p(e8390_base + EN0_ISR),
276 inb_p(e8390_base + EN0_IMR));
277 return;
278 }
279
280 dev->interrupt = 1;
281
282
283 outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD);
284 if (ei_debug > 3)
285 printk("%s: interrupt(isr=%#2.2x).\n", dev->name,
286 inb_p(e8390_base + EN0_ISR));
287
288
289 while ((interrupts = inb_p(e8390_base + EN0_ISR)) != 0
290 && ++nr_serviced < MAX_SERVICE) {
291 if (dev->start == 0) {
292 printk("%s: interrupt from stopped card\n", dev->name);
293 interrupts = 0;
294 break;
295 }
296 if (interrupts & ENISR_OVER) {
297 ei_rx_overrun(dev);
298 } else if (interrupts & (ENISR_RX+ENISR_RX_ERR)) {
299
300 ei_receive(dev);
301 }
302
303 if (interrupts & ENISR_TX) {
304 ei_tx_intr(dev);
305 } else if (interrupts & ENISR_COUNTERS) {
306 ei_local->stat.rx_frame_errors += inb_p(e8390_base + EN0_COUNTER0);
307 ei_local->stat.rx_crc_errors += inb_p(e8390_base + EN0_COUNTER1);
308 ei_local->stat.rx_missed_errors+= inb_p(e8390_base + EN0_COUNTER2);
309 outb_p(ENISR_COUNTERS, e8390_base + EN0_ISR);
310 }
311
312
313 if (interrupts & ENISR_TX_ERR) {
314 outb_p(ENISR_TX_ERR, e8390_base + EN0_ISR);
315 }
316
317 if (interrupts & ENISR_RDC) {
318 if (dev->mem_start)
319 outb_p(ENISR_RDC, e8390_base + EN0_ISR);
320 }
321
322 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD);
323 }
324
325 if ((interrupts & ~ENISR_RDC) && ei_debug) {
326 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD);
327 if (nr_serviced == MAX_SERVICE) {
328 printk("%s: Too much work at interrupt, status %#2.2x\n",
329 dev->name, interrupts);
330 outb_p(ENISR_ALL, e8390_base + EN0_ISR);
331 } else {
332 printk("%s: unknown interrupt %#2x\n", dev->name, interrupts);
333 outb_p(0xff, e8390_base + EN0_ISR);
334 }
335 }
336 dev->interrupt = 0;
337 return;
338 }
339
340
341
342 static void ei_tx_intr(struct device *dev)
343 {
344 int e8390_base = dev->base_addr;
345 int status = inb(e8390_base + EN0_TSR);
346 struct ei_device *ei_local = (struct ei_device *) dev->priv;
347
348 outb_p(ENISR_TX, e8390_base + EN0_ISR);
349
350 if (ei_local->pingpong) {
351 ei_local->txqueue--;
352 if (ei_local->tx1 < 0) {
353 if (ei_local->lasttx != 1 && ei_local->lasttx != -1)
354 printk("%s: bogus last_tx_buffer %d, tx1=%d.\n",
355 ei_local->name, ei_local->lasttx, ei_local->tx1);
356 ei_local->tx1 = 0;
357 dev->tbusy = 0;
358 if (ei_local->tx2 > 0) {
359 ei_local->txing = 1;
360 NS8390_trigger_send(dev, ei_local->tx2, ei_local->tx_start_page + 6);
361 dev->trans_start = jiffies;
362 ei_local->tx2 = -1,
363 ei_local->lasttx = 2;
364 } else
365 ei_local->lasttx = 20, ei_local->txing = 0;
366 } else if (ei_local->tx2 < 0) {
367 if (ei_local->lasttx != 2 && ei_local->lasttx != -2)
368 printk("%s: bogus last_tx_buffer %d, tx2=%d.\n",
369 ei_local->name, ei_local->lasttx, ei_local->tx2);
370 ei_local->tx2 = 0;
371 dev->tbusy = 0;
372 if (ei_local->tx1 > 0) {
373 ei_local->txing = 1;
374 NS8390_trigger_send(dev, ei_local->tx1, ei_local->tx_start_page);
375 dev->trans_start = jiffies;
376 ei_local->tx1 = -1;
377 ei_local->lasttx = 1;
378 } else
379 ei_local->lasttx = 10, ei_local->txing = 0;
380 } else
381 printk("%s: unexpected TX-done interrupt, lasttx=%d.\n",
382 dev->name, ei_local->lasttx);
383 } else {
384 ei_local->txing = 0;
385 dev->tbusy = 0;
386 }
387
388
389 if (status & ENTSR_COL) ei_local->stat.collisions++;
390 if (status & ENTSR_PTX)
391 ei_local->stat.tx_packets++;
392 else {
393 ei_local->stat.tx_errors++;
394 if (status & ENTSR_ABT) ei_local->stat.tx_aborted_errors++;
395 if (status & ENTSR_CRS) ei_local->stat.tx_carrier_errors++;
396 if (status & ENTSR_FU) ei_local->stat.tx_fifo_errors++;
397 if (status & ENTSR_CDH) ei_local->stat.tx_heartbeat_errors++;
398 if (status & ENTSR_OWC) ei_local->stat.tx_window_errors++;
399 }
400
401 mark_bh (NET_BH);
402 }
403
404
405
406 static void ei_receive(struct device *dev)
407 {
408 int e8390_base = dev->base_addr;
409 struct ei_device *ei_local = (struct ei_device *) dev->priv;
410 int rxing_page, this_frame, next_frame, current_offset;
411 int rx_pkt_count = 0;
412 struct e8390_pkt_hdr rx_frame;
413 int num_rx_pages = ei_local->stop_page-ei_local->rx_start_page;
414
415 while (++rx_pkt_count < 10) {
416 int pkt_len;
417
418
419 outb_p(E8390_NODMA+E8390_PAGE1, e8390_base + E8390_CMD);
420 rxing_page = inb_p(e8390_base + EN1_CURPAG);
421 outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD);
422
423
424 this_frame = inb_p(e8390_base + EN0_BOUNDARY) + 1;
425 if (this_frame >= ei_local->stop_page)
426 this_frame = ei_local->rx_start_page;
427
428
429
430 if (ei_debug > 0 && this_frame != ei_local->current_page)
431 printk("%s: mismatched read page pointers %2x vs %2x.\n",
432 dev->name, this_frame, ei_local->current_page);
433
434 if (this_frame == rxing_page)
435 break;
436
437 current_offset = this_frame << 8;
438 ei_block_input(dev, sizeof(rx_frame), (char *)&rx_frame,
439 current_offset);
440
441 pkt_len = rx_frame.count - sizeof(rx_frame);
442
443 next_frame = this_frame + 1 + ((pkt_len+4)>>8);
444
445
446
447
448 if (rx_frame.next != next_frame
449 && rx_frame.next != next_frame + 1
450 && rx_frame.next != next_frame - num_rx_pages
451 && rx_frame.next != next_frame + 1 - num_rx_pages) {
452 ei_local->current_page = rxing_page;
453 outb(ei_local->current_page-1, e8390_base+EN0_BOUNDARY);
454 ei_local->stat.rx_errors++;
455 continue;
456 }
457
458 if (pkt_len < 60 || pkt_len > 1518) {
459 if (ei_debug)
460 printk("%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n",
461 dev->name, rx_frame.count, rx_frame.status,
462 rx_frame.next);
463 ei_local->stat.rx_errors++;
464 } else if ((rx_frame.status & 0x0F) == ENRSR_RXOK) {
465 struct sk_buff *skb;
466
467 skb = alloc_skb(pkt_len, GFP_ATOMIC);
468 if (skb == NULL) {
469 if (ei_debug > 1)
470 printk("%s: Couldn't allocate a sk_buff of size %d.\n",
471 dev->name, pkt_len);
472 ei_local->stat.rx_dropped++;
473 break;
474 } else {
475 skb->len = pkt_len;
476 skb->dev = dev;
477
478 ei_block_input(dev, pkt_len, (char *) skb->data,
479 current_offset + sizeof(rx_frame));
480 netif_rx(skb);
481 ei_local->stat.rx_packets++;
482 }
483 } else {
484 int errs = rx_frame.status;
485 if (ei_debug)
486 printk("%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n",
487 dev->name, rx_frame.status, rx_frame.next,
488 rx_frame.count);
489 if (errs & ENRSR_FO)
490 ei_local->stat.rx_fifo_errors++;
491 }
492 next_frame = rx_frame.next;
493
494
495 if (next_frame >= ei_local->stop_page) {
496 printk("%s: next frame inconsistency, %#2x\n", dev->name,
497 next_frame);
498 next_frame = ei_local->rx_start_page;
499 }
500 ei_local->current_page = next_frame;
501 outb_p(next_frame-1, e8390_base+EN0_BOUNDARY);
502 }
503
504
505
506
507
508 if (rx_pkt_count > high_water_mark)
509 high_water_mark = rx_pkt_count;
510
511
512 outb_p(ENISR_RX+ENISR_RX_ERR+ENISR_OVER, e8390_base+EN0_ISR);
513 return;
514 }
515
516
517
518 static void ei_rx_overrun(struct device *dev)
519 {
520 int e8390_base = dev->base_addr;
521 int reset_start_time = jiffies;
522 struct ei_device *ei_local = (struct ei_device *) dev->priv;
523
524
525 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
526
527 if (ei_debug > 1)
528 printk("%s: Receiver overrun.\n", dev->name);
529 ei_local->stat.rx_over_errors++;
530
531
532
533
534
535
536
537
538 while ((inb_p(e8390_base+EN0_ISR) & ENISR_RESET) == 0)
539 if (jiffies - reset_start_time > 1) {
540 printk("%s: reset did not complete at ei_rx_overrun.\n",
541 dev->name);
542 NS8390_init(dev, 1);
543 return;
544 }
545
546
547 ei_receive(dev);
548
549 outb_p(0xff, e8390_base+EN0_ISR);
550
551 outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START, e8390_base + E8390_CMD);
552 outb_p(E8390_TXCONFIG, e8390_base + EN0_TXCR);
553 }
554
555 static struct enet_statistics *get_stats(struct device *dev)
556 {
557 short ioaddr = dev->base_addr;
558 struct ei_device *ei_local = (struct ei_device *) dev->priv;
559
560
561 if (dev->start == 0) return &ei_local->stat;
562
563
564 ei_local->stat.rx_frame_errors += inb_p(ioaddr + EN0_COUNTER0);
565 ei_local->stat.rx_crc_errors += inb_p(ioaddr + EN0_COUNTER1);
566 ei_local->stat.rx_missed_errors+= inb_p(ioaddr + EN0_COUNTER2);
567
568 return &ei_local->stat;
569 }
570
571 #ifdef HAVE_MULTICAST
572
573
574
575
576
577
578 static void set_multicast_list(struct device *dev, int num_addrs, void *addrs)
579 {
580 short ioaddr = dev->base_addr;
581
582 if (num_addrs > 0) {
583
584
585 outb_p(E8390_RXCONFIG | 0x08, ioaddr + EN0_RXCR);
586 } else if (num_addrs < 0)
587 outb_p(E8390_RXCONFIG | 0x18, ioaddr + EN0_RXCR);
588 else
589 outb_p(E8390_RXCONFIG, ioaddr + EN0_RXCR);
590 }
591 #endif
592
593
594 int ethdev_init(struct device *dev)
595 {
596 if (ei_debug > 1)
597 printk(version);
598
599 if (dev->priv == NULL) {
600 struct ei_device *ei_local;
601
602 dev->priv = kmalloc(sizeof(struct ei_device), GFP_KERNEL);
603 memset(dev->priv, 0, sizeof(struct ei_device));
604 ei_local = (struct ei_device *)dev->priv;
605 #ifndef NO_PINGPONG
606 ei_local->pingpong = 1;
607 #endif
608 }
609
610
611 if (dev->open == NULL)
612 dev->open = &ei_open;
613
614 dev->hard_start_xmit = &ei_start_xmit;
615 dev->get_stats = get_stats;
616 #ifdef HAVE_MULTICAST
617 dev->set_multicast_list = &set_multicast_list;
618 #endif
619
620 ether_setup(dev);
621
622 return 0;
623 }
624
625
626
627
628 void NS8390_init(struct device *dev, int startp)
629 {
630 int e8390_base = dev->base_addr;
631 struct ei_device *ei_local = (struct ei_device *) dev->priv;
632 int i;
633 int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS) : 0x48;
634 unsigned long flags;
635
636
637 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base);
638 outb_p(endcfg, e8390_base + EN0_DCFG);
639
640 outb_p(0x00, e8390_base + EN0_RCNTLO);
641 outb_p(0x00, e8390_base + EN0_RCNTHI);
642
643 outb_p(E8390_RXOFF, e8390_base + EN0_RXCR);
644 outb_p(E8390_TXOFF, e8390_base + EN0_TXCR);
645
646 outb_p(ei_local->tx_start_page, e8390_base + EN0_TPSR);
647 ei_local->tx1 = ei_local->tx2 = 0;
648 outb_p(ei_local->rx_start_page, e8390_base + EN0_STARTPG);
649 outb_p(ei_local->stop_page-1, e8390_base + EN0_BOUNDARY);
650 ei_local->current_page = ei_local->rx_start_page;
651 outb_p(ei_local->stop_page, e8390_base + EN0_STOPPG);
652
653 outb_p(0xFF, e8390_base + EN0_ISR);
654 outb_p(0x00, e8390_base + EN0_IMR);
655
656
657
658 save_flags(flags);
659 cli();
660 outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP, e8390_base);
661 for(i = 0; i < 6; i++) {
662 outb_p(dev->dev_addr[i], e8390_base + EN1_PHYS + i);
663 }
664
665
666 for(i = 0; i < 8; i++)
667 outb_p(0xff, e8390_base + EN1_MULT + i);
668
669 outb_p(ei_local->rx_start_page, e8390_base + EN1_CURPAG);
670 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base);
671 restore_flags(flags);
672 dev->tbusy = 0;
673 dev->interrupt = 0;
674 ei_local->tx1 = ei_local->tx2 = 0;
675 ei_local->txing = 0;
676 if (startp) {
677 outb_p(0xff, e8390_base + EN0_ISR);
678 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
679 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base);
680 outb_p(E8390_TXCONFIG, e8390_base + EN0_TXCR);
681
682 outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);
683 }
684 return;
685 }
686
687
688 static void NS8390_trigger_send(struct device *dev, unsigned int length,
689 int start_page)
690 {
691 int e8390_base = dev->base_addr;
692
693 outb_p(E8390_NODMA+E8390_PAGE0, e8390_base);
694
695 if (inb_p(e8390_base) & E8390_TRANS) {
696 printk("%s: trigger_send() called with the transmitter busy.\n",
697 dev->name);
698 return;
699 }
700 outb_p(length & 0xff, e8390_base + EN0_TCNTLO);
701 outb_p(length >> 8, e8390_base + EN0_TCNTHI);
702 outb_p(start_page, e8390_base + EN0_TPSR);
703 outb_p(E8390_NODMA+E8390_TRANS+E8390_START, e8390_base);
704 return;
705 }
706
707 #ifdef MODULE
708 char kernel_version[] = UTS_RELEASE;
709
710 int init_module(void)
711 {
712 return 0;
713 }
714
715 void
716 cleanup_module(void)
717 {
718 }
719 #endif
720
721
722
723
724
725
726
727
728
729