This source file includes following definitions.
- d_link_read_status
- d_link_read_byte
- d_link_open
- d_link_close
- d_link_start_xmit
- d_link_interrupt
- d_link_tx_intr
- d_link_rx_intr
- d_link_init
- adapter_init
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 static char *version =
54 "d_link.c: $Revision: 0.21 $, Bjorn Ekwall (bj0rn@blox.se)\n";
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 #include <linux/config.h>
81 #include <linux/kernel.h>
82 #include <linux/sched.h>
83 #include <linux/types.h>
84 #include <linux/fcntl.h>
85 #include <linux/string.h>
86 #include <linux/interrupt.h>
87 #include <asm/io.h>
88 #include <netinet/in.h>
89 #include <linux/ptrace.h>
90 #include <asm/system.h>
91 #include <errno.h>
92
93 #include "inet.h"
94 #include "dev.h"
95 #include "eth.h"
96 #include "timer.h"
97 #include "ip.h"
98 #include "route.h"
99 #include "protocol.h"
100 #include "tcp.h"
101 #include "skbuff.h"
102 #include "sock.h"
103 #include "arp.h"
104
105
106
107 #ifndef D_LINK_DEBUG
108 #define D_LINK_DEBUG 0
109 #endif
110 static unsigned int d_link_debug = D_LINK_DEBUG;
111
112 #ifdef D_LINK_DEBUG
113 #define PRINTK(x) if (d_link_debug >= 2) printk x
114 #else
115 #define PRINTK(x)
116 #endif
117
118
119
120
121
122
123
124
125
126 #define DATA_PORT (dev->base_addr + 0)
127 #define STATUS_PORT (dev->base_addr + 1)
128 #define COMMAND_PORT (dev->base_addr + 2)
129
130
131
132
133 #define SELECT_NIC 0x04
134 #define SELECT_PRN 0x1c
135 #define NML_PRN 0xec
136 #define IRQEN 0x10
137
138
139
140
141 #define TX_INTR 0x88
142 #define RX_INTR 0x40
143
144 #define OTHER_INTR 0x00
145
146
147
148
149
150
151
152 #define WRITE_DATA 0x00
153 #define READ_DATA 0x01
154 #define STATUS 0x02
155 #define COMMAND 0x03
156 #define NULL_COMMAND 0x04
157 #define RX_LEN 0x05
158 #define TX_ADDR 0x06
159 #define RW_ADDR 0x07
160 #define HI_NIBBLE 0x08
161
162
163
164
165
166
167 #define RX_ALL 0x01
168 #define RX_BP 0x02
169 #define RX_MBP 0x03
170
171 #define TX_ENABLE 0x04
172 #define RX_ENABLE 0x08
173
174 #define RESET 0x80
175 #define STOP_RESET 0x00
176
177
178
179
180
181 #define RX_PAGE2_SELECT 0x10
182 #define RX_BASE_PAGE 0x20
183 #define FLIP_IRQ 0x40
184
185
186 #define TX_PAGE2_SELECT 0x02
187
188
189
190
191
192
193
194
195
196
197
198
199 #define MEM_2K 0x0800
200 #define MEM_4K 0x1000
201 #define NODE_ADDRESS 0x2000
202
203 #define RUNT 64
204
205
206
207
208
209
210
211
212 struct netstats {
213 int tx_packets;
214 int rx_packets;
215 int tx_errors;
216 int rx_errors;
217 int missed_packets;
218 int soft_tx_errors;
219 int soft_rx_errors;
220 int soft_trx_err_bits;
221 };
222 static struct netstats *localstats;
223
224
225
226
227
228
229 static int d_link_read_status(struct device *dev);
230 static unsigned char d_link_read_byte(int type, struct device *dev);
231
232
233 static int d_link_open(struct device *dev);
234 static int d_link_close(struct device *dev);
235 static int d_link_start_xmit(struct sk_buff *skb, struct device *dev);
236
237
238 static void d_link_interrupt(int reg_ptr);
239 static void d_link_tx_intr(struct device *dev);
240 static void d_link_rx_intr(struct device *dev);
241
242
243 int d_link_init(struct device *dev);
244 static void adapter_init(struct device *dev, int startp);
245
246
247 static struct sigaction d_link_sigaction = {
248 &d_link_interrupt,
249 0,
250 0,
251 NULL,
252 };
253
254
255
256
257 static volatile int rx_page = 0;
258 static struct device *realdev;
259 #ifdef D_LINK_FIFO
260 static volatile int free_tx_page = 0x03;
261 static volatile unsigned int busy_tx_page = 0x00;
262 static volatile int transmit_next_from;
263 #endif
264
265
266
267
268
269
270
271
272 #define select_prn() \
273 outb_p(SELECT_PRN, COMMAND_PORT)
274
275 #define select_nic() \
276 outb_p(SELECT_NIC, COMMAND_PORT)
277
278 #define d_link_put_byte(data) \
279 outb_p(((data) << 4) | WRITE_DATA , DATA_PORT); \
280 outb_p(((data) & 0xf0) | WRITE_DATA | HI_NIBBLE, DATA_PORT)
281
282
283
284
285
286 #define d_link_put_command(cmd) \
287 outb_p(( rx_page << 4) | COMMAND , DATA_PORT); \
288 outb_p(( rx_page & 0xf0) | COMMAND | HI_NIBBLE, DATA_PORT); \
289 outb_p(((rx_page | cmd) << 4) | COMMAND , DATA_PORT); \
290 outb_p(((rx_page | cmd) & 0xf0) | COMMAND | HI_NIBBLE, DATA_PORT)
291
292 #define d_link_setup_address(addr,type) \
293 outb_p((((addr) << 4) & 0xf0) | type , DATA_PORT); \
294 outb_p(( (addr) & 0xf0) | type | HI_NIBBLE, DATA_PORT); \
295 outb_p((((addr) >> 4) & 0xf0) | type , DATA_PORT); \
296 outb_p((((addr) >> 8) & 0xf0) | type | HI_NIBBLE, DATA_PORT)
297
298 static int
299 d_link_read_status(struct device *dev)
300 {
301 int status;
302
303 select_nic();
304 outb_p(STATUS, DATA_PORT);
305 SLOW_DOWN_IO;
306 status = inb_p(STATUS_PORT);
307 outb_p(NULL_COMMAND, DATA_PORT);
308 outb_p(NULL_COMMAND | HI_NIBBLE, DATA_PORT);
309
310 return status;
311 }
312
313 static unsigned char
314 d_link_read_byte(int type, struct device *dev) {
315 unsigned char lo;
316
317 outb_p((type), DATA_PORT);
318 SLOW_DOWN_IO;
319 lo = inb_p(STATUS_PORT);
320 outb_p((type) | HI_NIBBLE, DATA_PORT);
321 SLOW_DOWN_IO;
322 return ((lo & 0xf0) >> 4) | (inb_p(STATUS_PORT) & 0xf0);
323 }
324
325 #ifdef D_LINK_FIFO
326
327 # define AT_FIFO_OUTPUT (busy_tx_page & 0x0f)
328 # define ANY_QUEUED_IN_FIFO (busy_tx_page & 0xf0)
329
330 # define PULL_FROM_FIFO { busy_tx_page >>= 4;}
331 # define PUSH_INTO_FIFO(page) { \
332 if (busy_tx_page) \
333 busy_tx_page |= (page << 4); \
334 else \
335 busy_tx_page = page; \
336 }
337 #endif
338
339
340
341
342
343
344
345
346
347 static int
348 d_link_open(struct device *dev)
349 {
350 adapter_init(dev, 1);
351 dev->tbusy = 0;
352 dev->interrupt = 0;
353 dev->start = 1;
354 return 0;
355 }
356
357
358
359
360 static int
361 d_link_close(struct device *dev)
362 {
363 dev->start = 0;
364
365 adapter_init(dev, 0);
366
367 irqaction(dev->irq, NULL);
368
369 return 0;
370 }
371
372
373
374
375
376 static int
377 d_link_start_xmit(struct sk_buff *skb, struct device *dev)
378 {
379 static int tx_page = 0;
380 int transmit_from;
381 int len;
382 int tickssofar;
383 unsigned char *buffer = (unsigned char *)(skb + 1);
384
385
386
387
388
389
390
391 if (skb == NULL) {
392 dev_tint(dev);
393 return 0;
394 }
395
396
397 if (!skb->arp && dev->rebuild_header(skb + 1, dev)) {
398 skb->dev = dev;
399 arp_queue (skb);
400 return 0;
401 }
402
403 #ifdef D_LINK_FIFO
404 if (free_tx_page == 0) {
405 #else
406 if (dev->tbusy) {
407 #endif
408 tickssofar = jiffies - dev->trans_start;
409
410 if (tickssofar < 5) {
411 return 1;
412 }
413
414
415 printk("%s: transmit timed out (%d), %s?\n",
416 dev->name,
417 tickssofar,
418 "network cable problem"
419 );
420
421
422
423
424 }
425
426
427 PRINTK(("d_link_start_xmit:len=%d\n", skb->len));
428 cli();
429 select_nic();
430
431 #ifdef D_LINK_FIFO
432
433 tx_page = free_tx_page & (-free_tx_page);
434
435 free_tx_page &= ~tx_page;
436 dev->tbusy = !free_tx_page;
437
438 PUSH_INTO_FIFO(tx_page);
439 #else
440 tx_page ^= TX_PAGE2_SELECT;
441 #endif
442
443 if ((len = skb->len) < RUNT)
444 len = RUNT;
445
446 if (tx_page & TX_PAGE2_SELECT)
447 transmit_from = MEM_4K - len;
448 else
449 transmit_from = MEM_2K - len;
450
451 d_link_setup_address(transmit_from, RW_ADDR);
452
453 for ( ; len > 0; --len, ++buffer) {
454 d_link_put_byte(*buffer);
455 }
456
457 #ifdef D_LINK_FIFO
458 if (ANY_QUEUED_IN_FIFO == 0) {
459 d_link_setup_address(transmit_from, TX_ADDR);
460 d_link_put_command(TX_ENABLE);
461 dev->trans_start = jiffies;
462 } else {
463 transmit_next_from = transmit_from;
464 }
465 #else
466 d_link_setup_address(transmit_from, TX_ADDR);
467 d_link_put_command(TX_ENABLE);
468 dev->trans_start = jiffies;
469 #endif
470
471 sti();
472
473 if (skb->free) {
474 kfree_skb (skb, FREE_WRITE);
475 }
476
477 return 0;
478 }
479
480
481
482
483
484 static void
485 d_link_interrupt(int reg_ptr)
486 {
487 int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
488 struct device *dev = realdev;
489 int interrupts;
490
491
492
493
494
495
496
497
498 if (dev == NULL) {
499 printk ("d_link_interrupt(): irq %d for unknown device.\n", irq);
500 return;
501 }
502
503 if (dev->start == 0) {
504 return;
505 }
506
507 cli();
508 dev->interrupt = 1;
509 sti();
510
511 localstats = (struct netstats*) dev->private;
512
513 interrupts = d_link_read_status(dev);
514
515 PRINTK(("d_link_interrupt (%2.2X)\n", interrupts));
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532 if (interrupts & TX_INTR) {
533 d_link_tx_intr(dev);
534 }
535
536 if (interrupts & RX_INTR) {
537 d_link_rx_intr(dev);
538 }
539
540
541 if (d_link_debug && (interrupts & OTHER_INTR)) {
542 printk("%s: unknown interrupt %#2x\n", dev->name, interrupts);
543 }
544
545
546 if ( (interrupts != 0x47) &&
547 (interrupts != 0x87) &&
548 (interrupts != 0x4F) &&
549 (interrupts != 0x8F)
550 )
551 printk("Strange d_link_interrupt: <%2.2X>\n", interrupts);
552
553 cli();
554 dev->interrupt = 0;
555
556
557 select_prn();
558 return;
559 }
560
561
562
563
564
565 static void
566 d_link_tx_intr(struct device *dev)
567 {
568 localstats->tx_packets++;
569
570 cli();
571 dev->tbusy = 0;
572
573 #ifdef D_LINK_FIFO
574 free_tx_page |= AT_FIFO_OUTPUT;
575 PULL_FROM_FIFO;
576
577 if (AT_FIFO_OUTPUT != 0) {
578 d_link_setup_address(transmit_next_from, TX_ADDR);
579 d_link_put_command(TX_ENABLE);
580 dev->trans_start = jiffies;
581 }
582 #endif
583
584 mark_bh(INET_BH);
585 sti();
586 }
587
588
589
590
591 static void
592 d_link_rx_intr(struct device *dev)
593 {
594 struct sk_buff *skb;
595 int i;
596 int size;
597 int sksize;
598 unsigned char *buffer;
599
600
601
602 size = d_link_read_byte(RX_LEN, dev);
603 size = size + (d_link_read_byte(RX_LEN, dev) << 8) - 4;
604
605
606 rx_page ^= RX_PAGE2_SELECT;
607 d_link_put_command(RX_ENABLE);
608
609 if (size == 0)
610 return;
611
612 if ((size < 32 || size > 1535) && d_link_debug)
613 printk("%s: Bogus packet size %d.\n", dev->name, size);
614
615 sksize = sizeof(struct sk_buff) + size;
616 if ((skb = kmalloc(sksize, GFP_ATOMIC)) == NULL) {
617 if (d_link_debug) {
618 printk("%s: Couldn't allocate a sk_buff of size %d.\n",
619 dev->name, sksize);
620 }
621 return;
622 }
623
624
625 skb->lock = 0;
626 skb->mem_len = sksize;
627 skb->mem_addr = skb;
628
629 buffer = (unsigned char *)(skb + 1);
630
631
632
633
634 if (rx_page & RX_PAGE2_SELECT) {
635 d_link_setup_address(MEM_4K, RW_ADDR);
636 } else {
637 d_link_setup_address(MEM_4K + MEM_2K, RW_ADDR);
638 }
639
640
641 for (i = size; i > 0; --i) {
642 *buffer++ = d_link_read_byte(READ_DATA, dev);
643 }
644
645 localstats->rx_packets++;
646
647 if(dev_rint((void *)skb, size, IN_SKBUFF, dev)) {
648 printk("%s: receive buffers full.\n", dev->name);
649 return;
650 }
651
652
653
654
655
656
657 return;
658 }
659
660 int
661 d_link_init(struct device *dev)
662 {
663 int i;
664
665 printk("%s: D-Link pocket adapter", dev->name);
666
667 if (d_link_debug > 1)
668 printk(version);
669
670
671 rx_page = 0;
672 (void)d_link_read_status(dev);
673 d_link_put_command(RESET);
674 d_link_put_command(STOP_RESET);
675 if (d_link_read_status(dev) & 0xf0) {
676 printk(": probe failed at %#3x.\n", dev->base_addr);
677 return ENODEV;
678 }
679
680
681
682
683
684
685
686 d_link_setup_address(NODE_ADDRESS, RW_ADDR);
687 for (i = 0; i < ETH_ALEN; i++) {
688 dev->dev_addr[i] = d_link_read_byte(READ_DATA, dev);
689 dev->broadcast[i] = 0xff;
690 }
691
692
693 if ((dev->dev_addr[1] == 0xde) && (dev->dev_addr[2] == 0x15)) {
694
695 dev->dev_addr[0] = 0x00;
696 dev->dev_addr[1] = 0x80;
697 dev->dev_addr[2] = 0xc8;
698 dev->dev_addr[3] &= 0x0f;
699 dev->dev_addr[3] |= 0x70;
700 } else {
701 printk(", not found in printer port!\n");
702 return ENODEV;
703 }
704
705
706 dev->private = kmalloc(sizeof(struct netstats), GFP_KERNEL);
707 memset(dev->private, 0, sizeof(struct netstats));
708
709 for (i = 0; i < DEV_NUMBUFFS; i++)
710 dev->buffs[i] = NULL;
711
712 dev->hard_header = eth_header;
713 dev->add_arp = eth_add_arp;
714 dev->queue_xmit = dev_queue_xmit;
715 dev->rebuild_header = eth_rebuild_header;
716 dev->type_trans = eth_type_trans;
717
718 dev->open = &d_link_open;
719 dev->stop = &d_link_close;
720 dev->hard_start_xmit = &d_link_start_xmit;
721
722
723 dev->type = ARPHRD_ETHER;
724 dev->hard_header_len = ETH_HLEN;
725 dev->mtu = 1500;
726 dev->addr_len = ETH_ALEN;
727
728
729 dev->flags = IFF_BROADCAST;
730 dev->family = AF_INET;
731 dev->pa_addr = 0;
732 dev->pa_brdaddr = 0;
733 dev->pa_mask = 0;
734 dev->pa_alen = sizeof(unsigned long);
735
736 if (irqaction (dev->irq, &d_link_sigaction)) {
737 printk (": unable to get IRQ %d\n", dev->irq);
738 return 0;
739 }
740
741 printk(", Ethernet Address: %2.2X", dev->dev_addr[0]);
742 for (i = 1; i < ETH_ALEN; i++)
743 printk(":%2.2X",dev->dev_addr[i]);
744 printk("\n");
745
746 return 0;
747 }
748
749 static void
750 adapter_init(struct device *dev, int startp)
751 {
752 int i;
753
754 cli();
755
756 select_nic();
757 rx_page = 0;
758 d_link_put_command(RESET);
759 d_link_put_command(STOP_RESET);
760
761 if (startp) {
762 irqaction (dev->irq, &d_link_sigaction);
763 realdev = dev;
764 #ifdef D_LINK_FIFO
765 free_tx_page = 0x03;
766 busy_tx_page = 0x00;
767 #endif
768
769 d_link_setup_address(NODE_ADDRESS, RW_ADDR);
770 for (i = 0; i < ETH_ALEN; i++) {
771 d_link_put_byte(dev->dev_addr[i]);
772 }
773
774
775 rx_page = 0 | RX_BP | RX_BASE_PAGE;
776 d_link_setup_address(MEM_4K, RW_ADDR);
777
778 d_link_put_command(RX_ENABLE);
779 }
780 else
781 d_link_put_command(0);
782
783 select_prn();
784
785 sti();
786 }