236,25 → 236,14 |
PCFG_METHOD_2 equ 0x02 ; PHY Reg 0x03 bit0-3 == 0x0001 |
PCFG_METHOD_3 equ 0x03 ; PHY Reg 0x03 bit0-3 == 0x0002 |
|
PCI_COMMAND_IO equ 0x1 ; Enable response in I/O space |
PCI_COMMAND_MEM equ 0x2 ; Enable response in mem space |
PCI_COMMAND_MASTER equ 0x4 ; Enable bus mastering |
PCI_LATENCY_TIMER equ 0x0d ; 8 bits |
PCI_COMMAND_SPECIAL equ 0x8 ; Enable response to special cycles |
PCI_COMMAND_INVALIDATE equ 0x10 ; Use memory write and invalidate |
PCI_COMMAND_VGA_PALETTE equ 0x20 ; Enable palette snooping |
PCI_COMMAND_PARITY equ 0x40 ; Enable parity checking |
PCI_COMMAND_WAIT equ 0x80 ; Enable address/data stepping |
PCI_COMMAND_SERR equ 0x100 ; Enable SERR |
PCI_COMMAND_FAST_BACK equ 0x200 ; Enable back-to-back writes |
|
virtual at 0 |
tx_desc: |
.status dd ? |
.vlan_tag dd ? |
.buf_addr dd ? |
.buf_Haddr dd ? |
.buf_addr dq ? |
.size = $ |
rb (NUM_TX_DESC-1)*tx_desc.size |
.buf_soft_addr dd ? |
end virtual |
|
virtual at 0 |
261,9 → 250,10 |
rx_desc: |
.status dd ? |
.vlan_tag dd ? |
.buf_addr dd ? |
.buf_Haddr dd ? |
.buf_addr dq ? |
.size = $ |
rb (NUM_RX_DESC-1)*rx_desc.size |
.buf_soft_addr dd ? |
end virtual |
|
virtual at ebx |
289,11 → 279,11 |
.TxDescArray dd ? ; Index of 256-alignment Tx Descriptor buffer |
.RxDescArray dd ? ; Index of 256-alignment Rx Descriptor buffer |
|
rb 255-(($ - ebx) and 255) ; align 256 |
tx_ring rb NUM_TX_DESC * tx_desc.size |
rb 256-(($ - device) and 255) ; align 256 |
tx_ring rb NUM_TX_DESC * tx_desc.size * 2 |
|
rb 255-(($ - ebx) and 255) ; align 256 |
rx_ring rb NUM_RX_DESC * rx_desc.size |
rb 256-(($ - device) and 255) ; align 256 |
rx_ring rb NUM_RX_DESC * rx_desc.size * 2 |
|
device_size = $ - device |
|
330,14 → 320,13 |
|
local .error, .done |
|
set_io REG_PHYAR |
mov eax, RegAddr shl 16 |
set_io REG_PHYAR |
in eax, dx |
out dx, eax |
|
call PHY_WAIT |
jz .error |
|
set_io REG_PHYAR |
in eax, dx |
and eax, 0xFFFF |
jmp .done |
354,7 → 343,7 |
|
push ecx |
mov ecx, 2000 |
; Check if the RTL8169 has completed writing to the specified MII register |
; Check if the RTL8169 has completed writing/reading to the specified MII register |
@@: |
in eax, dx |
test eax, 0x80000000 |
456,12 → 445,7 |
cmp [devices], MAX_DEVICES ; First check if the driver can handle one more card |
jge .fail |
|
push edx |
stdcall KernelAlloc, device_size ; Allocate the buffer for eth_device structure |
pop edx |
test eax, eax |
jz .fail |
mov ebx, eax ; ebx is always used as a pointer to the structure (in driver, but also in kernel code) |
allocate_and_clear ebx, device_size, .fail ; Allocate memory to put the device structure in |
|
; Fill in the direct call addresses into the struct |
|
689,11 → 673,11 |
; wait for auto-negotiation process |
@@: dec ecx |
jz @f |
set_io 0 |
READ_GMII_REG PHY_STAT_REG |
udelay 100 |
test eax, PHY_Auto_Neco_Comp |
jz @b |
set_io 0 |
set_io REG_PHYstatus |
in al, dx |
jmp @f |
730,7 → 714,6 |
mov [device.mtu], 1500 |
|
xor eax, eax |
|
ret |
|
|
744,6 → 727,7 |
|
cmp [tpc.mcfg], MCFG_METHOD_04 |
jne .not_4 |
set_io 0 |
; WRITE_GMII_REG 0x1F, 0x0001 |
; WRITE_GMII_REG 0x1b, 0x841e |
; WRITE_GMII_REG 0x0e, 0x7bfb |
757,7 → 741,9 |
je @f |
cmp [tpc.mcfg], MCFG_METHOD_03 |
jne .not_2_or_3 |
@@: WRITE_GMII_REG 0x1F, 0x0001 |
@@: |
set_io 0 |
WRITE_GMII_REG 0x1F, 0x0001 |
WRITE_GMII_REG 0x15, 0x1000 |
WRITE_GMII_REG 0x18, 0x65C7 |
WRITE_GMII_REG 0x04, 0x0000 |
850,14 → 836,16 |
|
mov edi, [tpc.RxDescArray] |
mov ecx, NUM_RX_DESC |
@@: |
stdcall KernelAlloc, 2048 |
mov [edi + rx_desc.buf_Haddr], eax |
GetRealAddr |
mov [edi + rx_desc.buf_addr], eax |
.loop: |
push ecx |
stdcall KernelAlloc, RX_BUF_SIZE |
mov [edi + rx_desc.buf_soft_addr], eax |
call GetPgAddr |
mov dword [edi + rx_desc.buf_addr], eax |
mov [edi + rx_desc.status], DSB_OWNbit or RX_BUF_SIZE |
add edi, rx_desc.size |
loop @b |
pop ecx |
loop .loop |
or [edi - rx_desc.size + rx_desc.status], DSB_EORbit |
|
ret |
972,6 → 960,7 |
|
call set_rx_mode |
|
set_io 0 |
; no early-rx interrupts |
set_io REG_MultiIntr |
in ax, dx |
993,7 → 982,7 |
set_io 0 |
set_io REG_MAC0 |
xor ecx, ecx |
lea esi, [device.mac] |
lea edi, [device.mac] |
mov ecx, MAC_ADDR_LEN |
|
; Get MAC address. FIXME: read EEPROM |
1048,15 → 1037,15 |
;--------------------------- |
; Program the packet pointer |
|
mov eax, [esp] |
mov [esi + tx_desc.buf_Haddr], eax |
mov eax, [esp + 4] |
mov [esi + tx_desc.buf_soft_addr], eax |
GetRealAddr |
mov [esi + tx_desc.buf_addr], eax |
mov dword [esi + tx_desc.buf_addr], eax |
|
;------------------------ |
; Program the packet size |
|
mov eax, [esp + 4] |
mov eax, [esp + 8] |
@@: or eax, DSB_OWNbit or DSB_FSbit or DSB_LSbit |
cmp [tpc.cur_tx], NUM_TX_DESC - 1 |
jne @f |
1076,7 → 1065,6 |
|
inc [tpc.cur_tx] |
and [tpc.cur_tx], NUM_TX_DESC - 1 |
|
ret 8 |
|
.fail: |
1109,6 → 1097,7 |
.nextdevice: |
mov ebx, dword [esi] |
|
set_io 0 |
set_io REG_IntrStatus |
in ax, dx |
|
1142,7 → 1131,8 |
|
DEBUGF 1,"RxDesc.status = 0x%x\n", [esi + rx_desc.status] |
|
test [esi + rx_desc.status], DSB_OWNbit |
mov eax, [esi + rx_desc.status] |
test eax, DSB_OWNbit ;;; |
jnz .rx_return |
|
DEBUGF 1,"tpc.cur_rx = %u\n", [tpc.cur_rx] |
1156,8 → 1146,16 |
push eax |
DEBUGF 1,"data length = %u\n", ax |
|
push [esi + rx_desc.buf_Haddr] |
push [esi + rx_desc.buf_soft_addr] |
|
;---------------------- |
; Allocate a new buffer |
|
stdcall KernelAlloc, RX_BUF_SIZE |
mov [esi + rx_desc.buf_soft_addr], eax |
GetRealAddr |
mov dword [esi + rx_desc.buf_addr], eax |
|
;--------------- |
; re set OWN bit |
|
1167,14 → 1165,6 |
or eax, DSB_EORbit |
@@: mov [esi + rx_desc.status], eax |
|
;---------------------- |
; Allocate a new buffer |
|
stdcall KernelAlloc, RX_BUF_SIZE |
mov [esi + rx_desc.buf_Haddr], eax |
GetRealAddr |
sub [esi + rx_desc.buf_addr], eax |
|
;-------------- |
; Update rx ptr |
|