Rev 323 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 323 | Rev 373 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; ETHERNET.INC ;; |
3 | ;; ETHERNET.INC ;; |
4 | ;; ;; |
4 | ;; ;; |
5 | ;; Ethernet network layer for Menuet OS ;; |
5 | ;; Ethernet network layer for Menuet OS ;; |
6 | ;; ;; |
6 | ;; ;; |
7 | ;; Version 0.4 22 September 2003 ;; |
7 | ;; Version 0.4 22 September 2003 ;; |
8 | ;; ;; |
8 | ;; ;; |
9 | ;; This file contains the following: ;; |
9 | ;; This file contains the following: ;; |
10 | ;; PCI bus scanning for valid devices ;; |
10 | ;; PCI bus scanning for valid devices ;; |
11 | ;; Table of supported ethernet drivers ;; |
11 | ;; Table of supported ethernet drivers ;; |
12 | ;; Code to identify and activate a supported driver ;; |
12 | ;; Code to identify and activate a supported driver ;; |
13 | ;; ARP handler ;; |
13 | ;; ARP handler ;; |
14 | ;; Driver interface to the IP layer ;; |
14 | ;; Driver interface to the IP layer ;; |
15 | ;; Gateway support ;; |
15 | ;; Gateway support ;; |
16 | ;; ;; |
16 | ;; ;; |
17 | ;; Individual driver files are included here ;; |
17 | ;; Individual driver files are included here ;; |
18 | ;; ;; |
18 | ;; ;; |
19 | ;; The PCI bus scanning code was ported from the etherboot ;; |
19 | ;; The PCI bus scanning code was ported from the etherboot ;; |
20 | ;; 5.0.6 project. The copyright statement for that code is ;; |
20 | ;; 5.0.6 project. The copyright statement for that code is ;; |
21 | ;; ;; |
21 | ;; ;; |
22 | ;; GNU GENERAL PUBLIC LICENSE ;; |
22 | ;; GNU GENERAL PUBLIC LICENSE ;; |
23 | ;; Version 2, June 1991 ;; |
23 | ;; Version 2, June 1991 ;; |
24 | ;; ;; |
24 | ;; ;; |
25 | ;; remaining parts Copyright 2002 Mike Hibbett ;; |
25 | ;; remaining parts Copyright 2002 Mike Hibbett ;; |
26 | ;; mikeh@oceanfree.net ;; |
26 | ;; mikeh@oceanfree.net ;; |
27 | ;; ;; |
27 | ;; ;; |
28 | ;; See file COPYING for details ;; |
28 | ;; See file COPYING for details ;; |
29 | ;; ;; |
29 | ;; ;; |
30 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
30 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
31 | 31 | ||
32 | ;******************************************************************** |
32 | ;******************************************************************** |
33 | ; Interface |
33 | ; Interface |
34 | ; ethernet_driver called by stack_handler in stack.inc |
34 | ; ethernet_driver called by stack_handler in stack.inc |
35 | ; eth_probe called by app_stack_handler in stack.inc |
35 | ; eth_probe called by app_stack_handler in stack.inc |
36 | ; |
36 | ; |
37 | ;******************************************************************** |
37 | ;******************************************************************** |
38 | 38 | ||
39 | ETHER_IP equ 0x0008 ; Reversed from 0800 for intel |
39 | ETHER_IP equ 0x0008 ; Reversed from 0800 for intel |
40 | ETHER_ARP equ 0x0608 ; Reversed from 0806 for intel |
40 | ETHER_ARP equ 0x0608 ; Reversed from 0806 for intel |
41 | ETHER_RARP equ 0x3580 |
41 | ETHER_RARP equ 0x3580 |
42 | 42 | ||
43 | struc ETH_FRAME |
43 | struc ETH_FRAME |
44 | { .DstMAC dp ? ;destination MAC-address [6 bytes] |
44 | { .DstMAC dp ? ;destination MAC-address [6 bytes] |
45 | .SrcMAC dp ? ;source MAC-address [6 bytes] |
45 | .SrcMAC dp ? ;source MAC-address [6 bytes] |
46 | .Type dw ? ;type of the upper-layer protocol [2 bytes] |
46 | .Type dw ? ;type of the upper-layer protocol [2 bytes] |
47 | .Data db ? ;data [46-1500 bytes] |
47 | .Data db ? ;data [46-1500 bytes] |
48 | } |
48 | } |
49 | 49 | ||
50 | virtual at Ether_buffer |
50 | virtual at Ether_buffer |
51 | ETH_FRAME ETH_FRAME |
51 | ETH_FRAME ETH_FRAME |
52 | end virtual |
52 | end virtual |
53 | 53 | ||
54 | 54 | ||
55 | ; Some useful information on data structures |
55 | ; Some useful information on data structures |
56 | 56 | ||
57 | ; Ethernet Packet - ARP Request example |
57 | ; Ethernet Packet - ARP Request example |
58 | ; |
58 | ; |
59 | ; 0 1 2 3 |
59 | ; 0 1 2 3 |
60 | ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
60 | ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
61 | ; |
61 | ; |
62 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
62 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
63 | ; | Dest H/W Address | |
63 | ; | Dest H/W Address | |
64 | ; | ( 14 byte header ) | |
64 | ; | ( 14 byte header ) | |
65 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
65 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
66 | ; | | Source H/W Address | |
66 | ; | | Source H/W Address | |
67 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
67 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
68 | ; | | |
68 | ; | | |
69 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
69 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
70 | ; | Protocol - ARP 08 06 | |
70 | ; | Protocol - ARP 08 06 | |
71 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
71 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
72 | 72 | ||
73 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
73 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
74 | ; | H/W Type 00 01 | Protocol Type 08 00 | |
74 | ; | H/W Type 00 01 | Protocol Type 08 00 | |
75 | ; | ( ARP Request packet ) | |
75 | ; | ( ARP Request packet ) | |
76 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
76 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
77 | ; | HLen 0x06 | PLen 0x04 | OpCode 00 01 | |
77 | ; | HLen 0x06 | PLen 0x04 | OpCode 00 01 | |
78 | ; | ( 0001 for request, 0002 for reply ) | |
78 | ; | ( 0001 for request, 0002 for reply ) | |
79 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
79 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
80 | ; | Source Hardware Address ( MAC Address ) | |
80 | ; | Source Hardware Address ( MAC Address ) | |
81 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
81 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
82 | ; | | Source IP Address | |
82 | ; | | Source IP Address | |
83 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
83 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
84 | ; | | Destination Hardware Address | |
84 | ; | | Destination Hardware Address | |
85 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
85 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
86 | ; | | |
86 | ; | | |
87 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
87 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
88 | ; | Destination IP Address | |
88 | ; | Destination IP Address | |
89 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
89 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
90 | 90 | ||
91 | ; Include individual drivers source files at this point. |
91 | ; Include individual drivers source files at this point. |
92 | ; If you create a new driver, include it below. |
92 | ; If you create a new driver, include it below. |
93 | 93 | ||
94 | include "drivers/rtl8029.inc" |
94 | include "drivers/rtl8029.inc" |
95 | include "drivers/i8255x.inc" |
95 | include "drivers/i8255x.inc" |
96 | include "drivers/rtl8139.inc" |
96 | include "drivers/rtl8139.inc" |
97 | include "drivers/3c59x.inc" |
97 | include "drivers/3c59x.inc" |
98 | include "drivers/sis900.inc" |
98 | include "drivers/sis900.inc" |
99 | include "drivers/pcnet32.inc" |
99 | include "drivers/pcnet32.inc" |
100 | ;include "drivers/mtd80x.inc" |
100 | ;include "drivers/mtd80x.inc" |
- | 101 | include "drivers/rtl8169.inc" |
|
101 | 102 | ||
102 | ; PCICards |
103 | ; PCICards |
103 | ; ======== |
104 | ; ======== |
104 | ; PCI vendor and hardware types for hardware supported by the above drivers |
105 | ; PCI vendor and hardware types for hardware supported by the above drivers |
105 | ; If you add a driver, ensure you update this datastructure, otherwise the |
106 | ; If you add a driver, ensure you update this datastructure, otherwise the |
106 | ; card will not be probed. |
107 | ; card will not be probed. |
107 | ; Each driver is defined by 4 double words. These are |
108 | ; Each driver is defined by 4 double words. These are |
108 | ; PCIVendorDevice probeFunction ResetFunction PollFunction transmitFunction |
109 | ; PCIVendorDevice probeFunction ResetFunction PollFunction transmitFunction |
109 | ; The last entry must be kept at all zeros, to indicate the end of the list |
110 | ; The last entry must be kept at all zeros, to indicate the end of the list |
110 | ; As a PCI driver may support more than one hardware implementation, there may |
111 | ; As a PCI driver may support more than one hardware implementation, there may |
111 | ; be several lines which refer to the same functions. |
112 | ; be several lines which refer to the same functions. |
112 | ; The first driver found on the PCI bus will be the one used. |
113 | ; The first driver found on the PCI bus will be the one used. |
113 | 114 | ||
114 | PCICARDS_ENTRY_SIZE equ 24 ; Size of each PCICARDS entry |
115 | PCICARDS_ENTRY_SIZE equ 24 ; Size of each PCICARDS entry |
115 | 116 | ||
116 | iglobal |
117 | iglobal |
117 | PCICards: |
118 | PCICards: |
118 | dd 0x12098086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
119 | dd 0x12098086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
119 | dd 0x10298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
120 | dd 0x10298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
120 | dd 0x12298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
121 | dd 0x12298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
121 | dd 0x10308086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
122 | dd 0x10308086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
122 | dd 0x24498086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
123 | dd 0x24498086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
123 | dd 0x802910ec, rtl8029_probe, rtl8029_reset, rtl8029_poll, rtl8029_transmit, 0 |
124 | dd 0x802910ec, rtl8029_probe, rtl8029_reset, rtl8029_poll, rtl8029_transmit, 0 |
124 | dd 0x12111113, rtl8029_probe, rtl8029_reset, rtl8029_poll, rtl8029_transmit, 0 |
125 | dd 0x12111113, rtl8029_probe, rtl8029_reset, rtl8029_poll, rtl8029_transmit, 0 |
125 | 126 | ||
126 | dd 0x813910ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
127 | dd 0x813910ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
127 | dd 0x813810ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
128 | dd 0x813810ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
128 | dd 0x12111113, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
129 | dd 0x12111113, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
129 | dd 0x13601500, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
130 | dd 0x13601500, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
130 | dd 0x13604033, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
131 | dd 0x13604033, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
131 | dd 0x13001186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
132 | dd 0x13001186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
132 | dd 0x13401186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
133 | dd 0x13401186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
133 | dd 0xab0613d1, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
134 | dd 0xab0613d1, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
134 | dd 0xa1171259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
135 | dd 0xa1171259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
135 | dd 0xa11e1259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
136 | dd 0xa11e1259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
136 | dd 0xab0614ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
137 | dd 0xab0614ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
137 | dd 0xab0714ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
138 | dd 0xab0714ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
138 | dd 0x123411db, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
139 | dd 0x123411db, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
139 | dd 0x91301432, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
140 | dd 0x91301432, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
140 | dd 0x101202ac, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
141 | dd 0x101202ac, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
141 | dd 0x0106018a, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
142 | dd 0x0106018a, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
142 | dd 0x1211126c, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
143 | dd 0x1211126c, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
143 | dd 0x81391743, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
144 | dd 0x81391743, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
144 | dd 0x8139021b, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
145 | dd 0x8139021b, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
- | 146 | ||
- | 147 | dd 0x816810ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
|
- | 148 | dd 0x816910ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
|
- | 149 | dd 0x011616ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
|
- | 150 | dd 0x43001186, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
|
145 | 151 | ||
146 | dd 0x590010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
152 | dd 0x590010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
147 | dd 0x592010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
153 | dd 0x592010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
148 | dd 0x597010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
154 | dd 0x597010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
149 | dd 0x595010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
155 | dd 0x595010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
150 | dd 0x595110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
156 | dd 0x595110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
151 | dd 0x595210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
157 | dd 0x595210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
152 | dd 0x900010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
158 | dd 0x900010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
153 | dd 0x900110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
159 | dd 0x900110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
154 | dd 0x900410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
160 | dd 0x900410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
155 | dd 0x900510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
161 | dd 0x900510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
156 | dd 0x900610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
162 | dd 0x900610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
157 | dd 0x900A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
163 | dd 0x900A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
158 | dd 0x905010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
164 | dd 0x905010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
159 | dd 0x905110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
165 | dd 0x905110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
160 | dd 0x905510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
166 | dd 0x905510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
161 | dd 0x905810b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
167 | dd 0x905810b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
162 | dd 0x905A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
168 | dd 0x905A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
163 | dd 0x920010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
169 | dd 0x920010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
164 | dd 0x980010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
170 | dd 0x980010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
165 | dd 0x980510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
171 | dd 0x980510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
166 | dd 0x764610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
172 | dd 0x764610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
167 | dd 0x505510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
173 | dd 0x505510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
168 | dd 0x605510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
174 | dd 0x605510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
169 | dd 0x605610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
175 | dd 0x605610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
170 | dd 0x5b5710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
176 | dd 0x5b5710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
171 | dd 0x505710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
177 | dd 0x505710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
172 | dd 0x515710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
178 | dd 0x515710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
173 | dd 0x525710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
179 | dd 0x525710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
174 | dd 0x656010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
180 | dd 0x656010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
175 | dd 0x656210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
181 | dd 0x656210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
176 | dd 0x656410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
182 | dd 0x656410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
177 | dd 0x450010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
183 | dd 0x450010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
178 | 184 | ||
179 | dd 0x09001039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0 |
185 | dd 0x09001039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0 |
180 | 186 | ||
181 | dd 0x20001022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
187 | dd 0x20001022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
182 | dd 0x26251022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
188 | dd 0x26251022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
183 | dd 0x20011022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
189 | dd 0x20011022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
184 | 190 | ||
185 | ;dd 0x08031516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
191 | ;dd 0x08031516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
186 | 192 | ||
187 | ; following cards are untested |
193 | ; following cards are untested |
188 | dd 0x70161039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0 |
194 | dd 0x70161039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0 |
189 | ;dd 0x08001516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
195 | ;dd 0x08001516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
190 | ;dd 0x08911516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
196 | ;dd 0x08911516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
191 | 197 | ||
192 | rb PCICARDS_ENTRY_SIZE ; end of list marker, do not remove |
198 | rb PCICARDS_ENTRY_SIZE ; end of list marker, do not remove |
193 | endg |
199 | endg |
194 | 200 | ||
195 | uglobal |
201 | uglobal |
196 | ;Net-stack's interface's settings |
202 | ;Net-stack's interface's settings |
197 | node_addr: db 0,0,0,0,0,0 |
203 | node_addr: db 0,0,0,0,0,0 |
198 | gateway_ip: dd 0 |
204 | gateway_ip: dd 0 |
199 | dns_ip: dd 0 |
205 | dns_ip: dd 0 |
200 | 206 | ||
201 | eth_rx_data_len: dw 0 |
207 | eth_rx_data_len: dw 0 |
202 | eth_status: dd 0 |
208 | eth_status: dd 0 |
203 | io_addr: dd 0 |
209 | io_addr: dd 0 |
204 | hdrtype: db 0 |
210 | hdrtype: db 0 |
205 | vendor_device: dd 0 |
211 | vendor_device: dd 0 |
206 | pci_data: dd 0 |
212 | pci_data: dd 0 |
207 | pci_dev: dd 0 |
213 | pci_dev: dd 0 |
208 | pci_bus: dd 0 |
214 | pci_bus: dd 0 |
209 | 215 | ||
210 | ; These will hold pointers to the selected driver functions |
216 | ; These will hold pointers to the selected driver functions |
211 | drvr_probe: dd 0 |
217 | drvr_probe: dd 0 |
212 | drvr_reset: dd 0 |
218 | drvr_reset: dd 0 |
213 | drvr_poll: dd 0 |
219 | drvr_poll: dd 0 |
214 | drvr_transmit: dd 0 |
220 | drvr_transmit: dd 0 |
215 | drvr_cable: dd 0 |
221 | drvr_cable: dd 0 |
216 | 222 | ||
217 | endg |
223 | endg |
218 | 224 | ||
219 | iglobal |
225 | iglobal |
220 | broadcast_add: db 0xff,0xff,0xff,0xff,0xff,0xff |
226 | broadcast_add: db 0xff,0xff,0xff,0xff,0xff,0xff |
221 | subnet_mask: dd 0x00ffffff ; 255.255.255.0 |
227 | subnet_mask: dd 0x00ffffff ; 255.255.255.0 |
222 | endg |
228 | endg |
223 | 229 | ||
224 | include "arp.inc" ;arp-protocol functions |
230 | include "arp.inc" ;arp-protocol functions |
225 | include "pci.inc" ;PCI bus access functions |
231 | include "pci.inc" ;PCI bus access functions |
226 | 232 | ||
227 | 233 | ||
228 | ;*************************************************************************** |
234 | ;*************************************************************************** |
229 | ; Function |
235 | ; Function |
230 | ; eth_tx |
236 | ; eth_tx |
231 | ; |
237 | ; |
232 | ; Description |
238 | ; Description |
233 | ; Looks at the NET1OUT_QUEUE for data to send. |
239 | ; Looks at the NET1OUT_QUEUE for data to send. |
234 | ; Stores that destination IP in a location used by the tx routine |
240 | ; Stores that destination IP in a location used by the tx routine |
235 | ; Looks up the MAC address in the ARP table; stores that where |
241 | ; Looks up the MAC address in the ARP table; stores that where |
236 | ; the tx routine can get it |
242 | ; the tx routine can get it |
237 | ; Get the length of the data. Store that where the tx routine wants it |
243 | ; Get the length of the data. Store that where the tx routine wants it |
238 | ; Call tx |
244 | ; Call tx |
239 | ; Places buffer on empty queue when the tx routine finished |
245 | ; Places buffer on empty queue when the tx routine finished |
240 | ; |
246 | ; |
241 | ;*************************************************************************** |
247 | ;*************************************************************************** |
242 | proc eth_tx stdcall uses ebx esi edi |
248 | proc eth_tx stdcall uses ebx esi edi |
243 | local MACAddress dp ? ;allocate 6 bytes in the stack |
249 | local MACAddress dp ? ;allocate 6 bytes in the stack |
244 | 250 | ||
245 | ; Look for a buffer to tx |
251 | ; Look for a buffer to tx |
246 | mov eax, NET1OUT_QUEUE |
252 | mov eax, NET1OUT_QUEUE |
247 | call dequeue |
253 | call dequeue |
248 | cmp ax, NO_BUFFER |
254 | cmp ax, NO_BUFFER |
249 | je .exit ; Exit if no buffer available |
255 | je .exit ; Exit if no buffer available |
250 | 256 | ||
251 | push eax ;save buffer number |
257 | push eax ;save buffer number |
252 | 258 | ||
253 | ; convert buffer pointer eax to the absolute address |
259 | ; convert buffer pointer eax to the absolute address |
254 | imul eax, IPBUFFSIZE |
260 | imul eax, IPBUFFSIZE |
255 | add eax, IPbuffs |
261 | add eax, IPbuffs |
256 | 262 | ||
257 | ; Extract the destination IP |
263 | ; Extract the destination IP |
258 | ; find the destination IP in the ARP table, get MAC |
264 | ; find the destination IP in the ARP table, get MAC |
259 | ; store this MAC in 'MACAddress' |
265 | ; store this MAC in 'MACAddress' |
260 | mov ebx, eax ; Save buffer address |
266 | mov ebx, eax ; Save buffer address |
261 | mov edx, [ebx + 16] ; get destination address |
267 | mov edx, [ebx + 16] ; get destination address |
262 | 268 | ||
263 | ; If the destination address is 255.255.255.255, |
269 | ; If the destination address is 255.255.255.255, |
264 | ; set the MACAddress to all ones ( broadcast ) |
270 | ; set the MACAddress to all ones ( broadcast ) |
265 | cld |
271 | cld |
266 | mov esi, broadcast_add |
272 | mov esi, broadcast_add |
267 | lea edi, [MACAddress] |
273 | lea edi, [MACAddress] |
268 | movsd |
274 | movsd |
269 | movsw |
275 | movsw |
270 | cmp edx, 0xffffffff |
276 | cmp edx, 0xffffffff |
271 | je .send ; If it is broadcast, just send |
277 | je .send ; If it is broadcast, just send |
272 | 278 | ||
273 | lea eax, [MACAddress] ;cause this is local variable |
279 | lea eax, [MACAddress] ;cause this is local variable |
274 | stdcall arp_table_manager, ARP_TABLE_IP_TO_MAC, edx, eax ;opcode,IP,MAC_ptr - Get the MAC address. |
280 | stdcall arp_table_manager, ARP_TABLE_IP_TO_MAC, edx, eax ;opcode,IP,MAC_ptr - Get the MAC address. |
275 | 281 | ||
276 | cmp eax, ARP_VALID_MAPPING |
282 | cmp eax, ARP_VALID_MAPPING |
277 | je .send |
283 | je .send |
278 | 284 | ||
279 | ; No valid entry. Has the request been sent, but timed out? |
285 | ; No valid entry. Has the request been sent, but timed out? |
280 | cmp eax, ARP_RESPONSE_TIMEOUT |
286 | cmp eax, ARP_RESPONSE_TIMEOUT |
281 | je .freebuf |
287 | je .freebuf |
282 | 288 | ||
283 | .wait_response: ;we wait arp-response |
289 | .wait_response: ;we wait arp-response |
284 | ; Re-queue the packet, and exit |
290 | ; Re-queue the packet, and exit |
285 | pop ebx |
291 | pop ebx |
286 | mov eax, NET1OUT_QUEUE |
292 | mov eax, NET1OUT_QUEUE |
287 | call queue ; Get the buffer back |
293 | call queue ; Get the buffer back |
288 | jmp .exit |
294 | jmp .exit |
289 | 295 | ||
290 | .send: ;if ARP_VALID_MAPPING then send the packet |
296 | .send: ;if ARP_VALID_MAPPING then send the packet |
291 | lea edi, [MACAddress] ; Pointer to 48 bit destination address |
297 | lea edi, [MACAddress] ; Pointer to 48 bit destination address |
292 | movzx ecx, word[ebx+2] ; Size of IP packet to send |
298 | movzx ecx, word[ebx+2] ; Size of IP packet to send |
293 | xchg ch, cl ; because mirror byte-order |
299 | xchg ch, cl ; because mirror byte-order |
294 | mov esi, ebx ; Pointer to packet data |
300 | mov esi, ebx ; Pointer to packet data |
295 | mov bx, ETHER_IP ; Type of packet |
301 | mov bx, ETHER_IP ; Type of packet |
296 | call dword [drvr_transmit] ; Call the drivers transmit function |
302 | call dword [drvr_transmit] ; Call the drivers transmit function |
297 | 303 | ||
298 | ; OK, we have sent a packet, so increment the count |
304 | ; OK, we have sent a packet, so increment the count |
299 | inc dword [ip_tx_count] |
305 | inc dword [ip_tx_count] |
300 | 306 | ||
301 | ; And finally, return the buffer to the free queue |
307 | ; And finally, return the buffer to the free queue |
302 | .freebuf: |
308 | .freebuf: |
303 | pop eax |
309 | pop eax |
304 | call freeBuff |
310 | call freeBuff |
305 | 311 | ||
306 | .exit: |
312 | .exit: |
307 | ret |
313 | ret |
308 | endp |
314 | endp |
309 | 315 | ||
310 | ;*************************************************************************** |
316 | ;*************************************************************************** |
311 | ; Function |
317 | ; Function |
312 | ; ether_IP_handler |
318 | ; ether_IP_handler |
313 | ; |
319 | ; |
314 | ; Description |
320 | ; Description |
315 | ; Called when an IP ethernet packet is received on the ethernet |
321 | ; Called when an IP ethernet packet is received on the ethernet |
316 | ; Header + Data is in Ether_buffer[] |
322 | ; Header + Data is in Ether_buffer[] |
317 | ; We just need to get a buffer from the 'free' queue, and |
323 | ; We just need to get a buffer from the 'free' queue, and |
318 | ; store the packet in it, then insert the packet number into the |
324 | ; store the packet in it, then insert the packet number into the |
319 | ; IPRX queue. |
325 | ; IPRX queue. |
320 | ; If no queue entry is available, the packet is silently discarded |
326 | ; If no queue entry is available, the packet is silently discarded |
321 | ; All registers may be destroyed |
327 | ; All registers may be destroyed |
322 | ; |
328 | ; |
323 | ;*************************************************************************** |
329 | ;*************************************************************************** |
324 | ether_IP_handler: |
330 | ether_IP_handler: |
325 | mov eax, EMPTY_QUEUE |
331 | mov eax, EMPTY_QUEUE |
326 | call dequeue |
332 | call dequeue |
327 | cmp ax, NO_BUFFER |
333 | cmp ax, NO_BUFFER |
328 | je eiph00x |
334 | je eiph00x |
329 | 335 | ||
330 | ; convert buffer pointer eax to the absolute address |
336 | ; convert buffer pointer eax to the absolute address |
331 | push eax |
337 | push eax |
332 | mov ecx, IPBUFFSIZE |
338 | mov ecx, IPBUFFSIZE |
333 | mul ecx |
339 | mul ecx |
334 | add eax, IPbuffs |
340 | add eax, IPbuffs |
335 | 341 | ||
336 | mov edi, eax |
342 | mov edi, eax |
337 | 343 | ||
338 | ; get a pointer to the start of the DATA |
344 | ; get a pointer to the start of the DATA |
339 | mov esi, ETH_FRAME.Data |
345 | mov esi, ETH_FRAME.Data |
340 | 346 | ||
341 | ; Now store it all away |
347 | ; Now store it all away |
342 | mov ecx, IPBUFFSIZE / 4 ; Copy all of the available |
348 | mov ecx, IPBUFFSIZE / 4 ; Copy all of the available |
343 | ; data across - worse case |
349 | ; data across - worse case |
344 | cld |
350 | cld |
345 | rep movsd |
351 | rep movsd |
346 | 352 | ||
347 | ; And finally, place the buffer in the IPRX queue |
353 | ; And finally, place the buffer in the IPRX queue |
348 | pop ebx |
354 | pop ebx |
349 | mov eax, IPIN_QUEUE |
355 | mov eax, IPIN_QUEUE |
350 | call queue |
356 | call queue |
351 | 357 | ||
352 | eiph00x: |
358 | eiph00x: |
353 | ret |
359 | ret |
354 | 360 | ||
355 | ;*************************************************************************** |
361 | ;*************************************************************************** |
356 | ; Function |
362 | ; Function |
357 | ; eth_probe |
363 | ; eth_probe |
358 | ; Description |
364 | ; Description |
359 | ; Searches for an ethernet card. If found, the card is enabled and |
365 | ; Searches for an ethernet card. If found, the card is enabled and |
360 | ; the ethernet -> IP link established |
366 | ; the ethernet -> IP link established |
361 | ; |
367 | ; |
362 | ; This function scans the PCI bus looking for a supported device. |
368 | ; This function scans the PCI bus looking for a supported device. |
363 | ; ISA bus is currently not supported. |
369 | ; ISA bus is currently not supported. |
364 | ; |
370 | ; |
365 | ; eax is 0 if no hardware found |
371 | ; eax is 0 if no hardware found |
366 | ;*************************************************************************** |
372 | ;*************************************************************************** |
367 | eth_probe: |
373 | eth_probe: |
368 | ; Find a card on the PCI bus, and get it's address |
374 | ; Find a card on the PCI bus, and get it's address |
369 | call scan_bus ; Find the ethernet cards PIC address |
375 | call scan_bus ; Find the ethernet cards PIC address |
370 | xor eax, eax |
376 | xor eax, eax |
371 | cmp [io_addr], eax |
377 | cmp [io_addr], eax |
372 | je ep_00x ; Return 0 in eax if no cards found |
378 | je ep_00x ; Return 0 in eax if no cards found |
373 | 379 | ||
374 | call dword [drvr_probe] ; Call the drivers probe function |
380 | call dword [drvr_probe] ; Call the drivers probe function |
375 | 381 | ||
376 | mov eax, [io_addr] ; return a non zero value |
382 | mov eax, [io_addr] ; return a non zero value |
377 | 383 | ||
378 | ep_00x: |
384 | ep_00x: |
379 | ret |
385 | ret |
380 | 386 | ||
381 | ;*************************************************************************** |
387 | ;*************************************************************************** |
382 | ; Function |
388 | ; Function |
383 | ; ethernet_driver |
389 | ; ethernet_driver |
384 | ; |
390 | ; |
385 | ; Description |
391 | ; Description |
386 | ; The ethernet RX and TX handler |
392 | ; The ethernet RX and TX handler |
387 | ; This is a kernel function, called by stack_handler |
393 | ; This is a kernel function, called by stack_handler |
388 | ; |
394 | ; |
389 | ;*************************************************************************** |
395 | ;*************************************************************************** |
390 | ethernet_driver: |
396 | ethernet_driver: |
391 | ; Do nothing if the driver is inactive |
397 | ; Do nothing if the driver is inactive |
392 | cmp [ethernet_active], byte 0 |
398 | cmp [ethernet_active], byte 0 |
393 | je eth_exit |
399 | je eth_exit |
394 | 400 | ||
395 | call eth_rx |
401 | call eth_rx |
396 | call eth_tx |
402 | call eth_tx |
397 | 403 | ||
398 | eth_exit: |
404 | eth_exit: |
399 | ret |
405 | ret |
400 | 406 | ||
401 | ;*************************************************************************** |
407 | ;*************************************************************************** |
402 | ; Function |
408 | ; Function |
403 | ; eth_rx |
409 | ; eth_rx |
404 | ; |
410 | ; |
405 | ; Description |
411 | ; Description |
406 | ; Polls the ethernet card for received data. Extracts if present |
412 | ; Polls the ethernet card for received data. Extracts if present |
407 | ; Depending on the Protocol within the packet: |
413 | ; Depending on the Protocol within the packet: |
408 | ; ARP : Pass to ARP_handler. This may result in an ARP reply |
414 | ; ARP : Pass to ARP_handler. This may result in an ARP reply |
409 | ; being tx'ed |
415 | ; being tx'ed |
410 | ; IP : Store in an IP buffer |
416 | ; IP : Store in an IP buffer |
411 | ; |
417 | ; |
412 | ;*************************************************************************** |
418 | ;*************************************************************************** |
413 | eth_rx: |
419 | eth_rx: |
414 | xor ax, ax |
420 | xor ax, ax |
415 | mov [eth_rx_data_len], ax |
421 | mov [eth_rx_data_len], ax |
416 | call dword [drvr_poll] ; Call the drivers poll function |
422 | call dword [drvr_poll] ; Call the drivers poll function |
417 | 423 | ||
418 | mov ax, [eth_rx_data_len] |
424 | mov ax, [eth_rx_data_len] |
419 | cmp ax, 0 |
425 | cmp ax, 0 |
420 | je .exit |
426 | je .exit |
421 | 427 | ||
422 | 428 | ||
423 | ; Check the protocol. Call appropriate handler |
429 | ; Check the protocol. Call appropriate handler |
424 | 430 | ||
425 | mov ax, [ETH_FRAME.Type] ; The address of the protocol word |
431 | mov ax, [ETH_FRAME.Type] ; The address of the protocol word |
426 | 432 | ||
427 | cmp ax, ETHER_IP |
433 | cmp ax, ETHER_IP |
428 | je .is_ip ; It's IP |
434 | je .is_ip ; It's IP |
429 | 435 | ||
430 | cmp ax, ETHER_ARP |
436 | cmp ax, ETHER_ARP |
431 | je .is_arp ; It is ARP |
437 | je .is_arp ; It is ARP |
432 | 438 | ||
433 | jmp .exit ; If not IP or ARP, ignore |
439 | jmp .exit ; If not IP or ARP, ignore |
434 | 440 | ||
435 | .is_ip: |
441 | .is_ip: |
- | 442 | DEBUGF 1,"K : eth_rx - IP packet\n" |
|
436 | inc dword [ip_rx_count] |
443 | inc dword [ip_rx_count] |
437 | call ether_IP_handler |
444 | call ether_IP_handler |
438 | jmp .exit |
445 | jmp .exit |
439 | 446 | ||
440 | .is_arp: |
447 | .is_arp: |
441 | - | ||
- | 448 | DEBUGF 1,"K : eth_rx - ARP packet\n" |
|
442 | ; At this point, the packet is still in the Ether_buffer |
449 | ; At this point, the packet is still in the Ether_buffer |
443 | call arp_handler |
450 | call arp_handler |
444 | 451 | ||
445 | .exit: |
452 | .exit: |
446 | ret |
453 | ret |