Rev 1241 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1241 | Rev 1249 | ||
---|---|---|---|
Line 12... | Line 12... | ||
12 | ;; GNU GENERAL PUBLIC LICENSE ;; |
12 | ;; GNU GENERAL PUBLIC LICENSE ;; |
13 | ;; Version 2, June 1991 ;; |
13 | ;; Version 2, June 1991 ;; |
14 | ;; ;; |
14 | ;; ;; |
15 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
15 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 16... | Line 16... | ||
16 | 16 | ||
Line 17... | Line 17... | ||
17 | $Revision: 1241 $ |
17 | $Revision: 1249 $ |
18 | 18 | ||
Line 19... | Line 19... | ||
19 | MAX_ETH_DEVICES equ MAX_NET_DEVICES |
19 | MAX_ETH_DEVICES equ MAX_NET_DEVICES |
Line 78... | Line 78... | ||
78 | xor eax, eax |
78 | xor eax, eax |
79 | mov edi, ETH_RUNNING |
79 | mov edi, ETH_RUNNING |
80 | mov ecx, (1+MAX_ETH_DEVICES) |
80 | mov ecx, (1+MAX_ETH_DEVICES) |
81 | rep stosd |
81 | rep stosd |
Line 82... | Line 82... | ||
82 | 82 | ||
83 | mov dword [ETH_IN_QUEUE], ETH_QUEUE_SIZE |
- | |
84 | mov dword [ETH_IN_QUEUE+4], ETH_IN_QUEUE + queue.data |
- | |
85 | mov dword [ETH_IN_QUEUE+8], ETH_IN_QUEUE + queue.data |
- | |
86 | 83 | init_queue ETH_IN_QUEUE |
|
87 | mov dword [ETH_OUT_QUEUE], ETH_QUEUE_SIZE |
- | |
88 | mov dword [ETH_OUT_QUEUE+4], ETH_OUT_QUEUE + queue.data |
- | |
Line 89... | Line 84... | ||
89 | mov dword [ETH_OUT_QUEUE+8], ETH_OUT_QUEUE + queue.data |
84 | init_queue ETH_OUT_QUEUE |
Line 90... | Line 85... | ||
90 | 85 | ||
Line 102... | Line 97... | ||
102 | ; OUT: Device num in eax, -1 on error |
97 | ; OUT: Device num in eax, -1 on error |
103 | ; |
98 | ; |
104 | ;--------------------------------------------------------- |
99 | ;--------------------------------------------------------- |
Line 105... | Line 100... | ||
105 | 100 | ||
106 | align 4 |
101 | align 4 |
Line 107... | Line 102... | ||
107 | ETH_Add_Device: |
102 | ETH_add_device: |
Line 108... | Line 103... | ||
108 | 103 | ||
109 | DEBUGF 1,"ETH_Add_Device: %x ", ebx |
104 | DEBUGF 1,"ETH_Add_Device: %x ", ebx |
Line 120... | Line 115... | ||
120 | 115 | ||
121 | mov eax, ebx |
116 | mov eax, ebx |
122 | mov ecx, MAX_ETH_DEVICES ; We need to check whole list because a device may be removed without re-organizing list |
117 | mov ecx, MAX_ETH_DEVICES ; We need to check whole list because a device may be removed without re-organizing list |
Line 123... | Line -... | ||
123 | mov edi, ETH_DRV_LIST |
- | |
124 | 118 | mov edi, ETH_DRV_LIST |
|
125 | cld |
119 | |
Line 126... | Line 120... | ||
126 | repne scasd ; See if device is already in the list |
120 | repne scasd ; See if device is already in the list |
127 | jz .error |
121 | jz .error |
Line 165... | Line 159... | ||
165 | ; OUT: eax: -1 on error |
159 | ; OUT: eax: -1 on error |
166 | ; |
160 | ; |
167 | ;-------------------------------- |
161 | ;-------------------------------- |
Line 168... | Line 162... | ||
168 | 162 | ||
169 | align 4 |
163 | align 4 |
Line 170... | Line 164... | ||
170 | ETH_Remove_Device: |
164 | ETH_remove_device: |
171 | 165 | ||
Line 172... | Line 166... | ||
172 | cmp [ETH_RUNNING], 0 |
166 | cmp [ETH_RUNNING], 0 |
Line 210... | Line 204... | ||
210 | ; OUT: / |
204 | ; OUT: / |
211 | ; |
205 | ; |
212 | ;------------------------------------------------------------- |
206 | ;------------------------------------------------------------- |
Line 213... | Line 207... | ||
213 | 207 | ||
214 | align 4 |
208 | align 4 |
215 | ETH_Receiver: |
209 | ETH_receiver: |
Line -... | Line 210... | ||
- | 210 | DEBUGF 1,"ETH_Receiver: " |
|
- | 211 | ||
216 | DEBUGF 1,"ETH_Receiver \n" |
212 | push ebx |
- | 213 | mov esi, esp |
|
- | 214 | add_to_queue ETH_IN_QUEUE, ETH_QUEUE_SIZE, eth_queue_entry.size, .fail |
|
- | 215 | DEBUGF 1,"Queued packet successfully\n" |
|
Line 217... | Line 216... | ||
217 | 216 | add esp, 4*3 |
|
- | 217 | ret |
|
- | 218 | ||
- | 219 | .fail: |
|
- | 220 | DEBUGF 1,"ETH_IN_QUEUE is full!\n" |
|
218 | add_to_queue ETH_IN_QUEUE, ETH_QUEUE_SIZE, .gohome |
221 | add esp, 4 |
Line 236... | Line 239... | ||
236 | ;------------------------------------------------------------- |
239 | ;------------------------------------------------------------- |
Line 237... | Line 240... | ||
237 | 240 | ||
238 | align 4 |
241 | align 4 |
Line 239... | Line 242... | ||
239 | ETH_handler: |
242 | ETH_handler: |
- | 243 | ||
- | 244 | get_from_queue ETH_IN_QUEUE, ETH_QUEUE_SIZE, eth_queue_entry.size, .gohome |
|
- | 245 | ||
- | 246 | push ETH_handler |
|
- | 247 | ||
- | 248 | lodsd |
|
- | 249 | mov ebx, eax |
|
- | 250 | lodsd |
|
- | 251 | mov ecx, eax |
|
- | 252 | lodsd |
|
- | 253 | xchg eax, ecx |
|
Line 240... | Line 254... | ||
240 | 254 | push ecx |
|
241 | get_from_queue ETH_IN_QUEUE, ETH_QUEUE_SIZE, .gohome |
255 | push eax |
242 | 256 | ||
243 | DEBUGF 1,"ETH_Handler - size: %u\n", ecx |
257 | DEBUGF 1,"ETH_Handler - size: %u\n", ecx |
Line 260... | Line 274... | ||
260 | DEBUGF 1,"Dumping packet\n" |
274 | DEBUGF 1,"Dumping packet\n" |
261 | call kernel_free |
275 | call kernel_free |
262 | add esp, 4 |
276 | add esp, 4 |
Line 263... | Line 277... | ||
263 | 277 | ||
264 | .gohome: |
278 | .gohome: |
Line 265... | Line 279... | ||
265 | ret ; return 1. to get more from queue / 2. to caller |
279 | ret ; return to get more from queue / to caller |
266 | 280 | ||
267 | 281 | ||
268 | 282 | ||
269 | ;----------------------------------------------------------------- |
283 | ;----------------------------------------------------------------- |
270 | ; |
284 | ; |
271 | ; ETH_Sender: |
285 | ; ETH_sender: |
272 | ; |
286 | ; |
Line 278... | Line 292... | ||
278 | ; OUT: / |
292 | ; OUT: / |
279 | ; |
293 | ; |
280 | ;----------------------------------------------------------------- |
294 | ;----------------------------------------------------------------- |
Line 281... | Line 295... | ||
281 | 295 | ||
282 | align 4 |
296 | align 4 |
283 | ETH_Sender: |
297 | ETH_sender: |
Line -... | Line 298... | ||
- | 298 | DEBUGF 1,"ETH_Sender: queuing for device: %x, %u bytes\n", [esp], [esp + 4] |
|
- | 299 | ||
284 | DEBUGF 1,"ETH_Sender \n" |
300 | push ebx |
- | 301 | mov esi, esp |
|
- | 302 | add_to_queue ETH_OUT_QUEUE, ETH_QUEUE_SIZE, eth_queue_entry.size, .fail |
|
- | 303 | DEBUGF 1,"Queued packet successfully\n" |
|
Line 285... | Line 304... | ||
285 | 304 | add esp, 3*4 |
|
- | 305 | ret |
|
- | 306 | ||
- | 307 | .fail: |
|
- | 308 | DEBUGF 1,"ETH_OUT_QUEUE is full!\n" |
|
286 | add_to_queue ETH_OUT_QUEUE, ETH_QUEUE_SIZE, .gohome |
309 | add esp, 4 |
Line -... | Line 310... | ||
- | 310 | call kernel_free |
|
- | 311 | add esp, 4 |
|
- | 312 | ret |
|
- | 313 | ||
- | 314 | ||
- | 315 | ||
- | 316 | ;----------------------------------------------------------------- |
|
- | 317 | ; |
|
- | 318 | ; ETH_send_queued: |
|
- | 319 | ; |
|
287 | 320 | ; IN: / |
|
288 | .gohome: |
321 | ; OUT: / |
Line 289... | Line 322... | ||
289 | ret |
322 | ; |
- | 323 | ;----------------------------------------------------------------- |
|
- | 324 | ||
- | 325 | align 4 |
|
- | 326 | ETH_send_queued: |
|
- | 327 | ||
- | 328 | get_from_queue ETH_OUT_QUEUE, ETH_QUEUE_SIZE, eth_queue_entry.size, .gohome |
|
- | 329 | ||
- | 330 | push ETH_send_queued |
|
- | 331 | ||
- | 332 | lodsd |
|
- | 333 | mov ebx, eax |
|
- | 334 | ||
Line 290... | Line 335... | ||
290 | 335 | sub esp, 8 |
|
291 | 336 | mov edi, esp |
|
292 | align 4 |
337 | movsd |
Line 293... | Line -... | ||
293 | ETH_send_queued: |
- | |
294 | - | ||
295 | get_from_queue ETH_OUT_QUEUE, ETH_QUEUE_SIZE, .gohome |
338 | movsd |
Line 296... | Line 339... | ||
296 | 339 | ||
297 | call ETH_struc2dev ; convert struct ptr to device num (this way we know if driver is still mounted) |
340 | DEBUGF 1,"dequeued packet for device %x\n", ebx |
298 | cmp edi, -1 |
341 | |
299 | je .fail |
342 | call ETH_struc2dev ; convert struct ptr to device num (this way we know if driver is still mounted) |
- | 343 | cmp edi, -1 |
|
300 | 344 | je .fail |
|
301 | DEBUGF 1,"ETH_Sender - device: %u\n", edi |
345 | |
Line -... | Line 346... | ||
- | 346 | jmp [ebx+ETH_DEVICE.transmit] ; we will return to get_from_queue macro after transmitting packet |
|
302 | 347 | ||
303 | jmp [ebx+ETH_DEVICE.transmit] |
348 | .fail: |
304 | 349 | call kernel_free |
|
305 | .fail: |
350 | add esp, 4 ; pop (balance stack) |
306 | call kernel_free |
351 | DEBUGF 1,"ETH_Sender - fail\n" |
Line 360... | Line 405... | ||
360 | ; esi points to procedure wich needs to be called to send packet |
405 | ; esi points to procedure wich needs to be called to send packet |
361 | ; |
406 | ; |
362 | ;--------------------------------------------------------------------------- |
407 | ;--------------------------------------------------------------------------- |
Line 363... | Line 408... | ||
363 | 408 | ||
364 | align 4 |
409 | align 4 |
Line 365... | Line 410... | ||
365 | ETH_create_Packet: |
410 | ETH_create_packet: |
Line 366... | Line 411... | ||
366 | 411 | ||
367 | DEBUGF 1,"Creating Ethernet Packet (size=%u): \n", ecx |
412 | DEBUGF 1,"Creating Ethernet Packet (size=%u): \n", ecx |
Line 392... | Line 437... | ||
392 | stosw |
437 | stosw |
Line 393... | Line 438... | ||
393 | 438 | ||
394 | lea eax, [edi - ETH_FRAME.Data] ; Set eax to buffer start |
439 | lea eax, [edi - ETH_FRAME.Data] ; Set eax to buffer start |
395 | mov edx, ecx ; Set ebx to complete buffer size |
440 | mov edx, ecx ; Set ebx to complete buffer size |
396 | pop ecx |
441 | pop ecx |
Line 397... | Line 442... | ||
397 | mov esi, ETH_Sender |
442 | mov esi, ETH_sender |
398 | 443 | ||
Line 399... | Line 444... | ||
399 | xor ebx, ebx ;;;; TODO: Fixme |
444 | xor ebx, ebx ;;;; TODO: Fixme |