forked from KolibriOS/kolibrios
Some more bugfixes and cleanup of RTL8029 driver.
Driver works on real hardware, but is not stable yet. git-svn-id: svn://kolibrios.org@1178 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
740caf3d0d
commit
68b0c1de2a
@ -1,16 +1,20 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;; ne2000 driver for KolibriOS ;;
|
||||
;; RTL8029/ne2000 driver for KolibriOS ;;
|
||||
;; ;;
|
||||
;; Written by hidnplayr@kolibrios.org ;;
|
||||
;; with help from CleverMouse ;;
|
||||
;; ;;
|
||||
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||
;; Version 2, June 1991 ;;
|
||||
;; ;;
|
||||
;; current status (september 2009) - INCOMPLETE ;;
|
||||
;; current status (september 2009) - UNSTABLE ;;
|
||||
;; ;;
|
||||
;; based on RTL8029.asm driver for menuetos ;;
|
||||
;; and realtek8029.asm for SolarOS by Eugen Brasoveanu ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
@ -298,7 +302,7 @@ proc service_proc ;stdcall, ioctl:dword
|
||||
|
||||
mov edx, PCI_BASE_ADDRESS_0 ; find the base io address
|
||||
.sb_reg_check:
|
||||
;
|
||||
|
||||
movzx eax, byte [ebx+device.pci_bus] ;
|
||||
movzx ecx, byte [ebx+device.pci_dev] ;
|
||||
;
|
||||
@ -415,6 +419,7 @@ create_new_struct:
|
||||
mov dword [ebx+device.get_MAC], read_mac
|
||||
mov dword [ebx+device.set_MAC], write_mac
|
||||
mov dword [ebx+device.unload], unload
|
||||
mov dword [ebx+device.name], my_service
|
||||
|
||||
ret
|
||||
|
||||
@ -585,18 +590,16 @@ ep_check_have_vendor:
|
||||
mov eax, [ebp + device.bmem]
|
||||
mov [ebp + device.rmem], eax
|
||||
|
||||
;-- hack
|
||||
;-- hack (read mac from eeprom ant write it to hardware's register)
|
||||
mov ebx, ebp
|
||||
call read_mac
|
||||
|
||||
|
||||
push .hack
|
||||
sub esp, 6
|
||||
mov edi, esp
|
||||
lea esi, [ebp + device.mac]
|
||||
movsd
|
||||
movsw
|
||||
|
||||
jmp write_mac
|
||||
.hack:
|
||||
;--- hack
|
||||
@ -613,8 +616,7 @@ ep_check_have_vendor:
|
||||
reset:
|
||||
mov ebp, ebx ;---
|
||||
|
||||
|
||||
DEBUGF 2,"Resetting rtl8029\n"
|
||||
DEBUGF 2,"Resetting device\n"
|
||||
|
||||
; attach int handler
|
||||
movzx eax, [ebp+device.irq_line]
|
||||
@ -734,6 +736,12 @@ nsr_002:
|
||||
mov al, 0 ; no loopback
|
||||
out dx, al
|
||||
|
||||
; clear packet/byte counters
|
||||
|
||||
lea edi, [ebp+device.bytes_tx]
|
||||
mov ecx, 6
|
||||
rep stosd
|
||||
|
||||
|
||||
; Indicate that we have successfully reset the card
|
||||
DEBUGF 2,"Done!\n"
|
||||
@ -792,6 +800,12 @@ transmit:
|
||||
out dx, al
|
||||
|
||||
DEBUGF 2," - Packet Sent!\n"
|
||||
|
||||
inc [ebp+device.packets_tx] ;
|
||||
mov eax, [esp+4] ; Get packet size in eax
|
||||
|
||||
add dword [ebp + device.bytes_tx], eax
|
||||
adc dword [ebp + device.bytes_tx + 4], 0
|
||||
.finish:
|
||||
mov ebx, ebp
|
||||
|
||||
@ -818,13 +832,13 @@ int_handler:
|
||||
.nextdevice:
|
||||
mov ebp, dword [esi]
|
||||
|
||||
set_io 0 ; We chould check ISR instead..
|
||||
set_io 0
|
||||
set_io P0_ISR
|
||||
in al, dx
|
||||
|
||||
DEBUGF 2,"isr %x ",eax:2
|
||||
|
||||
test al, ISR_PRX
|
||||
test al, ISR_PRX ; packet received ok ?
|
||||
jnz .rx
|
||||
|
||||
add esi, 4
|
||||
@ -832,11 +846,18 @@ int_handler:
|
||||
loop .nextdevice
|
||||
ret
|
||||
|
||||
; looks like we've found it!
|
||||
|
||||
|
||||
; looks like we've found a device wich received a packet..
|
||||
.rx:
|
||||
stdcall KernelAlloc, ETH_FRAME_LEN ; size doesnt really matter as packet size is smaller then kernel's page size
|
||||
test eax, eax
|
||||
jz .fail_2
|
||||
|
||||
;--------------------------------------
|
||||
; allocate memory for temp variables in stack
|
||||
|
||||
sub esp, 14+8 ; allocate memory for temp variables in stack
|
||||
sub esp, 14+8
|
||||
|
||||
eth_type equ esp
|
||||
pkthdr equ esp + 2
|
||||
@ -844,10 +865,13 @@ int_handler:
|
||||
eth_rx_data_ptr equ esp + 8
|
||||
eth_tmp_len equ esp + 12
|
||||
|
||||
; These will be used by eth_receiver when the packet gets there
|
||||
|
||||
pointer equ esp + 14
|
||||
size equ esp + 18
|
||||
|
||||
stdcall KernelAlloc, ETH_FRAME_LEN
|
||||
;-------------------------------------
|
||||
|
||||
mov [pointer], eax
|
||||
mov [eth_rx_data_ptr], eax
|
||||
|
||||
@ -910,45 +934,53 @@ int_handler:
|
||||
add word[pktoff] , 4
|
||||
|
||||
xor eax, eax
|
||||
mov ax, [pkthdr + 2]
|
||||
sub ax, 4
|
||||
mov ax , [pkthdr + 2]
|
||||
sub ax , 4
|
||||
|
||||
DEBUGF 2,"Received %u bytes\n",eax
|
||||
|
||||
add dword [ebp + device.bytes_rx], eax ; Update stats
|
||||
adc dword [ebp + device.bytes_rx + 4], 0
|
||||
inc dword [ebp + device.packets_rx] ;
|
||||
|
||||
mov [eth_tmp_len], ax
|
||||
mov dword[size], eax
|
||||
|
||||
cmp ax, ETH_ZLEN
|
||||
jb .fail
|
||||
|
||||
cmp ax, ETH_FRAME_LEN
|
||||
cmp ax , ETH_FRAME_LEN
|
||||
ja .fail
|
||||
|
||||
mov al, [pkthdr]
|
||||
test al, RSTAT_PRX
|
||||
mov al , [pkthdr]
|
||||
test al , RSTAT_PRX
|
||||
jz .fail
|
||||
|
||||
; Right, we can now get the data
|
||||
|
||||
mov bh, [ebp + device.memsize]
|
||||
sub bx, [pktoff]
|
||||
xor ebx, ebx
|
||||
mov bh , [ebp + device.memsize]
|
||||
sub bx , [pktoff]
|
||||
|
||||
cmp [eth_tmp_len], bx
|
||||
jbe .nsp_005
|
||||
|
||||
mov al, [ebp + device.flags]
|
||||
test al, FLAG_PIO
|
||||
DEBUGF 2,"tadaa!\n"
|
||||
|
||||
mov al , [ebp + device.flags]
|
||||
test al , FLAG_PIO
|
||||
jz .nsp_006
|
||||
|
||||
push bx
|
||||
mov cx, bx
|
||||
mov bx, [pktoff]
|
||||
mov edi, [eth_rx_data_ptr]
|
||||
push ebx
|
||||
mov cx , bx
|
||||
mov bx , [pktoff+4]
|
||||
mov edi, [eth_rx_data_ptr+4]
|
||||
call eth_pio_read
|
||||
pop bx
|
||||
pop ebx
|
||||
jmp .nsp_007
|
||||
|
||||
.nsp_006:
|
||||
DEBUGF 2,"PIO mode not supported by HW!\n"
|
||||
; Not implemented, as we are using PIO mode on this card
|
||||
|
||||
.nsp_007:
|
||||
@ -975,6 +1007,7 @@ int_handler:
|
||||
jmp .nsp_009
|
||||
|
||||
.nsp_008:
|
||||
DEBUGF 2,"PIO mode not supported by HW!\n"
|
||||
; Not implemented, as we are using PIO mode on this card
|
||||
|
||||
.nsp_009:
|
||||
@ -990,13 +1023,15 @@ int_handler:
|
||||
dec al
|
||||
out dx, al
|
||||
|
||||
mov ebx, ebp
|
||||
add esp, 14
|
||||
|
||||
mov ebx, ebp
|
||||
jmp EthReceiver ;;;
|
||||
jmp EthReceiver ; send it to the kernel
|
||||
|
||||
.fail:
|
||||
add esp, 14+8
|
||||
.fail_2:
|
||||
DEBUGF 2,"done\n"
|
||||
ret
|
||||
|
||||
@ -1011,7 +1046,7 @@ ret
|
||||
;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
align 4
|
||||
write_mac: ; in: mac on stack
|
||||
write_mac: ; in: mac on stack (6 bytes)
|
||||
|
||||
mov ebp, ebx ;---
|
||||
|
||||
@ -1062,9 +1097,6 @@ read_mac:
|
||||
; inc dx
|
||||
; loopw .loop
|
||||
;
|
||||
; lea edi, [ebp + device.mac]
|
||||
; DEBUGF 1,"%x-%x-%x-%x-%x-%x\n",[edi+0]:2,[edi+1]:2,[edi+2]:2,[edi+3]:2,[edi+4]:2,[edi+5]:2
|
||||
;
|
||||
; set_io 0
|
||||
; mov al, CMD_PS0; + CMD_RD2 + CMD_STA ; set page back to 0
|
||||
; out dx, al
|
||||
@ -1087,6 +1119,7 @@ read_mac:
|
||||
.8bit:
|
||||
loop .loop
|
||||
|
||||
DEBUGF 1,"%x-%x-%x-%x-%x-%x\n",[edi-6]:2,[edi-5]:2,[edi-4]:2,[edi-3]:2,[edi-2]:2,[edi-1]:2
|
||||
|
||||
mov ebx, ebp ;---
|
||||
|
||||
@ -1261,24 +1294,21 @@ align 4
|
||||
|
||||
ne2000_DEV dd 0
|
||||
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
|
||||
my_service db 'ne2000',0 ;max 16 chars include zero
|
||||
devicename db 'Realtek 8029',0
|
||||
db 'Realtek 8019',0
|
||||
db 'Realtek 8019AS',0
|
||||
db 'ne2000',0
|
||||
db 'DP8390',0
|
||||
my_service db 'RTL8029/ne2000',0 ;max 16 chars include zero
|
||||
|
||||
device_1 db 'Realtek 8029',0
|
||||
device_2 db 'Realtek 8019',0
|
||||
device_3 db 'Realtek 8019AS',0
|
||||
device_4 db 'ne2000',0
|
||||
device_5 db 'DP8390',0
|
||||
|
||||
test_data db 'NE*000 memory',0
|
||||
;test_buffer db ' ',0
|
||||
|
||||
include_debug_strings
|
||||
|
||||
section '.data' data readable writable align 16
|
||||
section '.data' data readable writable align 16 ;place all uninitialized data place here
|
||||
|
||||
;place all uninitialized data place here
|
||||
|
||||
ne2000_LIST:
|
||||
rd MAX_ne2000
|
||||
ne2000_LIST rd MAX_ne2000
|
||||
|
||||
|
||||
|
||||
|
@ -362,7 +362,7 @@ proc service_proc stdcall, ioctl:dword
|
||||
mov dword [ebx+device.get_MAC], read_mac
|
||||
mov dword [ebx+device.set_MAC], write_mac
|
||||
mov dword [ebx+device.unload], unload
|
||||
mov dword [ebx+device.name], devicename
|
||||
mov dword [ebx+device.name], my_service
|
||||
|
||||
; save the pci bus and device numbers
|
||||
|
||||
@ -555,6 +555,13 @@ probe:
|
||||
.chip_ver_found:
|
||||
mov [ebx+device.hw_ver_id], cl
|
||||
|
||||
shl ecx, 2
|
||||
add ecx, name_crosslist
|
||||
mov ecx, [ecx]
|
||||
mov dword [ebx+device.name], ecx
|
||||
|
||||
DEBUGF 1,"Chip version: %s\n",ecx
|
||||
|
||||
; wake up the chip
|
||||
|
||||
mov edx, [ebx+device.io_addr]
|
||||
@ -1290,7 +1297,24 @@ align 4 ; Place all initialised data here
|
||||
RTL8139_DEV dd 0
|
||||
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
|
||||
my_service db 'RTL8139',0 ; max 16 chars include zero
|
||||
devicename db 'Realtek 8139',0
|
||||
|
||||
device_1 db 'Realtek 8139',0
|
||||
device_2 db 'Realtek 8139A',0
|
||||
device_3 db 'Realtek 8139B',0
|
||||
device_4 db 'Realtek 8139C',0
|
||||
device_5 db 'Realtek 8100',0
|
||||
device_6 db 'Realtek 8139D',0
|
||||
device_7 db 'Realtek 8139CP',0
|
||||
device_8 db 'Realtek 8101',0
|
||||
|
||||
name_crosslist dd device_1
|
||||
dd device_2
|
||||
dd device_3
|
||||
dd device_4
|
||||
dd device_5
|
||||
dd device_6
|
||||
dd device_7
|
||||
dd device_8
|
||||
|
||||
hw_ver_array db VER_RTL8139 ; This array is used by the probe routine to find out wich version of the RTL8139 we are working with
|
||||
db VER_RTL8139A
|
||||
|
Loading…
Reference in New Issue
Block a user