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