forked from KolibriOS/kolibrios
Net-branch: Updates in dec21x4x.asm, still only works in virtual pc.
git-svn-id: svn://kolibrios.org@1503 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
ba3fb040e1
commit
cb55d99b40
@ -83,11 +83,11 @@ CSR7 equ 0x38 ; Interrupt enable
|
|||||||
CSR8 equ 0x40 ; Missed frames and overflow counter
|
CSR8 equ 0x40 ; Missed frames and overflow counter
|
||||||
CSR9 equ 0x48 ; Boot ROM, serial ROM, and MII management
|
CSR9 equ 0x48 ; Boot ROM, serial ROM, and MII management
|
||||||
CSR10 equ 0x50 ; Boot ROM programming address
|
CSR10 equ 0x50 ; Boot ROM programming address
|
||||||
;CSR11 General-purpose timer 0x58
|
CSR11 equ 0x58 ; General-purpose timer
|
||||||
CSR12 equ 0x60 ; General-purpose port
|
CSR12 equ 0x60 ; General-purpose port
|
||||||
CSR13 equ 0x68
|
CSR13 equ 0x68
|
||||||
;CSR14 Reserved 0x70
|
CSR14 equ 0x70
|
||||||
;CSR15 Watchdog timer 0x78
|
CSR15 equ 0x78 ; Watchdog timer
|
||||||
|
|
||||||
;--------bits/commands of CSR0-------------------
|
;--------bits/commands of CSR0-------------------
|
||||||
CSR0_RESET equ 1b
|
CSR0_RESET equ 1b
|
||||||
@ -276,7 +276,7 @@ CSR9_SROM_DI equ 1 SHL 2 ; Data In to SROM
|
|||||||
CSR9_SROM_CK equ 1 SHL 1 ; clock for SROM
|
CSR9_SROM_CK equ 1 SHL 1 ; clock for SROM
|
||||||
CSR9_SROM_CS equ 1 SHL 0 ; chip select.. always needed
|
CSR9_SROM_CS equ 1 SHL 0 ; chip select.. always needed
|
||||||
|
|
||||||
; assume dx is CSR9 (SROM port)
|
; assume dx is CSR9
|
||||||
macro SROM_Delay {
|
macro SROM_Delay {
|
||||||
push eax
|
push eax
|
||||||
in eax, dx
|
in eax, dx
|
||||||
@ -292,6 +292,13 @@ macro SROM_Delay {
|
|||||||
pop eax
|
pop eax
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; assume dx is CSR9
|
||||||
|
macro MDIO_Delay {
|
||||||
|
push eax
|
||||||
|
in eax, dx
|
||||||
|
pop eax
|
||||||
|
}
|
||||||
|
|
||||||
macro Bit_Set a_bit {
|
macro Bit_Set a_bit {
|
||||||
in eax, dx
|
in eax, dx
|
||||||
or eax, a_bit
|
or eax, a_bit
|
||||||
@ -742,6 +749,8 @@ reset:
|
|||||||
|
|
||||||
status
|
status
|
||||||
|
|
||||||
|
call start_link
|
||||||
|
|
||||||
|
|
||||||
; wait a bit
|
; wait a bit
|
||||||
mov esi, 3000
|
mov esi, 3000
|
||||||
@ -752,11 +761,22 @@ reset:
|
|||||||
|
|
||||||
call Send_Setup_Packet
|
call Send_Setup_Packet
|
||||||
|
|
||||||
set_io 0
|
xor eax, eax
|
||||||
status
|
; clear packet/byte counters
|
||||||
|
|
||||||
|
lea edi, [device.bytes_tx]
|
||||||
|
mov ecx, 6
|
||||||
|
rep stosd
|
||||||
|
|
||||||
DEBUGF 1,"Reset done\n"
|
DEBUGF 1,"Reset done\n"
|
||||||
xor eax, eax
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
align 4
|
||||||
|
start_link:
|
||||||
|
|
||||||
|
; TODO: write working code here
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -866,8 +886,6 @@ Send_Setup_Packet:
|
|||||||
dec [device.tx_free_des]
|
dec [device.tx_free_des]
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
wbinvd;;;
|
|
||||||
|
|
||||||
; start tx
|
; start tx
|
||||||
set_io 0
|
set_io 0
|
||||||
status
|
status
|
||||||
@ -942,12 +960,6 @@ transmit:
|
|||||||
; set descriptor info
|
; set descriptor info
|
||||||
mov [eax+DES.DES0], DES0_OWN ; say it is now owned by the 21x4x
|
mov [eax+DES.DES0], DES0_OWN ; say it is now owned by the 21x4x
|
||||||
|
|
||||||
DEBUGF 1,"TDES0: %x\n", [eax+DES.DES0]:8
|
|
||||||
DEBUGF 1,"TDES1: %x\n", [eax+DES.DES1]:8
|
|
||||||
DEBUGF 1,"TDES2: %x\n", [eax+DES.DES2]:8
|
|
||||||
DEBUGF 1,"TDES3: %x\n", [eax+DES.DES3]:8
|
|
||||||
|
|
||||||
|
|
||||||
; start tx
|
; start tx
|
||||||
set_io 0
|
set_io 0
|
||||||
status
|
status
|
||||||
@ -962,13 +974,15 @@ transmit:
|
|||||||
; if already started, issues a Transmit Poll command
|
; if already started, issues a Transmit Poll command
|
||||||
set_io CSR1
|
set_io CSR1
|
||||||
mov eax, -1
|
mov eax, -1
|
||||||
DEBUGF 1,"Sending transmit poll command\n"
|
|
||||||
.do_it:
|
.do_it:
|
||||||
out dx , eax
|
out dx , eax
|
||||||
status
|
|
||||||
|
|
||||||
|
; Update stats
|
||||||
|
|
||||||
wbinvd;;;;
|
inc [device.packets_tx]
|
||||||
|
mov eax, [esp+8]
|
||||||
|
add dword [device.bytes_tx], eax
|
||||||
|
adc dword [device.bytes_tx + 4], 0
|
||||||
|
|
||||||
; go to next descriptor
|
; go to next descriptor
|
||||||
inc [device.tx_wr_des]
|
inc [device.tx_wr_des]
|
||||||
@ -1450,6 +1464,239 @@ SROM_Read_Word:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;*********************************************************************
|
||||||
|
;* Media Descriptor Code *
|
||||||
|
;*********************************************************************
|
||||||
|
|
||||||
|
; MII transceiver control section.
|
||||||
|
; Read and write the MII registers using software-generated serial
|
||||||
|
; MDIO protocol. See the MII specifications or DP83840A data sheet
|
||||||
|
; for details.
|
||||||
|
|
||||||
|
; The maximum data clock rate is 2.5 Mhz. The minimum timing is usually
|
||||||
|
; met by back-to-back PCI I/O cycles, but we insert a delay to avoid
|
||||||
|
; "overclocking" issues or future 66Mhz PCI.
|
||||||
|
|
||||||
|
; Read and write the MII registers using software-generated serial
|
||||||
|
; MDIO protocol. It is just different enough from the EEPROM protocol
|
||||||
|
; to not share code. The maxium data clock rate is 2.5 Mhz.
|
||||||
|
|
||||||
|
MDIO_SHIFT_CLK equ 0x10000
|
||||||
|
MDIO_DATA_WRITE0 equ 0x00000
|
||||||
|
MDIO_DATA_WRITE1 equ 0x20000
|
||||||
|
MDIO_ENB equ 0x00000 ; Ignore the 0x02000 databook setting.
|
||||||
|
MDIO_ENB_IN equ 0x40000
|
||||||
|
MDIO_DATA_READ equ 0x80000
|
||||||
|
|
||||||
|
; MII transceiver control section.
|
||||||
|
; Read and write the MII registers using software-generated serial
|
||||||
|
; MDIO protocol. See the MII specifications or DP83840A data sheet
|
||||||
|
; for details.
|
||||||
|
|
||||||
|
align 4
|
||||||
|
mdio_read: ; phy_id:edx, location:esi
|
||||||
|
|
||||||
|
DEBUGF 1,"mdio read, phy=%x, location=%x", edx, esi
|
||||||
|
|
||||||
|
shl edx, 5
|
||||||
|
or esi, edx
|
||||||
|
or esi, 0xf6 shl 10
|
||||||
|
|
||||||
|
set_io 0
|
||||||
|
set_io CSR9
|
||||||
|
|
||||||
|
; if (tp->chip_id == LC82C168) {
|
||||||
|
; int i = 1000;
|
||||||
|
; outl(0x60020000 + (phy_id<<23) + (location<<18), ioaddr + 0xA0);
|
||||||
|
; inl(ioaddr + 0xA0);
|
||||||
|
; inl(ioaddr + 0xA0);
|
||||||
|
; while (--i > 0)
|
||||||
|
; if ( ! ((retval = inl(ioaddr + 0xA0)) & 0x80000000))
|
||||||
|
; return retval & 0xffff;
|
||||||
|
; return 0xffff;
|
||||||
|
; }
|
||||||
|
;
|
||||||
|
; if (tp->chip_id == COMET) {
|
||||||
|
; if (phy_id == 1) {
|
||||||
|
; if (location < 7)
|
||||||
|
; return inl(ioaddr + 0xB4 + (location<<2));
|
||||||
|
; else if (location == 17)
|
||||||
|
; return inl(ioaddr + 0xD0);
|
||||||
|
; else if (location >= 29 && location <= 31)
|
||||||
|
; return inl(ioaddr + 0xD4 + ((location-29)<<2));
|
||||||
|
; }
|
||||||
|
; return 0xffff;
|
||||||
|
; }
|
||||||
|
|
||||||
|
; Establish sync by sending at least 32 logic ones.
|
||||||
|
|
||||||
|
mov ecx, 32
|
||||||
|
.loop:
|
||||||
|
mov eax, MDIO_ENB or MDIO_DATA_WRITE1
|
||||||
|
out dx, eax
|
||||||
|
MDIO_Delay
|
||||||
|
|
||||||
|
or eax, MDIO_SHIFT_CLK
|
||||||
|
out dx, eax
|
||||||
|
MDIO_Delay
|
||||||
|
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
|
||||||
|
|
||||||
|
; Shift the read command bits out.
|
||||||
|
|
||||||
|
mov ecx, 1 shl 15
|
||||||
|
.loop2:
|
||||||
|
mov eax, MDIO_ENB
|
||||||
|
test esi, ecx
|
||||||
|
jz @f
|
||||||
|
or eax, MDIO_DATA_WRITE1
|
||||||
|
@@:
|
||||||
|
out dx, eax
|
||||||
|
MDIO_Delay
|
||||||
|
|
||||||
|
or eax, MDIO_SHIFT_CLK
|
||||||
|
out dx, eax
|
||||||
|
MDIO_Delay
|
||||||
|
|
||||||
|
shr ecx, 1
|
||||||
|
jnz .loop2
|
||||||
|
|
||||||
|
|
||||||
|
; Read the two transition, 16 data, and wire-idle bits.
|
||||||
|
|
||||||
|
xor esi, esi
|
||||||
|
mov ecx, 19
|
||||||
|
.loop3:
|
||||||
|
mov eax, MDIO_ENB_IN
|
||||||
|
out dx, eax
|
||||||
|
MDIO_Delay
|
||||||
|
|
||||||
|
shl esi, 1
|
||||||
|
in eax, dx
|
||||||
|
test eax, MDIO_DATA_READ
|
||||||
|
jz @f
|
||||||
|
inc esi
|
||||||
|
@@:
|
||||||
|
|
||||||
|
mov eax, MDIO_ENB_IN or MDIO_SHIFT_CLK
|
||||||
|
out dx, eax
|
||||||
|
MDIO_Delay
|
||||||
|
|
||||||
|
dec ecx
|
||||||
|
jnz .loop3
|
||||||
|
|
||||||
|
shr esi, 1
|
||||||
|
movzx eax, si
|
||||||
|
|
||||||
|
DEBUGF 1,", data=%x\n", ax
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
align 4
|
||||||
|
mdio_write: ;int phy_id: edx, int location: edi, int value: ax)
|
||||||
|
|
||||||
|
DEBUGF 1,"mdio write, phy=%x, location=%x, data=%x\n", edx, edi, ax
|
||||||
|
|
||||||
|
shl edi, 18
|
||||||
|
or edi, 0x5002 shl 16
|
||||||
|
shl edx, 23
|
||||||
|
or edi, edx
|
||||||
|
mov di, ax
|
||||||
|
|
||||||
|
set_io 0
|
||||||
|
set_io CSR9
|
||||||
|
|
||||||
|
; if (tp->chip_id == LC82C168) {
|
||||||
|
; int i = 1000;
|
||||||
|
; outl(cmd, ioaddr + 0xA0);
|
||||||
|
; do
|
||||||
|
; if ( ! (inl(ioaddr + 0xA0) & 0x80000000))
|
||||||
|
; break;
|
||||||
|
; while (--i > 0);
|
||||||
|
; return;
|
||||||
|
; }
|
||||||
|
|
||||||
|
; if (tp->chip_id == COMET) {
|
||||||
|
; if (phy_id != 1)
|
||||||
|
; return;
|
||||||
|
; if (location < 7)
|
||||||
|
; outl(value, ioaddr + 0xB4 + (location<<2));
|
||||||
|
; else if (location == 17)
|
||||||
|
; outl(value, ioaddr + 0xD0);
|
||||||
|
; else if (location >= 29 && location <= 31)
|
||||||
|
; outl(value, ioaddr + 0xD4 + ((location-29)<<2));
|
||||||
|
; return;
|
||||||
|
; }
|
||||||
|
|
||||||
|
|
||||||
|
; Establish sync by sending at least 32 logic ones.
|
||||||
|
|
||||||
|
mov ecx, 32
|
||||||
|
.loop:
|
||||||
|
mov eax, MDIO_ENB or MDIO_DATA_WRITE1
|
||||||
|
out dx, eax
|
||||||
|
MDIO_Delay
|
||||||
|
|
||||||
|
or eax, MDIO_SHIFT_CLK
|
||||||
|
out dx, eax
|
||||||
|
MDIO_Delay
|
||||||
|
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
|
||||||
|
|
||||||
|
; Shift the command bits out.
|
||||||
|
|
||||||
|
mov ecx, 1 shl 31
|
||||||
|
.loop2:
|
||||||
|
mov eax, MDIO_ENB
|
||||||
|
test edi, ecx
|
||||||
|
jz @f
|
||||||
|
or eax, MDIO_DATA_WRITE1
|
||||||
|
@@:
|
||||||
|
out dx, eax
|
||||||
|
MDIO_Delay
|
||||||
|
|
||||||
|
or eax, MDIO_SHIFT_CLK
|
||||||
|
out dx, eax
|
||||||
|
MDIO_Delay
|
||||||
|
|
||||||
|
shr ecx, 1
|
||||||
|
jnz .loop2
|
||||||
|
|
||||||
|
|
||||||
|
; Clear out extra bits.
|
||||||
|
|
||||||
|
mov ecx, 2
|
||||||
|
.loop3:
|
||||||
|
mov eax, MDIO_ENB
|
||||||
|
out dx, eax
|
||||||
|
MDIO_Delay
|
||||||
|
|
||||||
|
or eax, MDIO_SHIFT_CLK
|
||||||
|
out dx, eax
|
||||||
|
MDIO_Delay
|
||||||
|
|
||||||
|
dec ecx
|
||||||
|
jnz .loop3
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
; End of code
|
; End of code
|
||||||
|
|
||||||
align 4 ; Place all initialised data here
|
align 4 ; Place all initialised data here
|
||||||
|
Loading…
Reference in New Issue
Block a user