RTL8169: Fail graciously when out of mem.

git-svn-id: svn://kolibrios.org@5567 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2015-06-01 22:06:51 +00:00
parent 042ae8524e
commit 803d1a2842
1 changed files with 26 additions and 7 deletions

View File

@ -167,7 +167,12 @@ include '../netdrv.inc'
MT_1000_Full = 0x10 MT_1000_Full = 0x10
; _TBICSRBit ; _TBICSRBit
TBI_LinkOK = 0x02000000 TBI_RESET = 0x80000000
TBI_LOOPBACK = 0x40000000
TBI_NW_ENABLE = 0x20000000
TBI_NW_RESTART = 0x10000000
TBI_LINK_OK = 0x02000000
TBI_NW_COMPLETE = 0x01000000
; _DescStatusBit ; _DescStatusBit
DSB_OWNbit = 0x80000000 DSB_OWNbit = 0x80000000
@ -559,6 +564,7 @@ init_board:
mov [ebx + device.mac_version], eax mov [ebx + device.mac_version], eax
mov eax, [esi+12] mov eax, [esi+12]
mov [ebx + device.name], eax mov [ebx + device.name], eax
DEBUGF 2, "Detected chip: %s\n", eax
xor eax, eax xor eax, eax
ret ret
@ -1147,7 +1153,7 @@ int_handler:
push ax push ax
push ebx push ebx
.check_more: .rx_loop:
pop ebx pop ebx
mov eax, sizeof.rx_desc mov eax, sizeof.rx_desc
mul [ebx + device.cur_rx] mul [ebx + device.cur_rx]
@ -1155,16 +1161,15 @@ int_handler:
DEBUGF 1,"RxDesc.status = 0x%x\n", [esi + rx_desc.status] DEBUGF 1,"RxDesc.status = 0x%x\n", [esi + rx_desc.status]
mov ecx, [esi + rx_desc.status] mov ecx, [esi + rx_desc.status]
test ecx, DSB_OWNbit ;;; test ecx, DSB_OWNbit
jnz .rx_return jnz .rx_return
DEBUGF 1,"cur_rx = %u\n", [ebx + device.cur_rx] DEBUGF 1,"cur_rx = %u\n", [ebx + device.cur_rx]
test ecx, SD_RxRES test ecx, SD_RxRES
jnz .rx_return ;;;;; RX error! jnz .rx_reuse
push ebx push ebx
push .check_more push .rx_loop
and ecx, 0x00001FFF and ecx, 0x00001FFF
add ecx, -4 ; we dont need CRC add ecx, -4 ; we dont need CRC
DEBUGF 1,"data length = %u\n", ecx DEBUGF 1,"data length = %u\n", ecx
@ -1184,7 +1189,10 @@ int_handler:
;---------------------- ;----------------------
; Allocate a new buffer ; Allocate a new buffer
mov [esi + rx_desc.status], 0
invoke NetAlloc, RX_BUF_SIZE+NET_BUFF.data invoke NetAlloc, RX_BUF_SIZE+NET_BUFF.data
test eax, eax
jz .no_more_buffers
mov [esi + rx_desc.buf_soft_addr], eax mov [esi + rx_desc.buf_soft_addr], eax
invoke GetPhysAddr invoke GetPhysAddr
add eax, NET_BUFF.data add eax, NET_BUFF.data
@ -1200,6 +1208,7 @@ int_handler:
@@: @@:
mov [esi + rx_desc.status], eax mov [esi + rx_desc.status], eax
.no_more_buffers:
;-------------- ;--------------
; Update rx ptr ; Update rx ptr
@ -1207,8 +1216,18 @@ int_handler:
and [ebx + device.cur_rx], NUM_RX_DESC - 1 and [ebx + device.cur_rx], NUM_RX_DESC - 1
jmp [EthInput] jmp [EthInput]
.rx_return:
.rx_reuse:
mov eax, DSB_OWNbit or RX_BUF_SIZE
cmp [ebx + device.cur_rx], NUM_RX_DESC - 1
jne @f
or eax, DSB_EORbit
@@:
mov [esi + rx_desc.status], eax
push ebx
jmp .rx_loop
.rx_return:
pop ax pop ax
.no_rx: .no_rx: