some updates for i8254x driver

git-svn-id: svn://kolibrios.org@2925 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2012-08-16 13:42:00 +00:00
parent 8140e5df69
commit 78aa083db1

View File

@ -260,6 +260,9 @@ virtual at ebx
.pci_dev dd ? .pci_dev dd ?
.irq_line db ? .irq_line db ?
.cur_tx dd ?
.last_tx dd ?
rb 0x100 - (($ - device) and 0xff) rb 0x100 - (($ - device) and 0xff)
.rx_desc rd 256/8 .rx_desc rd 256/8
@ -409,6 +412,8 @@ proc service_proc stdcall, ioctl:dword
mov [device_list+4*eax], ebx ; (IRQ handler uses this list to find device) mov [device_list+4*eax], ebx ; (IRQ handler uses this list to find device)
inc [devices] ; inc [devices] ;
call start_i8254x
mov [device.type], NET_TYPE_ETH mov [device.type], NET_TYPE_ETH
call NetRegDev call NetRegDev
@ -493,7 +498,7 @@ probe:
@@: @@:
reset: reset_dontstart:
DEBUGF 1,"Reset\n" DEBUGF 1,"Reset\n"
mov esi, [device.mmio_addr] mov esi, [device.mmio_addr]
@ -548,6 +553,11 @@ reset:
mov dword [esi + REG_TCTL], 0x010400fa ; Enabled, Pad Short Packets, 15 retrys, 64-byte COLD, Re-transmit on Late Collision mov dword [esi + REG_TCTL], 0x010400fa ; Enabled, Pad Short Packets, 15 retrys, 64-byte COLD, Re-transmit on Late Collision
mov dword [esi + REG_TIPG], 0x0060200A ; IPGT 10, IPGR1 8, IPGR2 6 mov dword [esi + REG_TIPG], 0x0060200A ; IPGT 10, IPGR1 8, IPGR2 6
xor eax, eax
ret
start_i8254x:
xor eax, eax xor eax, eax
mov [esi + REG_RDTR], eax ; Clear the Receive Delay Timer Register mov [esi + REG_RDTR], eax ; Clear the Receive Delay Timer Register
mov [esi + REG_RADV], eax ; Clear the Receive Interrupt Absolute Delay Timer mov [esi + REG_RADV], eax ; Clear the Receive Interrupt Absolute Delay Timer
@ -561,6 +571,13 @@ reset:
xor eax, eax xor eax, eax
ret ret
align 4
reset:
call reset_dontstart
call start_i8254x
ret
align 4 align 4
@ -626,6 +643,7 @@ transmit:
cmp dword [esp + 8], 60 cmp dword [esp + 8], 60
jl .fail jl .fail
; Program the descriptor (use legacy mode) ; Program the descriptor (use legacy mode)
lea edi, [device.tx_desc] ; Transmit Descriptor Base Address lea edi, [device.tx_desc] ; Transmit Descriptor Base Address
mov dword [edi + 16], eax ; Store the data location (for driver) mov dword [edi + 16], eax ; Store the data location (for driver)
@ -694,10 +712,16 @@ int_handler:
push eax push eax
push .retaddr push .retaddr
movzx ecx, word [device.rx_desc + 8] ; Get the packet length ; Get last descriptor addr
lea esi, [device.rx_desc]
cmp byte [esi + 12], 0 ; Check status field
je .retaddr
movzx ecx, word [esi + 8] ; Get the packet length
DEBUGF 2,"got %u bytes\n", ecx DEBUGF 2,"got %u bytes\n", ecx
push ecx push ecx
push [device.rx_desc + 16] ; Get packet pointer push dword [esi + 16] ; Get packet pointer
; Update stats ; Update stats
add dword [device.bytes_rx], ecx add dword [device.bytes_rx], ecx
@ -706,9 +730,9 @@ int_handler:
; allocate new descriptor ; allocate new descriptor
stdcall KernelAlloc, 48*1024 stdcall KernelAlloc, 48*1024
mov dword [device.rx_desc + 16], eax mov dword [esi + 16], eax
GetRealAddr GetRealAddr
mov dword [device.rx_desc], eax mov dword [esi], eax
; reset descriptor status ; reset descriptor status
mov esi, [device.mmio_addr] mov esi, [device.mmio_addr]
@ -738,7 +762,10 @@ int_handler:
jz .no_tx jz .no_tx
DEBUGF 2,"Transmit done\n" DEBUGF 2,"Transmit done\n"
; TODO: clear up used buffers
lea edi, [device.tx_desc] ; Transmit Descriptor Base Address
push dword [edi + 16] ; Store the data location (for driver)
call KernelFree
.no_tx: .no_tx:
.fail: .fail: