3c59x: enable RX/TX after enabling interrupts, not before.

git-svn-id: svn://kolibrios.org@3349 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2013-03-07 11:07:36 +00:00
parent 2c13dbe1c3
commit e4513c6c12

View File

@ -82,16 +82,16 @@
format MS COFF format MS COFF
API_VERSION = 0x01000100 API_VERSION = 0x01000100
DRIVER_VERSION = 5 DRIVER_VERSION = 5
MAX_DEVICES = 16 MAX_DEVICES = 16
FORCE_FD = 0 ; forcing full duplex mode makes sense at some cards and link types FORCE_FD = 0 ; forcing full duplex mode makes sense at some cards and link types
PROMISCIOUS = 0 ; enables promiscous mode PROMISCIOUS = 0 ; enables promiscous mode
DEBUG = 1 DEBUG = 1
__DEBUG__ = 1 __DEBUG__ = 1
__DEBUG_LEVEL__ = 1 __DEBUG_LEVEL__ = 1
include 'proc32.inc' include 'proc32.inc'
include 'imports.inc' include 'imports.inc'
@ -104,12 +104,12 @@ public version
struc DPD { ; Download Packet Descriptor struc DPD { ; Download Packet Descriptor
.next_ptr dd ? .next_ptr dd ?
.frame_start_hdr dd ? .frame_start_hdr dd ?
.frag_addr dd ? ; for packet data .frag_addr dd ? ; for packet data
.frag_len dd ? ; for packet data .frag_len dd ? ; for packet data
.realaddr dd ? .realaddr dd ?
.size = 32 .size = 32
} }
virtual at 0 virtual at 0
@ -119,11 +119,11 @@ end virtual
struc UPD { ; Upload Packet Descriptor struc UPD { ; Upload Packet Descriptor
.next_ptr dd ? .next_ptr dd ?
.pkt_status dd ? .pkt_status dd ?
.frag_addr dd ? .frag_addr dd ?
.frag_len dd ? ; for packet data .frag_len dd ? ; for packet data
.realaddr dd ? .realaddr dd ?
.size = 32 .size = 32
} }
@ -133,202 +133,202 @@ virtual at 0
end virtual end virtual
; Registers ; Registers
REG_POWER_MGMT_CTRL = 0x7c REG_POWER_MGMT_CTRL = 0x7c
REG_UP_LIST_PTR = 0x38 REG_UP_LIST_PTR = 0x38
REG_UP_PKT_STATUS = 0x30 REG_UP_PKT_STATUS = 0x30
REG_TX_FREE_THRESH = 0x2f REG_TX_FREE_THRESH = 0x2f
REG_DN_LIST_PTR = 0x24 REG_DN_LIST_PTR = 0x24
REG_DMA_CTRL = 0x20 REG_DMA_CTRL = 0x20
REG_TX_STATUS = 0x1b REG_TX_STATUS = 0x1b
REG_RX_STATUS = 0x18 REG_RX_STATUS = 0x18
REG_TX_DATA = 0x10 REG_TX_DATA = 0x10
; Common window registers ; Common window registers
REG_INT_STATUS = 0xe REG_INT_STATUS = 0xe
REG_COMMAND = 0xe REG_COMMAND = 0xe
; Register window 7 ; Register window 7
REG_MASTER_STATUS = 0xc REG_MASTER_STATUS = 0xc
REG_POWER_MGMT_EVENT = 0xc REG_POWER_MGMT_EVENT = 0xc
REG_MASTER_LEN = 0x6 REG_MASTER_LEN = 0x6
REG_VLAN_ETHER_TYPE = 0x4 REG_VLAN_ETHER_TYPE = 0x4
REG_VLAN_MASK = 0x0 REG_VLAN_MASK = 0x0
REG_MASTER_ADDRESS = 0x0 REG_MASTER_ADDRESS = 0x0
; Register window 6 ; Register window 6
REG_BYTES_XMITTED_OK = 0xc REG_BYTES_XMITTED_OK = 0xc
REG_BYTES_RCVD_OK = 0xa REG_BYTES_RCVD_OK = 0xa
REG_UPPER_FRAMES_OK = 0x9 REG_UPPER_FRAMES_OK = 0x9
REG_FRAMES_DEFERRED = 0x8 REG_FRAMES_DEFERRED = 0x8
REG_FRAMES_RCVD_OK = 0x7 REG_FRAMES_RCVD_OK = 0x7
REG_FRAMES_XMITTED_OK = 0x6 REG_FRAMES_XMITTED_OK = 0x6
REG_RX_OVERRUNS = 0x5 REG_RX_OVERRUNS = 0x5
REG_LATE_COLLISIONS = 0x4 REG_LATE_COLLISIONS = 0x4
REG_SINGLE_COLLISIONS = 0x3 REG_SINGLE_COLLISIONS = 0x3
REG_MULTIPLE_COLLISIONS = 0x2 REG_MULTIPLE_COLLISIONS = 0x2
REG_SQE_ERRORS = 0x1 REG_SQE_ERRORS = 0x1
REG_CARRIER_LOST = 0x0 REG_CARRIER_LOST = 0x0
; Register window 5 ; Register window 5
REG_INDICATION_ENABLE = 0xc REG_INDICATION_ENABLE = 0xc
REG_INTERRUPT_ENABLE = 0xa REG_INTERRUPT_ENABLE = 0xa
REG_TX_RECLAIM_THRESH = 0x9 REG_TX_RECLAIM_THRESH = 0x9
REG_RX_FILTER = 0x8 REG_RX_FILTER = 0x8
REG_RX_EARLY_THRESH = 0x6 REG_RX_EARLY_THRESH = 0x6
REG_TX_START_THRESH = 0x0 REG_TX_START_THRESH = 0x0
; Register window 4 ; Register window 4
REG_UPPER_BYTES_OK = 0xe REG_UPPER_BYTES_OK = 0xe
REG_BAD_SSD = 0xc REG_BAD_SSD = 0xc
REG_MEDIA_STATUS = 0xa REG_MEDIA_STATUS = 0xa
REG_PHYSICAL_MGMT = 0x8 REG_PHYSICAL_MGMT = 0x8
REG_NETWORK_DIAGNOSTIC = 0x6 REG_NETWORK_DIAGNOSTIC = 0x6
REG_FIFO_DIAGNOSTIC = 0x4 REG_FIFO_DIAGNOSTIC = 0x4
REG_VCO_DIAGNOSTIC = 0x2 ; may not supported REG_VCO_DIAGNOSTIC = 0x2 ; may not supported
; Bits in register window 4 ; Bits in register window 4
BIT_AUTOSELECT = 24 BIT_AUTOSELECT = 24
; Register window 3 ; Register window 3
REG_TX_FREE = 0xc REG_TX_FREE = 0xc
REG_RX_FREE = 0xa REG_RX_FREE = 0xa
REG_MEDIA_OPTIONS = 0x8 REG_MEDIA_OPTIONS = 0x8
REG_MAC_CONTROL = 0x6 REG_MAC_CONTROL = 0x6
REG_MAX_PKT_SIZE = 0x4 REG_MAX_PKT_SIZE = 0x4
REG_INTERNAL_CONFIG = 0x0 REG_INTERNAL_CONFIG = 0x0
; Register window 2 ; Register window 2
REG_RESET_OPTIONS = 0xc REG_RESET_OPTIONS = 0xc
REG_STATION_MASK_HI = 0xa REG_STATION_MASK_HI = 0xa
REG_STATION_MASK_MID = 0x8 REG_STATION_MASK_MID = 0x8
REG_STATION_MASK_LO = 0x6 REG_STATION_MASK_LO = 0x6
REG_STATION_ADDRESS_HI = 0x4 REG_STATION_ADDRESS_HI = 0x4
REG_STATION_ADDRESS_MID = 0x2 REG_STATION_ADDRESS_MID = 0x2
REG_STATION_ADDRESS_LO = 0x0 REG_STATION_ADDRESS_LO = 0x0
; Register window 1 ; Register window 1
REG_TRIGGER_BITS = 0xc REG_TRIGGER_BITS = 0xc
REG_SOS_BITS = 0xa REG_SOS_BITS = 0xa
REG_WAKE_ON_TIMER = 0x8 REG_WAKE_ON_TIMER = 0x8
REG_SMB_RXBYTES = 0x7 REG_SMB_RXBYTES = 0x7
REG_SMB_DIAG = 0x5 REG_SMB_DIAG = 0x5
REG_SMB_ARB = 0x4 REG_SMB_ARB = 0x4
REG_SMB_STATUS = 0x2 REG_SMB_STATUS = 0x2
REG_SMB_ADDRESS = 0x1 REG_SMB_ADDRESS = 0x1
REG_SMB_FIFO_DATA = 0x0 REG_SMB_FIFO_DATA = 0x0
; Register window 0 ; Register window 0
REG_EEPROM_DATA = 0xc REG_EEPROM_DATA = 0xc
REG_EEPROM_COMMAND = 0xa REG_EEPROM_COMMAND = 0xa
REG_BIOS_ROM_DATA = 0x8 REG_BIOS_ROM_DATA = 0x8
REG_BIOS_ROM_ADDR = 0x4 REG_BIOS_ROM_ADDR = 0x4
; Physical management bits ; Physical management bits
BIT_MGMT_DIR = 2 ; drive with the data written in mgmtData BIT_MGMT_DIR = 2 ; drive with the data written in mgmtData
BIT_MGMT_DATA = 1 ; MII management data bit BIT_MGMT_DATA = 1 ; MII management data bit
BIT_MGMT_CLK = 0 ; MII management clock BIT_MGMT_CLK = 0 ; MII management clock
; MII commands ; MII commands
MII_CMD_MASK = (1111b shl 10) MII_CMD_MASK = (1111b shl 10)
MII_CMD_READ = (0110b shl 10) MII_CMD_READ = (0110b shl 10)
MII_CMD_WRITE = (0101b shl 10) MII_CMD_WRITE = (0101b shl 10)
; MII registers ; MII registers
REG_MII_BMCR = 0 ; basic mode control register REG_MII_BMCR = 0 ; basic mode control register
REG_MII_BMSR = 1 ; basic mode status register REG_MII_BMSR = 1 ; basic mode status register
REG_MII_ANAR = 4 ; auto negotiation advertisement register REG_MII_ANAR = 4 ; auto negotiation advertisement register
REG_MII_ANLPAR = 5 ; auto negotiation link partner ability register REG_MII_ANLPAR = 5 ; auto negotiation link partner ability register
REG_MII_ANER = 6 ; auto negotiation expansion register REG_MII_ANER = 6 ; auto negotiation expansion register
; MII bits ; MII bits
BIT_MII_AUTONEG_COMPLETE = 5 ; auto-negotiation complete BIT_MII_AUTONEG_COMPLETE = 5 ; auto-negotiation complete
BIT_MII_PREAMBLE_SUPPRESSION = 6 BIT_MII_PREAMBLE_SUPPRESSION = 6
; eeprom bits and commands ; eeprom bits and commands
EEPROM_CMD_READ = 0x80 EEPROM_CMD_READ = 0x80
EEPROM_BIT_BUSY = 15 EEPROM_BIT_BUSY = 15
; eeprom registers ; eeprom registers
EEPROM_REG_OEM_NODE_ADDR = 0xa EEPROM_REG_OEM_NODE_ADDR= 0xa
EEPROM_REG_CAPABILITIES = 0x10 EEPROM_REG_CAPABILITIES = 0x10
; Commands for command register ; Commands for command register
SELECT_REGISTER_WINDOW = (1 shl 11) SELECT_REGISTER_WINDOW = (1 shl 11)
IS_VORTEX = 0x1 IS_VORTEX = 0x1
IS_BOOMERANG = 0x2 IS_BOOMERANG = 0x2
IS_CYCLONE = 0x4 IS_CYCLONE = 0x4
IS_TORNADO = 0x8 IS_TORNADO = 0x8
EEPROM_8BIT = 0x10 EEPROM_8BIT = 0x10
HAS_PWR_CTRL = 0x20 HAS_PWR_CTRL = 0x20
HAS_MII = 0x40 HAS_MII = 0x40
HAS_NWAY = 0x80 HAS_NWAY = 0x80
HAS_CB_FNS = 0x100 HAS_CB_FNS = 0x100
INVERT_MII_PWR = 0x200 INVERT_MII_PWR = 0x200
INVERT_LED_PWR = 0x400 INVERT_LED_PWR = 0x400
MAX_COLLISION_RESET = 0x800 MAX_COLLISION_RESET = 0x800
EEPROM_OFFSET = 0x1000 EEPROM_OFFSET = 0x1000
HAS_HWCKSM = 0x2000 HAS_HWCKSM = 0x2000
EXTRA_PREAMBLE = 0x4000 EXTRA_PREAMBLE = 0x4000
; Status ; Status
IntLatch = 0x0001 IntLatch = 0x0001
HostError = 0x0002 HostError = 0x0002
TxComplete = 0x0004 TxComplete = 0x0004
TxAvailable = 0x0008 TxAvailable = 0x0008
RxComplete = 0x0010 RxComplete = 0x0010
RxEarly = 0x0020 RxEarly = 0x0020
IntReq = 0x0040 IntReq = 0x0040
StatsFull = 0x0080 StatsFull = 0x0080
DMADone = 0x0100 DMADone = 0x0100
DownComplete = 0x0200 DownComplete = 0x0200
UpComplete = 0x0400 UpComplete = 0x0400
DMAInProgress = 0x0800 ; 1 shl 11 (DMA controller is still busy) DMAInProgress = 0x0800 ; 1 shl 11 (DMA controller is still busy)
CmdInProgress = 0x1000 ; 1 shl 12 (EL3_CMD is still busy) CmdInProgress = 0x1000 ; 1 shl 12 (EL3_CMD is still busy)
S_5_INTS = HostError + RxEarly + UpComplete + DownComplete ;+ TxComplete + RxComplete + TxAvailable S_5_INTS = HostError + RxEarly + UpComplete + DownComplete ;+ TxComplete + RxComplete + TxAvailable
; Commands ; Commands
TotalReset = 0 shl 11 TotalReset = 0 shl 11
SelectWindow = 1 shl 11 SelectWindow = 1 shl 11
StartCoax = 2 shl 11 StartCoax = 2 shl 11
RxDisable = 3 shl 11 RxDisable = 3 shl 11
RxEnable = 4 shl 11 RxEnable = 4 shl 11
RxReset = 5 shl 11 RxReset = 5 shl 11
UpStall = 6 shl 11 UpStall = 6 shl 11
UpUnstall = (6 shl 11)+1 UpUnstall = (6 shl 11)+1
DownStall = (6 shl 11)+2 DownStall = (6 shl 11)+2
DownUnstall = (6 shl 11)+3 DownUnstall = (6 shl 11)+3
RxDiscard = 8 shl 11 RxDiscard = 8 shl 11
TxEnable = 9 shl 11 TxEnable = 9 shl 11
TxDisable = 10 shl 11 TxDisable = 10 shl 11
TxReset = 11 shl 11 TxReset = 11 shl 11
FakeIntr = 12 shl 11 FakeIntr = 12 shl 11
AckIntr = 13 shl 11 AckIntr = 13 shl 11
SetIntrEnb = 14 shl 11 SetIntrEnb = 14 shl 11
SetStatusEnb = 15 shl 11 SetStatusEnb = 15 shl 11
SetRxFilter = 16 shl 11 SetRxFilter = 16 shl 11
SetRxThreshold = 17 shl 11 SetRxThreshold = 17 shl 11
SetTxThreshold = 18 shl 11 SetTxThreshold = 18 shl 11
SetTxStart = 19 shl 11 SetTxStart = 19 shl 11
StartDMAUp = 20 shl 11 StartDMAUp = 20 shl 11
StartDMADown = (20 shl 11)+1 StartDMADown = (20 shl 11)+1
StatsEnable = 21 shl 11 StatsEnable = 21 shl 11
StatsDisable = 22 shl 11 StatsDisable = 22 shl 11
StopCoax = 23 shl 11 StopCoax = 23 shl 11
SetFilterBit = 25 shl 11 SetFilterBit = 25 shl 11
; Rx mode bits ; Rx mode bits
RxStation = 1 RxStation = 1
RxMulticast = 2 RxMulticast = 2
RxBroadcast = 4 RxBroadcast = 4
RxProm = 8 RxProm = 8
; RX/TX buffers sizes ; RX/TX buffers sizes
MAX_ETH_PKT_SIZE = 1536 ; max packet size MAX_ETH_PKT_SIZE = 1536 ; max packet size
NUM_RX_DESC = 4 ; a power of 2 number NUM_RX_DESC = 4 ; a power of 2 number
NUM_TX_DESC = 4 ; a power of 2 number NUM_TX_DESC = 4 ; a power of 2 number
MAX_ETH_FRAME_SIZE = 1520 ; size of ethernet frame + bytes alignment MAX_ETH_FRAME_SIZE = 1520 ; size of ethernet frame + bytes alignment
virtual at ebx virtual at ebx
@ -739,7 +739,7 @@ reset:
in al, dx in al, dx
loop .loop loop .loop
; Get rid of stary ints ; Get rid of stray ints
set_io REG_COMMAND set_io REG_COMMAND
mov ax, AckIntr + 0xff mov ax, AckIntr + 0xff
out dx, ax out dx, ax
@ -761,24 +761,6 @@ reset:
;>>>>>>>>>>>>>>>>>> ;>>>>>>>>>>>>>>>>>>
set_io 0
set_io REG_COMMAND
mov ax, RxEnable
out dx, ax
mov ax, TxEnable
out dx, ax
set_io REG_COMMAND
mov ax, SetRxThreshold + 208
out dx, ax
mov ax, SetTxThreshold + 60 ;16 ; recommended by the manual :)
out dx, ax
mov ax, SELECT_REGISTER_WINDOW + 1
out dx, ax
xor eax, eax xor eax, eax
; clear packet/byte counters ; clear packet/byte counters
@ -850,6 +832,26 @@ start_device:
mov ax, SetIntrEnb + S_5_INTS mov ax, SetIntrEnb + S_5_INTS
out dx, ax out dx, ax
; Start RX/TX
set_io 0
set_io REG_COMMAND
mov ax, RxEnable
out dx, ax
mov ax, TxEnable
out dx, ax
set_io REG_COMMAND
mov ax, SetRxThreshold + 208
out dx, ax
mov ax, SetTxThreshold + 60 ;16 ; recommended by the manual :)
out dx, ax
mov ax, SELECT_REGISTER_WINDOW + 1
out dx, ax
ret ret