Rhine: Improved interrupt handeling.
git-svn-id: svn://kolibrios.org@9157 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
785dcb3341
commit
650af770ae
@ -1,6 +1,6 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2010-2015. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2010-2021. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; rhine.asm ;;
|
;; rhine.asm ;;
|
||||||
@ -21,6 +21,8 @@
|
|||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
; TODO: test for RX-overrun
|
||||||
|
|
||||||
format PE DLL native
|
format PE DLL native
|
||||||
entry START
|
entry START
|
||||||
|
|
||||||
@ -33,8 +35,8 @@ entry START
|
|||||||
__DEBUG__ = 1
|
__DEBUG__ = 1
|
||||||
__DEBUG_LEVEL__ = 2 ; 1 = all, 2 = errors only
|
__DEBUG_LEVEL__ = 2 ; 1 = all, 2 = errors only
|
||||||
|
|
||||||
TX_RING_SIZE = 4
|
TX_RING_SIZE = 32
|
||||||
RX_RING_SIZE = 4
|
RX_RING_SIZE = 32
|
||||||
|
|
||||||
; max time out delay time
|
; max time out delay time
|
||||||
W_MAX_TIMEOUT = 0x0FFF
|
W_MAX_TIMEOUT = 0x0FFF
|
||||||
@ -1405,13 +1407,13 @@ read_mac:
|
|||||||
;; ;;
|
;; ;;
|
||||||
;; In: buffer pointer in [esp+4] ;;
|
;; In: buffer pointer in [esp+4] ;;
|
||||||
;; pointer to device structure in ebx ;;
|
;; pointer to device structure in ebx ;;
|
||||||
|
;; Out: eax = 0 on success ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
align 4
|
align 16
|
||||||
proc transmit stdcall bufferptr
|
proc transmit stdcall bufferptr
|
||||||
|
|
||||||
pushf
|
spin_lock_irqsave
|
||||||
cli
|
|
||||||
|
|
||||||
mov esi, [bufferptr]
|
mov esi, [bufferptr]
|
||||||
DEBUGF 1,"Transmitting packet, buffer:%x, size:%u\n", [bufferptr], [esi + NET_BUFF.length]
|
DEBUGF 1,"Transmitting packet, buffer:%x, size:%u\n", [bufferptr], [esi + NET_BUFF.length]
|
||||||
@ -1422,10 +1424,11 @@ proc transmit stdcall bufferptr
|
|||||||
[eax+13]:2,[eax+12]:2
|
[eax+13]:2,[eax+12]:2
|
||||||
|
|
||||||
cmp [esi + NET_BUFF.length], 1514
|
cmp [esi + NET_BUFF.length], 1514
|
||||||
ja .fail
|
ja .error
|
||||||
cmp [esi + NET_BUFF.length], 60
|
cmp [esi + NET_BUFF.length], 60
|
||||||
jb .fail
|
jb .error
|
||||||
|
|
||||||
|
; Program the descriptor
|
||||||
movzx eax, [ebx + device.cur_tx]
|
movzx eax, [ebx + device.cur_tx]
|
||||||
mov ecx, sizeof.tx_head
|
mov ecx, sizeof.tx_head
|
||||||
mul ecx
|
mul ecx
|
||||||
@ -1433,7 +1436,7 @@ proc transmit stdcall bufferptr
|
|||||||
add edi, eax
|
add edi, eax
|
||||||
|
|
||||||
cmp [edi + tx_head.buff_addr_virt], 0
|
cmp [edi + tx_head.buff_addr_virt], 0
|
||||||
jne .fail
|
jne .overrun
|
||||||
|
|
||||||
mov eax, esi
|
mov eax, esi
|
||||||
mov [edi + tx_head.buff_addr_virt], eax
|
mov [edi + tx_head.buff_addr_virt], eax
|
||||||
@ -1463,18 +1466,29 @@ proc transmit stdcall bufferptr
|
|||||||
add dword [ebx + device.bytes_tx], ecx
|
add dword [ebx + device.bytes_tx], ecx
|
||||||
adc dword [ebx + device.bytes_tx + 4], 0
|
adc dword [ebx + device.bytes_tx + 4], 0
|
||||||
|
|
||||||
DEBUGF 1,"Transmit OK\n"
|
spin_unlock_irqrestore
|
||||||
popf
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.fail:
|
.error:
|
||||||
DEBUGF 2,"Transmit failed\n"
|
DEBUGF 2, "TX packet error\n"
|
||||||
|
inc [ebx + device.packets_tx_err]
|
||||||
invoke NetFree, [bufferptr]
|
invoke NetFree, [bufferptr]
|
||||||
popf
|
|
||||||
|
spin_unlock_irqrestore
|
||||||
or eax, -1
|
or eax, -1
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
.overrun:
|
||||||
|
DEBUGF 2, "TX overrun\n"
|
||||||
|
inc [ebx + device.packets_tx_ovr]
|
||||||
|
invoke NetFree, [bufferptr]
|
||||||
|
|
||||||
|
spin_unlock_irqrestore
|
||||||
|
or eax, -1
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
|
||||||
@ -1484,41 +1498,22 @@ endp
|
|||||||
;; Interrupt handler ;;
|
;; Interrupt handler ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
align 16
|
||||||
align 4
|
|
||||||
int_handler:
|
int_handler:
|
||||||
|
|
||||||
push ebx esi edi
|
push ebx esi edi
|
||||||
|
|
||||||
DEBUGF 1,"INT\n"
|
mov ebx, [esp+4*4]
|
||||||
|
DEBUGF 1,"INT for 0x%x\n", ebx
|
||||||
; Find pointer of device which made IRQ occur
|
|
||||||
mov ecx, [devices]
|
|
||||||
test ecx, ecx
|
|
||||||
jz .nothing
|
|
||||||
mov esi, device_list
|
|
||||||
.nextdevice:
|
|
||||||
mov ebx, [esi]
|
|
||||||
|
|
||||||
set_io [ebx + device.io_addr], 0
|
set_io [ebx + device.io_addr], 0
|
||||||
set_io [ebx + device.io_addr], IntrStatus
|
set_io [ebx + device.io_addr], IntrStatus
|
||||||
in ax, dx
|
in ax, dx
|
||||||
out dx, ax ; send it back to ACK
|
|
||||||
test ax, ax
|
test ax, ax
|
||||||
jnz .got_it
|
jz .nothing
|
||||||
.continue:
|
|
||||||
add esi, 4
|
|
||||||
dec ecx
|
|
||||||
jnz .nextdevice
|
|
||||||
.nothing:
|
|
||||||
pop edi esi ebx
|
|
||||||
xor eax, eax
|
|
||||||
|
|
||||||
ret ; If no device was found, abort (The irq was probably for a device, not registered to this driver)
|
out dx, ax ; ACK interrupt
|
||||||
|
DEBUGF 1, "Status=0x%x\n", ax
|
||||||
|
|
||||||
.got_it:
|
|
||||||
DEBUGF 1, "status=0x%x\n", ax
|
|
||||||
|
|
||||||
push ax
|
push ax
|
||||||
|
|
||||||
@ -1652,6 +1647,11 @@ end if
|
|||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
.nothing:
|
||||||
|
pop edi esi ebx
|
||||||
|
xor eax, eax
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user